本文是小車的源程序代碼,其中包括許多諸如邊沿搜索、但雙線變換等算法。
mpc56045月9日改 02小車快速穩定
單片機源程序如下:
- /********************************************************
- 【平 臺】龍丘MPC多功能開發板
- 【編 寫】龍丘
- 【Designed】by Chiu Sir
- 【E-mail 】chiusir@yahoo.cn
- 【軟件版本】V1.0
- ------------------------------------------------
- 【dev.env.】Code Warrior 2.9
- 【Target 】MPC5604B/P
- 【內部晶振】 khz
- 【外部晶振】8MHz
- 【總線頻率】64MHz
- ************************
- 更改:未給Image取值 0x00
- *************************
- ** ---PC3 場中斷 EIRQ[6] 中斷處理函數 External_IRQ_0()
- ** --PE12 場中斷 EIRQ[11] 中斷處理函數 External_IRQ_1()
- ** ---A7 攝像頭數據口 */
- //電機PA5,PA6,PA10,PA11
- //舵機PA9
- //攝像頭行中斷PC3,場中斷E12,數據A7
- //串口TX0:PB2 RX0:PB3
- //編碼器測速PA1,PA2,PA3,PA4
- //紅外引腳PE4,PE10
- #include "includes.h"
- void ALL_init();
- void delay_ms1(int ms);
- //------------------采集數組-------------------------//
- uint8 Image[60][70]={0};
- //-----------------加權處理數組----------------------//
- uint8 Standard[MAXLINE]={
-
- 1 , 1 , 1 ,1 ,1 ,1 , 1 ,1 ,1 ,1 ,
- 2 , 2 , 2 ,2 ,3 ,3 , 3 ,3 ,4 ,4 ,
- 4 , 4 , 5 ,5 ,5 ,5 , 4 ,4 ,4 ,4 ,
- 3 , 3 , 3 ,3 ,3 ,3 , 3 ,3 ,3 ,3 ,
- 2 , 2 , 2 ,2 ,2 ,2 , 2 ,1 ,1 ,1 ,
- 1 , 1 , 1 ,1 ,1 ,1 , 1 ,1 ,0 ,0 ,
-
-
- //0 , 1 , 1 ,1 ,1 ,1 , 1 ,1 ,1 ,1 ,
- //2 , 2 , 3 ,3 ,3 ,3 , 4 ,4 ,4 ,4 ,
- //4 , 4 , 5 ,5 ,5 ,6 , 6 ,6 ,6 ,5 ,
- //4 , 4 , 4 ,3 ,3 ,3 , 3 ,2 ,2 ,2 ,
- //1 , 1 , 1 ,1 ,1 ,1 , 1 ,1 ,1 ,1 ,
- // 1 , 1 , 1 ,1 ,1 ,1 , 1 ,0 ,0 ,0 ,
-
-
- // 1 , 1 , 1 ,1 ,1 ,1 , 1 ,1 ,1 ,1 ,
- // 2 , 2 , 2 ,2 ,3 ,3 , 3 ,3 ,4 ,4 ,
- // 4 , 4 , 5 ,5 ,5 ,5 , 4 ,4 ,4 ,4 ,
- // 3 , 3 , 3 ,3 ,3 ,2 , 2 ,2 ,2 ,2 ,
- // 1 , 1 , 1 ,1 ,1 ,1 , 1 ,1 ,1 ,1 ,
- // 1 , 1 , 1 ,1 ,1 ,1 , 1 ,0 ,0 ,0 , };
- };
- //-----------------行中線處理數組------------------------//
- uint16 left_d[MAXCOLUM+1],right_d[MAXCOLUM+1],center_one[MAXCOLUM+1];
- uint16 left_d2[MAXCOLUM+1],right_d2[MAXCOLUM+1],center_one2[MAXCOLUM+1];
- //-----------------舵機PD處理變量-----------------------//
- uint16 duoji=ANGLE_M;
- int center_ave=0;
- uint16 dis_num=0;
- float dismid=0, dismid_d01=0,dismid_d02=0,dismid_error01=0,dismid_error02=0,dismid_error03=0;
- int center_all=0;
- //----------------電機PD,編碼器測速處理變量-------------//
- uint32_t tmp1,tmp2,tmp3,tmp4, pwm_tmp_R=0,pwm_tmp_L=0;
- uint32_t now_speed_L,now_speed_R;
- float Rd_error=0,Rdd_error=0,Rerror=0,Rspeed_ept=0,Rpre_error=0,Rpre_pre_error=0,Ld_error=0,Ldd_error=0,Lerror=0,Lspeed_ept=0,Lpre_error=0,Lpre_pre_error=0,Setept1=90,Setept2=90;
- //----------------撥碼按鍵變量-------------------------//
- int ck;
- uint8 Boma; //撥碼14,13顯示圖像 撥碼12顯示舵機 按鍵值 撥碼11顯示左中右數組值
- int8 key2=30,key1=10;
- uint8 deal_hang_flag=0;
- int clki,clkj;
- void main (void)
- {
-
-
-
- ALL_init();
- LCD_init();
- GPIO_init(PORT_A,12,1,0,0,1);
- GPIO_init(PORT_A,13,1,0,0,1);
- GPIO_init(PORT_A,14,1,0,0,1);
-
-
- /*---------按鍵 撥碼引腳初始化-------*/
- GPIO_init(PORT_E,0,0,1,1,1);
- GPIO_init(PORT_E,1,0,1,1,1);
- GPIO_init(PORT_E,2,0,1,1,1);
- GPIO_init(PORT_E,3,0,1,1,1);
- //給預中間值賦值
- for( ck=0;ck<MAXCOLUM;ck++)
- {
- center_one[ck]=34;
- center_one2[ck]=34;
- }
-
- for(ck=0;ck<=MAXLINE;ck++)
- {
- left_d[ck]=7;
- right_d[ck]=MAXCOLUM-9;
- left_d2[ck]=7;
- right_d2[ck]=MAXCOLUM-9;
- //給每一行的第一個數和最后一個數賦值,第一個為0 最后一個為最大列數
- }
- /* Boma=(((GPIO_get(PORT_E,0)&0x01)|(GPIO_get(PORT_E,1)&0x01)<<1)|((GPIO_get(PORT_E,2)&0x01)<<2)|((GPIO_get(PORT_E,3)&0x01)<<3))&0xff;
- if(Boma==0) //安全期望
- {
- Setept1=90;
- Setept2=70;
- }
-
- else if(Boma==1) //中速期望
- {
- Setept1=90;
- Setept2=80;
- }
- else if(Boma==2) //沖擊速度
- {
- Setept1=90;
- Setept2=90;
- }*/
-
- while(1)
- {
- //GPIO_set(PORT_A, 13, 1);
- Boma=(((GPIO_get(PORT_E,0)&0x01)|(GPIO_get(PORT_E,1)&0x01)<<1)|((GPIO_get(PORT_E,2)&0x01)<<2)|((GPIO_get(PORT_E,3)&0x01)<<3))&0xff;
- Lcd();
-
- if(deal_hang_flag==1)
- {
- Show();
- deal_hang_flag=0;
- }
- Deal_First_Center();
- CalculateSoverAngle();
- CalculateSpeed();
- //GPIO_set(PORT_A, 13, 0);
- //GPIO_set(PORT_A, 14, 1);
-
- }
- }
-
- //-----------------------初始化設置總函數-------------------------//
- void ALL_init()
- {
-
- //----------系統時鐘、中斷初始化部分-------------
- initModesAndClock(); // MPC56xxP/B/S: Initialize mode entries, set sysclk = 64MHz
- disableWatchdog(); // Disable watchdog
- GPIO_init(PORT_A,9,1,0,0,0);
- GPIO_init(PORT_C,3, 0,0,0,0); //行中斷C3
- GPIO_init(PORT_E,12,0,0,0,0); //場中斷E7
- GPIO_init(PORT_A,7, 0,0,0,0); //初始化輸入管腳A7數據位
- //----------初始化電機舵機-------------*/
- Emios_0_Init(16); // 將PLL系統時鐘/16送到EMIOS0模塊 64/16=4MHz
- Emios_0_initMcb(23, 400,1); //電機周期100us
- Emois_0_initOPWM(5, 400, 400,BUS_A); //占空比1/4
- Emois_0_initOPWM(6, 400, 400,BUS_A);
- Emois_0_initOPWM(10, 400, 400,BUS_A);
- Emois_0_initOPWM(11, 400, 400,BUS_A);
- Emios_0_initMcb(8, 20000,8); //舵機周期20ms
- Emois_0_initOPWM(9, 18516,20000,BUS_C); //舵機中值18520,左偏最大值18355,右偏最大值 18670
- //----------- 電機測速 反饋初始化 ---------
- vfnInit_Emios_0_MC_1(); // ALLOW pec 模數輸入模式的行當的啦
- vfnInit_Emios_0_MC_2();
- vfnInit_Emios_0_MC_3();
- vfnInit_Emios_0_MC_4();
- PIT_init(0,5000,1); //定時器0初始化 Initialize PIT1 for 1KHz IRQ, priority 2
- //ADC_init(ANS0); //ANS0通道初始化,ANS0,ANS1,ANS2可用
- initINTC(); // Initialize INTC for software vector mode
- EIRQ_init(6,2,3); //使能外部中斷6 PC3 行中斷
- EIRQ_init(11,2,3); //使能外部中斷11 PE12 場中斷
- // UART_init(UART0,9600,1);
- //--------------------允許中斷------------------//
- EnableIrq(); //使能中斷打開
- }
復制代碼
所有資料51hei提供下載(完整源碼):
第十屆飛思卡爾智能汽車競賽省賽程序.rar
(271.72 KB, 下載次數: 19)
2017-10-24 08:52 上傳
點擊文件名下載附件
100 下載積分: 黑幣 -5
|