小车摄像头寻线程序C语言编写.doc

上传人:scccc 文档编号:13515710 上传时间:2022-01-13 格式:DOC 页数:20 大小:203.50KB
返回 下载 相关 举报
小车摄像头寻线程序C语言编写.doc_第1页
第1页 / 共20页
小车摄像头寻线程序C语言编写.doc_第2页
第2页 / 共20页
小车摄像头寻线程序C语言编写.doc_第3页
第3页 / 共20页
亲,该文档总共20页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《小车摄像头寻线程序C语言编写.doc》由会员分享,可在线阅读,更多相关《小车摄像头寻线程序C语言编写.doc(20页珍藏版)》请在三一文库上搜索。

1、#inelude include.h”#include math.huint8 SCI_Finish_Flag=O;uint8 DMA_Finish_Flag=O;unsigned char L_BlackEndL=O; unsigned char L_BlackEndM=O;unsigned char L_BlackEndR=O;unsigned char LL_BlackEndL=O; unsigned char LL_BlackEndM=O; unsigned char LL_BlackEndR=O;unsigned char *Source_image;unsigned int Tim

2、e;unsigned char Cross_Time;unsigned char Cross_flag;unsigned char FaChe=O;unsigned char kai_Start_Line=O;void Cross_Stop(void)if(Cross_flag=l)Cross_Time+; if(Cross_Time75)Cross_flag=0;void Start_TwoMiao(void)static unsigned char i=0; if(FaChe=l&Work_Mode=l) 讦(i150)FaChe=0;Work_Mode=0;/MotorPWM=1500;

3、Motor_Base=Speed_Base;void main(void)/uint32 count=0;/uint8 j=O,a=O;/uintl6 ADValue;/unsigned char cross_Recognition=0;Disablelnterrupts;Alljnit();En ablel nterrupts;enable_irq(87);/使能A I丨中断,A24场中断enableJrq(90);/使能 D I I中断,D6,D7 enable_irq(68);/定时器 0enable_irq(69); 定时器 1 LED_P8xl6Str(0/0;,000M);Excu

4、rsi on=0;Per_E=O;Last_Per_E=O;Motor_PWM=0;Time=0;Cross_Time=0;Cross_flag=0;/ if(gpio_get(PORTA,14)=l & gpio_get(PORTA,16)=l) 保守速度/Speed_Max=135;/Speed_Min=125;/straight_Speed=135;/elseif(gpio_get(PORTA,14)=0& gpio_get(PORTA,16)=l) 最人速度/Speed_Max=160;/Speed_Min=90;/straight_Speed=140;/elseif(gpio_get

5、(PORTA,14)=0& gpio_get(PORTA,16)=0 ) 中档速度/ /Speed_Max=150;/Speed_Min=140;/straight_Speed=140;/ /elseif(gpio_get(PORTA,14)=0 & gpio_get(PORTA,16)=0 )/Speed_Max=150;/Speed_Min=110;/straight_Speed=150;/for(;)/crossRecognitio n=0;#if Control_one讦(DMA_Finish_Flag=O) /DMA 传输完成gpio_ctrl(PORTAJ6,l); /ServoP

6、WM=5350;SCLFinish_Flag=l;Denoising(uc_FrameBuffer_Even0); 去噪EdgeDetection(uc_FrameBuffer_Even0,EdgeData0); 提取边缘Get_Edge(uc_FrameBuffer_EvenO);求边缘/sci();if(XuXian_Flag=l)/XuXian_Find(uc_FrameBuffer_EvenO);/sci();if(White-Row_End!=IMAGE_ROW-l & White_Row_End10)Cross_C onn ect();/sci();Edge_Filtering()

