标题:
基于K60单片机控制的智能循迹避障小车程序
[打印本页]
作者:
qxfasd
时间:
2021-12-31 12:00
标题:
基于K60单片机控制的智能循迹避障小车程序
这是上个月做的基于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();
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1