研究目標: 通過攝像頭提取道路圖像,并進行圖像轉換與處理,利用編碼器采樣小車速度,研究采用雙環PID控制方法對小車進行控制,使智能小車能自動探尋軌跡,并能避障快速精準運行。結合K60芯片所提供的驅動方式,我們選擇了PWM(Pulse Width Modulation)控制模式來控制電機的速度。簡稱脈寬調制,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。脈沖寬度調制的一個優點是從處理器到被控系統信號都是數字形式的,無需進行數模轉換。
K60 IAR配置文件
Flash的配置:
0.png (131.99 KB, 下載次數: 142)
下載附件
2017-5-9 01:06 上傳
0.png (56.71 KB, 下載次數: 154)
下載附件
2017-5-9 01:06 上傳
0.png (50.38 KB, 下載次數: 136)
下載附件
2017-5-9 01:07 上傳
飛思卡爾源碼:
- /******************** (C) COPYRIGHT 2017 藍宙電子工作室 ********************
- * 文件名 :main.c
- * 描述 :工程模版實驗
- *
- * 實驗平臺 :landzo電子開發版
- * 庫版本 :
- * 嵌入系統 :
- * CCD的PIN定義
- ADC1_SE6b -- PTC10
- CLK_ClrVal() PTE5_OUT = 0
- SI_SetVal() PTE4_OUT = 1
- * 作者 :野火嵌入式開發工作室/landzo 藍電子
- 200 200 10 0.3 0 0.3 4 1 1.5 t=15.3
- **********************************************************************************/
- #include "include.h"
- #include "calculation.h"
- /*************************
- 設置系統的全局變量
- *************************/
- #define M 1 // 8 // 10 //差速參數關系
- #define W 13.8 //車寬
- #define L 40 //車長的兩倍------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- #define SteeringEngine_mid 120
- #define SteeringEngine_Max 135//136
- #define SteeringEngine_Min 103//103(106很好)
- #define Motor_n_max 700
- #define Motor_n_min 100
- extern float K; //1.5// 2.3 //差速參數關系
- extern s16 Motor_n_Direct ;//450; //250; //250;//305; //直道轉速
- extern s16 Motor_n_Curve_1 ; //400;// 250;// 250;//305 ; //彎道轉速
- extern s16 Motor_n_Curve_2; //350;// 250;// 250;//305 ; //彎道轉速
- extern s16 Motor_n_Curve_3 ;//300;// 250;// 250;//305 ; //彎道轉速
- extern u8 TIME0flag_5ms ;
- extern u8 TIME0flag_10ms ;
- extern u8 TIME0flag_15ms ;
- extern u8 TIME0flag_20ms ;
- extern u8 TIME1flag_20ms ;
- extern u8 TIME1flag_1ms ;
-
- extern u8 TimerFlag20ms;
- u16 pwm_l=0;
- u16 pwm_r=0;
- extern u16 pwmtest_l;
- extern u16 pwmtest_r;//左右輪pwm計數值
- u16 pwmset_l;
- u16 pwmset_l;
- u16 Motor_Pwm=0;
- s16 Motor_Pwm_l;
- s16 Motor_Pwm_r; //左右輪速度設定值(PWM占空比)
- u16 Motor_n;
- extern u16 Motor_n_l;
- extern u16 Motor_n_r; //左右輪轉速設定值(相對編碼器)
- u8 AtemP ;
- u8 Pixel[128];
- s16 bai_dian_sum=0;
- s16 bai_dian_num=0;
- s16 bai_dian_num_l=0;
- s16 bai_dian_num_r=0;
- s16 hei_dian_num_l=0;
- s16 hei_dian_num_r=0;
- s32 Center;
- s32 Center_car=68;//64+4;
- u8 FAVAULE;
- u8 FAVAULE_max;
- u8 FAVAULE_min;
- extern float SteeringEngine_Kp;
- extern float SteeringEngine_Ki;
- extern float SteeringEngine_Kd;
- extern float A1;
- extern float SteeringEngine_Kp_W;
- extern float SteeringEngine_Ki_W;
- extern float SteeringEngine_Kd_W;
- extern float A1_W;
- s32 e[3]={0 , 0 , 0};
- //s32 e_flag[150]={0};
- u8 e_flag_sum;
- s16 SteeringEngine_e ;
- extern float Motor_Kp;
- extern float Motor_Ki;
- extern float Motor_Kd;
- s16 e_n[3]={0 , 0 , 0};
- s16 e_l[3]={0 , 0 , 0};
- s16 e_r[3]={0 , 0 , 0};
- u16 SteeringEngine= 120;
- float tan_a;
- u8 W_flag;
- u8 L_flag;
- u8 R_flag;
-
- void main()
- {
- u8 i ,n=0 ;
- int sign(),abs();
- // u8 Pixel_pt[128];
-
- //u8 send_data_cnt = 0;
- DisableInterrupts; //禁止總中斷
-
- /*********************************************************
- 初始化程序
- *********************************************************/
- //自行添加代碼
-
- uart_init (UART3, 115200); //初始化UART3,輸出腳PTC17,輸入腳PTC16,串口頻率 115200
- // adc_init(ADC1, AD6a) ;
-
- gpio_init (PORTB,4, GPI_UP,1);
- gpio_init (PORTB,5, GPI_UP,1);
- gpio_init (PORTB,6, GPI_UP,1); //PORTB4、5、6連接撥碼開關
-
- // pit_init_ms(PIT0, 5); //初始化PIT0,定時時間為: 5ms
- pit_init(PIT1, 10000); //初始化PIT1,定時時間為: 0.2ms
-
- CCD_init1() ; //CCD傳感器初始化
-
- FTM_PWM_init(FTM0, CH0, 10000, 0); //電機PTC1
- FTM_PWM_init(FTM0, CH1, 10000, 0); //電機PTC2
- FTM_PWM_init(FTM0, CH2, 10000, 0); //電機PTC3
- FTM_PWM_init(FTM0, CH3, 10000, 0); //電機PTC4
-
- gpio_init (PORTA,17,GPI,1); //編碼器正反轉狀態
- gpio_init (PORTA,19,GPI,1); //編碼器正反轉狀態
- gpio_Interrupt_init(PORTA,8, GPI_DOWN, RING) ;
- gpio_Interrupt_init(PORTA,9, GPI_DOWN, RING) ;
-
- FTM_PWM_init(FTM2,CH0,100,120); //舵機占空比初始化 PTA10
-
- /*****撥碼開關模式選擇*****/
- switch_init();
-
- EnableInterrupts; //開總中斷
-
- /******************************************
- 執行程序
- ******************************************/
- while(1)
- {
- if(TIME1flag_20ms == 1)
- {
- TIME1flag_20ms = 0 ;
- // uart_putchar(UART0,0xff) ;
- /* Sampling CCD data */
- ImageCapture(Pixel);
- /* Send data to CCDView every 100ms */
- /************閾值確定*******************/
-
- FAVAULE_max= 0;
- FAVAULE_min= 254;
- for(i=5;i<123;i++)
- {
- if(Pixel[i]>254) {Pixel[i]=254;} //去反光點
- if(Pixel[i]<FAVAULE_min){FAVAULE_min=Pixel[i];}
- if(Pixel[i]>FAVAULE_max){FAVAULE_max=Pixel[i];}
- }
- if(FAVAULE_max-FAVAULE_min > 80)
- FAVAULE=(FAVAULE_min+FAVAULE_max)>>1;
- // FAVAULE=(FAVAULE_min+FAVAULE_max)/2;
-
- /********二值化,并進行白點計算***********/
- /* for(i=0; i<128; i++)
- {
- if(Pixel[i]>=FAVAULE)
- {
- Pixel_pt[i]=254;
- bai_dian_sum+=i;
- bai_dian_num++;
- }else
- Pixel_pt[i]=0;
- }
- */
- /* Send data to CCDView every 100ms發送數據 */\
- // SendImageData(Pixel);// _pt);
-
-
-
-
-
- /**********
- 計算黑線位置
- **********/
- bai_dian_sum=0;
- bai_dian_num=0;
- bai_dian_num_l=0;
- bai_dian_num_r=0;
- hei_dian_num_l=0;
- hei_dian_num_r=0;
- for(i=5;i<64;i++)
- {
- if(Pixel[i]>FAVAULE)
- {
- bai_dian_sum+=i;
- bai_dian_num_l++;
- }else{
- hei_dian_num_l++;
- }
- }
- for(i=64;i<123;i++)
- {
- if(Pixel[i]>FAVAULE)
- {
- bai_dian_sum+=i;
- bai_dian_num_r++;
- }else{
- hei_dian_num_r++;
- }
- }
- bai_dian_num=bai_dian_num_l+bai_dian_num_r;
- if(bai_dian_num < 96)
- {
- if(bai_dian_num_l>bai_dian_num_r)
- {
- L_flag=1;
- R_flag=0;
- }
- if(bai_dian_num_l<bai_dian_num_r)
- {
- L_flag=0;
- R_flag=1;
- }
- }
- /*
- if(bai_dian_num > 96) //十字路口處理
- {
- Array_Shift( e ,3 );
- e[2] = hei_dian_num_l-hei_dian_num_r;
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整資料打包下載:
2016程序設計12.rar
(10.79 MB, 下載次數: 213)
2017-5-8 14:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|