10.实现小车自主避障
实验目的:小车前进时遇到障碍物会自动后退。
要实现小车自主避障,就要用到超声波测距模块,几块钱就可以买到,实物图如下:
超声波测距模块有4个接口,依次为:Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd
超声波测距使用方法:控制口发一个10US 以上的高电平,就可以在接收口等待高电平输出。一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,就可以达到你移动测量的值了。
超声波测距工作原理:
超声波测距是借助于超声脉冲回波渡越时间法来实现的。设超声波脉冲由传感器发出到接收所经历的时间为t,超声波在空气中的传播速度为c,则从传感器到目标物体的距离D可用下式求出:D = ct /2
(1)采用IO 触发测距,给至少10us 的高电平信号;
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;
(4)测试距离=(高电平时间*声速(340M/S))/2;
主要代码
(1)time.c中的超声波接收回波函数Read_Distane()
u16 TIM2CH4_CAPTURE_STA,TIM2CH4_CAPTURE_VAL;
void Read_Distane(void)
{
PAout(2)=1;
delay_us(15);
PAout(2)=0;
if(TIM2CH4_CAPTURE_STA&0X80)//成功捕获到了一次高电平
{
Distance=TIM2CH4_CAPTURE_STA&0X3F;
Distance*=65536; //溢出时间总和
Distance+=TIM2CH4_CAPTURE_VAL; //得到总的高电平时间
Distance=Distance*170/1000;
TIM2CH4_CAPTURE_STA=0; //开启下一次捕获
}
}
首先定义两个变量 TIM2CH4_CAPTURE_STA和TIM2CH4_CAPTURE_VAL,用于辅助实现高电平捕获。TIM2CH4_CAPTURE_STA是用来记录捕获状态,把它当成一寄存器那样来使用,各位描述如下:
TIM2CH4_CAPTURE_VAL用来记录捕获到下降沿的时候,TIM2_CNT的值。
STM32发送大约15us的高电平信号通过控制端Trig给超声波测距模块,判断TIM2CH4_CAPTURE_STA的最高位为1时,捕获完成,计算接收与发送的高电平持续总时间,根据公式D=(高电平时间*声速(340M/S))/2,得到小车到障碍物的距离(因为在主函数中调用TIM2_Cap_Init(0XFFFF,72-1)函数,设置STM32的捕获计数器为1us计数一次,所以获得的距离是以mm为单位)。最后把TIM2CH4_CAPTURE_STA置零开启下一次捕获。
(2)control.c中速度PI控制函数velocity(int encoder_left,int encoder_right)有关程序
if(Distance<500){
Movement+=700 ;
if(1==Flag_Qian)
Movement=700;
}
小车与障碍间的距离在 0.5m之内会后退。
观察现象
视频地址:http://player.youku.com/player.php/sid/XMTM1OTU5OTI2NA==/v.swf
小车能够自主避障,当超声波测距模块检测到小车前方 0.5m处有障碍时会自动后退(由于小车前进的惯性和检测的延迟,小车会前冲一段距离,再后退)。