|
研究目标: 通过摄像头提取道路图像,并进行图像转换与处理,利用编码器采样小车速度,研究采用双环PID控制方法对小车进行控制,使智能小车能自动探寻轨迹,并能避障快速精准运行。结合K60芯片所提供的驱动方式,我们选择了PWM(Pulse Width Modulation)控制模式来控制电机的速度。简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。脉冲宽度调制的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。
K60 IAR配置文件
Flash的配置:
飞思卡尔源码:
- /******************** (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)
|
评分
-
查看全部评分
|