7、; 边缘滤波Edge_Repair();Cross(l);/SCI();/ if(cross_Recog nition !=1)/Repair_Edge();/New_Control();/Servo_PWM=5450;/Servo_PWM=4600;/Servo_PWM=6300;if(Work_Mode=0)/Motor_Control();Motor_PWM=2000;/Key();SCI();/Project();gpio_ctrl(PORTA6,0);AT_LED_P8xl6Str(30/0,L_Edge_Zero_StartRowl);AT_LED_P8xl6Str(620L_Ed

8、ge_Zero_Endl);AT_LED_P8xl6Str(30/2,R_Edge_Zero_StartRowl);AT_LED_P8xl6Str(622R_Edge_Zero_Endl);AT_LED_P8xl6Str(1042(L_Edge_Zero_StartRowl+L_Edge_Zero_Endl)/2);AT_LED_P8xl6Str(104A(R_Edge_ZeroStartRowl+R_Edge_Zero_Endl)/2);AT_LED_P8xl6Str_4wJnt(0,4/L_lnflexion_Slope_Value);AT_LED_P8xl6Str_4wJnt(4&4 丄

9、 eft_lnflexion_Point);AT_LED_P8xl6Str_4w_int(06Rnflexion_Slope_Value);AT_LED_P8xl6Str_4wJnt(48,6,RightJnflexion_Point);AT_LED_P8xl6Str(104QXuXian_Flag);AT_LED_P8xl6Str(1046Find_Base_Edge_Flag);SCI_Finish_Flag=O;DMA-Finish_Flag=2;#elif Con trol_twoif(lmageOverEven=TRUE)AT_LED_P8xl6Str_4w(486ADValue);

10、Source_image=uc_FrameBuffer_Even0; /gpio_ctrl(P0RTAz16,l);Denoising(uc_FrameBuffer_Even0); 去噪 EdgeDetection(uc_FrameBuffer_Even0zEdgeData0); 提取边缘 Get_Edge(uc_FrameBuffer_EvenO);求边缘if(XuXian_Flag=l)/XuXian_Find(uc_FrameBuffer_EvenO);if(White_Row_End!=IMAGE-ROW-l & White_Row_End10)Cross_C onn ect();Ed

11、ge_Filtering();边缘滤波Edge_Repair();Cross(l);if(cross_Recog nition !=1)/Repair_Edge();/Cross_Stop();New_Control();if(Work_Mode=0)Motor_Control();/Motor_PWM=1400;/Motor_PWM=DJ;Key();Start_TwoMiao();/Project();/SCI();/SCI 传输ImageOverEve n二 FALSE;gpio_ctrl(PORTA6,0);else if(lmageOverOdd=TRUE)/gpio_ctrl(PO

12、RTAz16,l);Sourceage=uc_FrameBuffer_Odd0;Denoising(uc_FrameBuffer_Odd0); 去噪EdgeDetection(uc_FrameBuffer_Odd0/EdgeData0); 提取边缘Get_Edge(uc_FrameBuffer_Odd0);求边缘if(XuXian_Flag=l)uart_sendstring(UARTOz (uint8 *)HWelcome to K60 ADC Examplern); uart_sendstring(UART0z(uint8 *)Preparing for ADC operate!rnM);

13、 uart_sendstring(UART0z(uint8 *)Start ADCOtaccuracy is 10.rnu);uart_sendstring(UART0,(uint8 *)Start ADC1taccuracy is 16.rnH);主循环 while(l)/I主循环计数到一定的值,使小灯的亮、暗状态切换run count+;if(runcount=10)light_change(Light_Run_PORTLight_Runl);/指示灯的亮、暗状态切换 run count=0;进行一次模块0通道16采样ADValue = ad_ave(0, ADchanneLlOJO);u

14、art_sendstring(UART0/(uint8 *),rnM);uart_sendnumber(UARTO/ ADValue);进行一次模块1通道16采样uart_sendstring(UART0,(uint8 *)ntM);ADValue = ad_ave(l, ADchannel,16z10);uart_sendnumber(UARTOz ADValue);#else#endif/Control C 文件#include include.hunsigned char ConRowSta=40;unsigned char ConRowEnd=60;unsigned short int

