標(biāo)題:
17年電賽板球系統(tǒng)STM32源程序
[打印本頁]
作者:
15621048596
時間:
2019-8-15 22:49
標(biāo)題:
17年電賽板球系統(tǒng)STM32源程序
之前準(zhǔn)備電賽的時候,找滾球的程序很費(fèi)勁,找了很久終于找到一個不收費(fèi)的了
板球系統(tǒng)網(wǎng)上的標(biāo)配是:
stm32f4+ov2640或7725或7760+液晶彩屏(方便調(diào)試),具體的我就不在贅述了,網(wǎng)上帖子很多,這里單純的分享資源,希望方便有需要的人,
系統(tǒng)基于原子的探索者f4+ov2640,軟件二值化.
單片機(jī)源程序如下:
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "usmart.h"
#include "usart2.h"
#include "timer.h"
#include "ov2640.h"
#include "dcmi.h"
#include "string.h"
#include "pwm.h"
u16 rgb_buf[144][176];
u16 gray,Have=0,SY=0,time=0;
extern u8 flag;
u16 hang=0,time1=0;
u8 X_MAX,Y_MAX=0; //小球的坐標(biāo)信息
u8 X_MAX_LSAT, X_MIN_LSAT, Y_MAX_LSAT, Y_MIN_LSAT=0; //上一次小球坐標(biāo)位置信息
u8 X,Y=0; //小球的質(zhì)心信息
u8 X_MIN,Y_MIN=180;
unsigned char ax,ay;
int PWM_X,PWM_Y=0;
float Err_X,Err_Y=0;
float Err_X_LAST,Err_Y_LAST=0;
float Aim_X,Aim_Y=0;
float Kp,Ki,Kd=0;
//ALIENTEK 探索者STM32F407開發(fā)板 實驗35
//攝像頭 實驗 -庫函數(shù)版本
//技術(shù)支持:www.openedv.com
//淘寶店鋪:http://eboard.taobao.com
//廣州市星翼電子科技有限公司
//作者:正點原子 @ALIENTEK
//JPEG尺寸支持列表
const u16 jpeg_img_size_tbl[][2]=
{
176,144, //QCIF
160,120, //QQVGA
352,288, //CIF
320,240, //QVGA
640,480, //VGA
800,600, //SVGA
1024,768, //XGA
1280,1024, //SXGA
1600,1200, //UXGA
};
void TIM3_Int_Init(u16 arr,u16 psc);
u16 getcolor2(u16 tx,u16 ty) //從LCD讀點,轉(zhuǎn)化為灰度值
{
u16 i,tempcolor,R,G,B,avr;
tempcolor=LCD_ReadPoint(tx,ty);
R = (int) ((tempcolor>>11) * 255.0 / 31.0 + 0.5);
G = (int) ((tempcolor>>5&0x3f) * 255.0 / 63.0 + 0.5);
B = (int) ((tempcolor&0x1f) * 255.0 / 31.0 + 0.5);
avr=(R * 19595 + G * 38469 + B * 7472) >> 16;
return avr;
}
void search(void)
{
unsigned char tx,ty,avr[162][134];
ax=0;
ay=0;
for(tx=8;tx<162;tx+=3){
for(ty=10;ty<134;ty+=3){
if(getcolor2(tx,ty)==255) //當(dāng)前點為白色
{
if(getcolor2(tx-1,ty-1)==255 &&getcolor2(tx+1,ty+1)==255 &&getcolor2(tx-1,ty+1)==255 && getcolor2(tx+1,ty-1)==255 ){
ax=tx/176.0*58;
ay=ty/144.0*48;
}
}
}
}
// if(ax==0&&ay==0){
// ax=29;
// ay=25;
// }
}
//t最佳閾值,w0背景比例,u0背景均值,w1前景比例,u1前景均值,u整幅圖像的均值
u16 GetThreshValue(void)
{
int pixelNum[256];//圖像直方圖 共256點
u16 i,j,color;
int n, n1, n2;
int total;//total為總和
double m1, m2, sum, csum, fmax, sb;//sb類間房差,fmax存儲最大方差值
int k, t, q;
int threshValue =1;// 閾值
for(i=0; i<144; i+=3){
for(j=0; j<176; j+=3){
color=getcolor2(i,j);//返回各個點的顏色
pixelNum[color]++;//相應(yīng)直方圖+1
}
}
//直方圖平滑化
for(k=0; k<=255; k++){
total =0;
for(t =-2; t <=2; t++){//附近兩個灰度做平滑化
q = k + t;
if(q <0)//越界處理
q =0;
if(q >255)
q =255;
total = total + pixelNum[q];//total為總和,累計值
}
//平滑化,左邊兩個+中間1個+右邊兩個
pixelNum[k]=(int)((float)total /5.0+0.5);
}
//求閾值
sum = csum =0.0;
n =0;
//求總的圖像的點數(shù)和質(zhì)量矩
for(k =0; k <=255; k++){
//x*f(x)每個灰度的值*其點數(shù)(歸一化后為概率)
sum +=(double)k *(double)pixelNum[k];
n += pixelNum[k];//n總點數(shù),歸一化后為累積概率
}
fmax =-1.0;//sb不可能為負(fù)
n1 =0;
for(k =0; k <255; k++){//計算一次分割后的sb
n1 += pixelNum[k];//n1為在當(dāng)前閾值遍前景圖像的總數(shù)
if(n1 ==0){continue;}//沒有分出前后景
n2 = n - n1;//n2為背景圖像的點數(shù)
//n2=0為全后景圖
if(n2 ==0){break;}
csum +=(double)k * pixelNum[k];//前景的灰度值*點數(shù) 的總和
m1 = csum / n1;//m1前景的平均灰度
m2 =(sum - csum)/ n2;//m2背景的平均灰度
sb =(double)n1 *(double)n2 *(m1 - m2)*(m1 - m2);//sb類間方差
if(sb > fmax){//此次類方差>前一次類方差
fmax = sb;//取最大值
threshValue = k;//返回閾值
}
}
return threshValue;
}
void senddata(void)
{
USART_SendData(USART2,(ax&0x3f));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
USART_SendData(USART2,(ay|0xc0));
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)!=SET);
}
int main(void)
{
u16 i,j;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置系統(tǒng)中斷優(yōu)先級分組2
delay_init(168); //初始化延時函數(shù)
uart_init(115200); //初始化串口波特率為115200
usart2_init(42,9600); //初始化串口2波特率為115200
//LED_Init(); //初始化LED
LCD_Init(); //LCD初始化
//KEY_Init(); //按鍵初始化
TIM3_Int_Init(10000-1,8400-1);//10Khz計數(shù),1秒鐘中斷一次
//TIM14_PWM_Init(10000-1,168-1); //重裝載值10000,所以PWM頻率為 150hz. //舵機(jī)預(yù)留
//TIM11_PWM_Init(10000-1,336-1); //重裝載值10000,所以PWM頻率為 150hz.
//usmart_dev.init(84); //初始化USMART
OV2640_Init();
OV2640_OutSize_Set(176,144);
// OV2640_Light_Mode(0); //白平衡設(shè)置 自動
// OV2640_Auto_Exposure(0); //自動曝光
// OV2640_Color_Saturation(2); //色度設(shè)置
// OV2640_Brightness(0); //亮度設(shè)置
OV2640_Contrast(4); //對比度設(shè)置
// OV2640_Special_Effects(2); //黑白化
OV2640_RGB565_Mode(); //RGB565模式
My_DCMI_Init(); //DCMI配置
DCMI_DMA_Init((u32)rgb_buf,sizeof(rgb_buf)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置
DCMI_Start(); //啟動傳輸
while(1)
{
LCD_SetCursor(0,0);
LCD_WriteRAM_Prepare(); //開始寫入GRAM
for(i=0;i<150;i++){
for(j=0;j<176;j++){
if(j==175){
LCD_SetCursor(0,i+1);
LCD_WriteRAM_Prepare(); //開始寫入GRAM
}
gray=((rgb_buf[i][j]>>11)*19595+((rgb_buf[i][j]>>5)&0x3f)*38469 +(rgb_buf[i][j]&0x1f)*7472)>>16;
//gray=((rgb_buf[i][j]>>5)&0x3f)* 255.0 / 63.0 + 0.5;
if(gray >23){
// if(i>8&&i<136&&j<160&&j>16){
// if(i>X_MAX) X_MAX=i;
// if(i<X_MIN) X_MIN=i;
// if(j>Y_MAX) Y_MAX=j;
// if(j<Y_MIN) Y_MIN=j;
// }
LCD->LCD_RAM=WHITE;
}
else{
LCD->LCD_RAM=BLACK;
}
}
}
// X_MAX_LSAT = X_MAX; //更新pid的real坐標(biāo)信息 清除掉本次坐標(biāo)用于再次遍歷最大值 最小值
// X_MIN_LSAT = X_MIN;
// Y_MAX_LSAT = Y_MAX;
// Y_MIN_LSAT = Y_MIN;
//
// X_MAX=0;
// X_MIN=180;
// Y_MAX=0;
// Y_MIN=180;
//
// X=(X_MAX_LSAT+X_MIN_LSAT)/2;
// Y=(Y_MAX_LSAT+Y_MIN_LSAT)/2;
// TIM_SetCompare1(TIM14,9340); //修改比較值,修改占空比
// TIM_SetCompare1(TIM11,9300); //修改比較值,修改占空比
search();
LCD_ShowxNum(30,210,ax,3,16,0);
LCD_ShowxNum(30,230,ay,3,16,0);
if(Have==1){
senddata();
if( ((ax==29||ax==28||ax==30)&&(ay==7||ay==8||ay==9)) || ((ax==11||ax==12||ax==13)&&(ay==7||ay==8||ay==9)) || ((ax==30||ax==31||ax==29)&&(ay==26||ay==27)) )
SY=1;
else{
SY=0;
}
}
else{
time1=0;
}
LCD_ShowxNum(80,210,time,3,16,0);//顯示當(dāng)前時間
LCD_ShowxNum(80,230,time1,3,16,0);//區(qū)域2停留的時間
}
}
void TIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中斷
{
if(Have==1){
time++;
if(time>60)
time=0;
}
if(SY==1){
time1++;
}
if(SY==0)
time1=0;
Kp=3.4;
Kd=80.9;
Aim_X=72;
Aim_Y=88;
Err_X=X-Aim_X;
Err_Y=Y-Aim_Y;
PWM_X=9340+(Err_X*Kp+(Err_X-Err_X_LAST)*Kd);
PWM_Y=9300+(Err_Y*Kp+(Err_Y-Err_Y_LAST)*Kd);
if(PWM_Y>9370)PWM_Y=9370;
if(PWM_Y<9230)PWM_Y=9230;
if(PWM_X>9410)PWM_X=9410;
if(PWM_X<9270)PWM_X=9270;
Err_X_LAST=Err_X;
Err_Y_LAST=Err_Y;
TIM_SetCompare1(TIM14,PWM_X); //修改比較值,修改占空比
TIM_SetCompare1(TIM11,PWM_Y); //修改比較值,修改占空比
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中斷標(biāo)志位
}
復(fù)制代碼
所有資料51hei提供下載:
實驗板球系統(tǒng).7z
(375.89 KB, 下載次數(shù): 56)
2019-8-16 21:26 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1