这是上个月做的基于K60控制的智能循迹避障小车通过五路红外传感器使小车沿着黑线循迹
通过HC-SR04来进行避障- #include "common.h"
- #include "include.h"
- int date=2;
- int i=3;
- int distance=399; //测量距离
- int Time = 100000;
- uint32 timevar;
- //直行
- void straight()
- {
- gpio_set(PTE8, 1);//右
- gpio_set(PTE9, 0); //右
- gpio_set(PTE10,0);//左
- gpio_set(PTE11,1); //左
- ftm_pwm_duty(FTM0, FTM_CH0,25);
- ftm_pwm_duty(FTM0, FTM_CH2,25);
- }
- //慢直行
- void slow()
- {
- gpio_set(PTE8, 1);//右
- gpio_set(PTE9, 0); //右
- gpio_set(PTE10,0);//左
- gpio_set(PTE11,1); //左
- ftm_pwm_duty(FTM0, FTM_CH0,10);
- ftm_pwm_duty(FTM0, FTM_CH2,10);
- }
- //左转弯
- void left()
- {
- gpio_set(PTE8, 1);//右
- gpio_set(PTE9, 0); //右
- gpio_set(PTE10,1);//左
- gpio_set(PTE11,0); //左
- ftm_pwm_duty(FTM0, FTM_CH0,23);
- ftm_pwm_duty(FTM0, FTM_CH2,7);
- }
- //左转大弯
- void bigleft()
- {
- gpio_set(PTE8,1);
- gpio_set(PTE9,0);
- gpio_set(PTE10,1);
- gpio_set(PTE11,0);
- ftm_pwm_duty(FTM0, FTM_CH0,30);
- ftm_pwm_duty(FTM0, FTM_CH2,12);
- }
- //右转弯
- void right()
- {
- gpio_set(PTE8,0);
- gpio_set(PTE9,1);
- gpio_set(PTE10,0);
- gpio_set(PTE11,1);
- ftm_pwm_duty(FTM0, FTM_CH0,7);
- ftm_pwm_duty(FTM0, FTM_CH2,23);
- }
- //右转大弯
- void bigright()
- {
- gpio_set(PTE8,0);
- gpio_set(PTE9,1);
- gpio_set(PTE10,0);
- gpio_set(PTE11,1);
- ftm_pwm_duty(FTM0, FTM_CH0,12);
- ftm_pwm_duty(FTM0, FTM_CH2,30);
- }
- //停
- void stop()
- {
- gpio_set(PTE8,0);
- gpio_set(PTE9,0);
- gpio_set(PTE10,0);
- gpio_set(PTE11,0);
- ftm_pwm_duty(FTM0, FTM_CH0,0);
- ftm_pwm_duty(FTM0, FTM_CH2,0);
- }
- //后退
- void back()
- {
- gpio_set(PTE8,0);
- gpio_set(PTE9,1);
- gpio_set(PTE10,1);
- gpio_set(PTE11,0);
- ftm_pwm_duty(FTM0, FTM_CH0,17);
- ftm_pwm_duty(FTM0, FTM_CH2,17);
- }
- //TRIG发射脉冲
- void trigpulse()
- {
- gpio_set(PTA25,1); //产生触发脉冲
- systick_delay_us(15);
- gpio_set(PTA25,0); //产生一个20us的高电平脉冲
- }
- //超声波测距
- void chaoshengbo()
- {
-
- gpio_set(PTA25,1); //产生触发脉冲
- systick_delay_us(15);
- gpio_set(PTA25,0); //产生一个20us的高电平脉冲
- while(gpio_get(PTA27)==0); //等待电平变高,低电平一直等待
- pit_time_start(PIT0); //开始计时
- while(gpio_get(PTA27)==1); //等待电平变低,高电平一直等待
- Time=pit_time_get_us(PIT0); //停止计时,获取计时时间
- // timevar=Time*1000/bus_clk_khz;
- // distance = timevar*(331.4+0.607*20)/20000;
- distance = (int)(Time*1.7)/100;
- systick_delay_ms(60);
- }
- //超声波左转
- void HCleft()
- {
- gpio_set(PTE8,1);
- gpio_set(PTE9,0);
- gpio_set(PTE10,0);
- gpio_set(PTE11,1);
- ftm_pwm_duty(FTM0, FTM_CH0,45);//右
- ftm_pwm_duty(FTM0, FTM_CH2,15);//左
- }
- //超声波右转
- void HCright()
- {
- gpio_set(PTE8,1);
- gpio_set(PTE9,0);
- gpio_set(PTE10,0);//左
- gpio_set(PTE11,1); //左
- ftm_pwm_duty(FTM0, FTM_CH0,15);
- ftm_pwm_duty(FTM0, FTM_CH2,50);
- }
- void xunji()
- {
- //循迹 PTB4-右轮
- if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
- {
- // gpio_set(PTE8, 1);//右
- // gpio_set(PTE9, 0); //右
- // gpio_set(PTE10,0);//左
- // gpio_set(PTE11,1); //左
- // ftm_pwm_duty(FTM0, FTM_CH0,15);
- // ftm_pwm_duty(FTM0, FTM_CH2,15);
- slow();
- systick_delay_ms(10);
- }
- if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==0)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
- {
- straight();
- systick_delay_ms(10);
- }
- //右转小弯
- if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==0)&&(gpio_get(PTC0)==1))
- {
- right();
- systick_delay_ms(10);
- }
- //左转小弯
- if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==0)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
- {
- left();
- systick_delay_ms(10);
- }
- //右转大弯
- if((gpio_get(PTB4)==1)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==0))
- {
- bigright();
- systick_delay_ms(10);
- }
- //左转大弯
- if((gpio_get(PTB4)==0)&&(gpio_get(PTB5)==1)&&(gpio_get(PTB6)==1)&(gpio_get(PTB7)==1)&&(gpio_get(PTC0)==1))
- {
- bigleft();
- systick_delay_ms(10);
- }
- }
- void pit2_hander()
- {
- led (LED0,LED_ON);
- led (LED1,LED_ON);
- led (LED2,LED_ON);
- date--;
- PIT_Flag_Clear(PIT2);
- }
- void main()
- {
- led_init(LED0);
- led_init(LED1);
- led_init(LED2);
- gpio_init(PTE8, GPO, 1);
- gpio_init(PTE9, GPO, 0);
- gpio_init(PTE10, GPO,0);
- gpio_init(PTE11, GPO,1);
- gpio_init(PTB4, GPI, 0);
- gpio_init(PTB5, GPI, 0);
- gpio_init(PTB6, GPI, 0);
- gpio_init(PTB7, GPI, 0);
- gpio_init(PTC0, GPI, 0);
- gpio_init(PTA25, GPO, 0); //TRIG
- gpio_init (PTA27, GPI, 0); //ECHO
- ftm_pwm_init(FTM0, FTM_CH0,200,18);
- ftm_pwm_init(FTM0, FTM_CH2,200,18);
-
- pit_init_ms(PIT2, 14000); //初始化 PIT2,定时时间为:14s
- set_vector_handler(PIT2_VECTORn,pit2_hander);
- enable_irq(PIT2_IRQn);
-
- // disable_irq(PIT2_IRQn);
- while(i>2)//i>2
- {
- xunji();
- while(date<2)
- {
- trigpulse();
- chaoshengbo();
- if(distance<70)
- {
- i=2;
- HCleft();
- systick_delay_ms(1000);
- HCright();
- systick_delay_ms(600);
- }
- }
- }
- while(i==2)
- {
- xunji();
- }
- }
复制代码
|