15、 Speed=100;按键unsigned char Button_work_flag=0;unsigned char Shake_Count=0;unsigned char Work_Button=0;unsigned char Work_Mode=l;保护unsigned char Project_Start=0;unsigned char Start_Count=0;/PID/float Kp=0.555;/float Kd=0.509;/float Kp=0.370;/float Kd=0.120;/float Kp=0.420;/float Kd=0.530;/float Kp=0.

16、300;/float Kd=1.900;float Kd=0.200;unsigned short int Motor_P=50;unsigned char MotorJ=l;unsigned char Motor_D=10;short int Speed_Output=0;有关刹车unsigned short int Speed_Base=O;unsigned short int DJ=3300;unsigned short int Speed_Max=100;unsigned short int Speed_Min=100;/Max 120 Min 100 稳定 十字还有问题Max 130

17、 Min 105稍微有点不稳unsigned char straight_Speed=100;unsigned char StaLine_delay=25;unsigned short int DuoJi_Goal=5520;unsigned char DuoJi_Value_Count=0;unsigned short int L_DuoJi_Goal=5520;signed short int DuoJi_Add=0;unsigned short int Change_error=800;void Key(void)static signed char order_num=0;static

18、 unsigned char temp=0;if(Work_Mode)if(Button_work_flag=0)if(Key_one=0)Butto n_ work_flag=l;else if(Key_two=0)Butt on _work_flag=2;else if(Key_three=O)Butt on _work_flag=3;else if(Key_four=0)Button _work_flag=4;elseif(Shake_Count3)Shake_Count=0; if(Button_work_flag=l) Button_work_flag=0; if(Key_one=0

19、)/while(!Key_one); Work_Button=l; order_ nu m+;if(order_num100) order_num=100;elseWork_Button=0;else if(Button_work_flag=2)Button_work_flag=0; if(Key_two=0)while(!Key_two);Work_Button=2;order_ num; if(order_ nu m8)key_display(5);temp=0;/key_display(5);void Project(void)if(Project_Start)if(Pulse=0)Mo

20、tor_PWM=0; Work_Mode=l; Project_Start=0;void button_debug_data(char orderzchar anniu_number)赛车数据按钮在线设置函数if(anniu_nu mber=3)加switch(order)i/case 1:Con RowSta+;break;/case 2:ConRowEnd+;break;/case 3: Speed+=10;break;/case 4:break;case 6:Kp+=O.O1;break;case 7:Kd+=O.O1;break;case 13: Speed_Base+=50;br(c

21、ase 9: Change_error+=50;break;/case 9: Motor_P+=l;break;case 11: MotorJ+=l;break;case 12: Motor_D+=l;break;/case 13: DJ+=1OO;break;case 3: Speed_Max+=5;break;case 2: Speed_Min+=5; break;case 4: straight_Speed+=5; break;case 1: St a Li ne_delay+=l;break;case 8: St a Li ne_zhi+=l;break;default:break;e

22、lse if(anniu_number=4)减switch(order)/case 1:Con RowSta-;break;/case 2:Con RowE nd;break;/ case 3:Speed-=10;break;/ case 4:break;case 6:Kp-=O.O1;break;case 7:Kd-=O.O1;break;case 13:Speed_Base-=50;break;case 9:Cha nge_error=50; break;/case 9:Motor_P-=l;break;case 11:MotorJ-=l;break;case 12:Motor_D-=l;

23、break;/case 13: DJ-1OO;break;case 3:Speed_Max-=5;break;case 2:Speed_Min-=5;break;case 4:straight_Speed-=5; break;case 1:StaLi ne_delay=l; break;case &St a Li ne_zhi=l;break;default:break;void key_display(unsigned char order)键盘显示函数AT_LED_P8xl6Str(OOorder);LED_P8xl6Str(0/2,nn);switch(order)/case 1: LE

24、D_P8xl6Str(0/2/,lConRowSta:,);AT_LED_P8xl6Str(80,2/ConRowSta);break;/case 2: LED_P8xl6Str(O2 ConRowEnd:J;AT_LED_P8xl6Str(802ConRowEnd);break;/case 3: LED_P8xl6Str(0/2/,Speed:,);Ar_LED_P8xl6Str_4w(48/2/Speed);break;case 5: LEDPaxlGStMON/Pulse:); AT_LED_P8xl6Str(48,2,Pulse);break;/case 5: LED_P8xl6Str

25、(&(Vx:”);LED_P8xl6Str(02,J;break;case6:LED_P8xl6Str(O2”Kp:J;AT_LEDP8xl6Str_4w_Float(24/2,(uintl6)(Kp*1000);break;case7:LED_P8xl6Str(O2”Kd:J;AT_LEDP8xl6Str_4w_Float(24/2,(uintl6)(Kd*1000);break;case13:AT-LED_P8xl6Str(88,2,Speed_Base);break;case9:AT_LED_P8xl6Str_4w(96/2,Change_error);break;case 11: LE

26、D_P8xl6Str(02”Motor:“);case12:AT_LED_P8xl6Str(642Motor_D);break;/case 13: LED_P8xl6Str(O2”DJ:J;case3:AT-LED_P8xl6Str_4w(80,2/Speed_Max);break;case2:AT-LED_P8xl6Str_4w(80,2/Speed_Min);break;case4:AT-LED_P8xl6Str_4w(80,2,straight_Speed);break;case1:AT_LED_P8xl6Str(104,2/StaLine_delay);break;LED_P8xl6S

27、tr(0/2/,Speed_Base:M);LED_P8xl6Str(0,2/,lChange_error11);AT_LED_P8xl6Str(64,2,MotorJ);break;LED_P8xl6Str(0,2Motor_D:“);AT_LED_P8xl6Str_4w(242DJ);break;LED_P8xl6Str(0/2,,Speed_Max:H);LED_P8xl6Str(0/2,,ISpeed_Min:M);LED_P8xl6Str(0/2/,zhLSpeed:M);LED_P8xl6Str(0/2/,StaLine-delayH);case 8:LED_P8xl6Str(02

28、”StaLin_zhiJ; LED-P8xl6Str(104/2,720H);AT_LED_P8xl6Str(802StaLine_zhi);break;/case & LED_P8xl6Str(&(Vx:“);LED_P8xl6Str(02,J;break;/case 9: LED_P8xl6Str(&(Vx:“);LED_P8xl6Str(02);break;/case 10: LED_P8xl6Str(8/0;,x:,);LED_P8xl6Str(0/2;,);break;default: LED_P8xl6Str(0,2/,1H); break;/*/void New_Control(

29、void)static short int Error=0zL_error=0;/LL_error=0static short int Output=5450;/,Last_Output=5350static short int Add=0;static unsigned char Count=0;if(Start_Line!=l)/Get_area_Error(ConRowSta,ConRowEnd/2/l);Get_area_Error(ConRowSta,C on RowE nct2J);if(Now_Message_error=l)Get_area_Error(ConRowSta/Co

30、nRowEnd/l,l);讦(Area_Sum1000 & Area_Sum100 & Area_Sum1000 & Area_SumChange_error)if(Cross_flag=l) Error=Area_Error;elseError=L_error;else Error=L_error;/+(L_error-LL_error);elseGet_area_Error(45/50,2z4);Error=Area_Error;Cou nt+;if(Count=100)Count=0;Start_Line=O;/Add=(shortint)(1.0*Kp*(Error-L_error)+

31、1.0*Kd*(Error-2*L_error+LL_error);/Output+=Add;Add=(shortint)(1.0*Kp*Error+1.0*Kd*(Error-L_error);Output=5450+Add;/LL_error=L_error;L_error=Error;if(0utput6300)(00mA(oLLJl(D4suel)En_osq【OHdluo)二 u 一 1OJZS(oUJlEsuel iu 一tolls)-oluoulp(Des【+1U n oolon - pl-0 n o &、(_eoD一ono IT_eoElmoncJllpplmoncl Tl_d

32、 泪辿/7sl/rNLLJllHlDlll_dH-nHrHIJJd 宀 vndlno 丄 eoDJonoCDS-CD Oom9 丄 PODJoncJ(ovlndlnolp 2ds)fpplp(D(DdsH+lndlnolpD(Dds 二oLLIlp(D(Ddsl-r,o3lp(DDds)*clloloz+o3lp(D(DdsdlolozHPPlpD(Ddsos-nd-u2(DdsHoLLJlp22dsoHPPlp(DDds iu 一 lovs OESoulndlnolpCDCDds -u 一 1OJZS ORP0HoIJJlpa)DdslT0HoLlJlp(DDds -u 一 lo-cs OQ

33、els(poA)oluoololo 乏 POA unnnnnnnunnunnnnnMTnnnnunnnnnnnununnu:pDDds I1-&-elsHPa)udsCDSO 宀fdluolHPoCDdsO)S-CD xezlpD(DdsHP(DDds (xel/llp(DDds:dlu(Dl)七(Dso c一 l/llp(DDdsHP(DDds (u-l/llp(D(Ddsvdlu(Dl)-xe 乏 lp(D(Dds+009mss9、(xe 乏peCDdsu 一三 lp(D(Dds)*03lD4suel*0LLJl(L)4suelHdlu(Dlstatic short int Speed_E

34、rror=0,L_Speed_Error=0,LL_Speed_Error=0; /static short int Speed_Output=0;static short int Speed_Add=O;Speed_Error=Speed-Pulse;/130Speed_Add=(short int)(Motor_P*1.0*(Speed_Error-L_Speed_Error)+MotorJ*1.0*Speed_Error+ Motor_D*1.0*(Speed_Error-2*L_Speed_Error+LL_Speed_Error);Speed_Output+=Speed_Add;if

35、(Speed_Output7490)Motor_PWM=7490;elseMotor_PWM=Speed_Output;LL_Speed_Error=L_Speed_Error;L_Speed_Error=Speed_Error;void Cross_Control(void)unsigned char Enter_Rowunsigned char Enter_Row_Max;unsigned char Out_Row_Min;unsigned char Out_Row_Max;unsigned char Area_Row=0;short int Cross_Area=0;Enter_Row_

36、Min=Min(Left_lnflexion_Point/Right_lnflexion_Point);E nte r_Ro w_M ax=M AX( Left _lnflexion_Point/Right_lnflexion_Point);0 ut_Row_M i n=M i n( L_Out_Crossnflexion,R_Out_Crossnflexio n); Out_Row_Max=MAX(L_Out_Cross_lnflexion/R_Out_CrossJnflexio n); if(Enter_Row_Max5)Area_Row+=Enter_Row_Min;Cross_Area

37、+=( Get_area_Error(l/Enter_Row_Min/l);if(Out_Row_MaxOut_Row_Max)Area_Row+=Enter_Row_Min-Out_Row_Max+l;Cross_Area+=( Get_area_Error(Out_Row_Max,Enter_Row_Min,l);elseArea_Row=0;Cross_Area=0;Servo_PWM=(int)( 4585+(64-Area_Row)/30)*Cross_Area);if(Servo_PWM5370)Servo_PWM=5370;LED_P6x8Str(0/3,,ICross_Area:M);if(Cross_Area=0)LED_P6x8Str(663”+J;elseLED_P6x8Str(663 叮);AT_LED_P6x8Str(72/3/(uintl6)Absolute(Cross_Area);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1