任务59超声波测距解析.docx
- 文档编号:24679436
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:18
- 大小:368.68KB
任务59超声波测距解析.docx
《任务59超声波测距解析.docx》由会员分享,可在线阅读,更多相关《任务59超声波测距解析.docx(18页珍藏版)》请在冰豆网上搜索。
任务59超声波测距解析
任务5.9超声波测距
5.9.1任务介绍
超声波测距是一种非接触式测距方式,在使用时不受光照、电磁场、被测物色彩等因素影响,加之信息处理简单、速度快、成本低等特点,在机器人避障和定位,液位测量等方面有着广泛的应用。
本节的任务是:
利用51单片机控制超声波测距成品模块(型号HC-SR04)完成测距,测量距离显示在数码管上,要求测距程序不过多占用CPU,可移植性好。
5.9.2知识准备
1、压电式超声波发生器原理
压电式超声波发生器是利用压电晶体的谐振来工作的。
超声波发生器内部中有两个压电晶片和一个共振板,当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,产生超声波。
反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收器了。
HC-SR04中使用的超声波如图5.9.1所示,收发分体,在其底部标有‘T’和‘R’,其中‘T’表示发射探头,‘R’表示接收探头。
与外壳体连在一起引脚的为探头的负极,另外一只为探头的正极。
标称频率为40KHz,最高输入电压40Vp-p,分辨率为10mm。
图5.9.1超声波探头图片
2、超声波测距原理
超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波停止计时。
超声波在空气中的传播速度为334m/s(常温下),根据计时器记录的时间t(从发射到接收的时间差),就可以计算
出发射点距障碍物反射中心点的距离(d),即:
d=334*t/2,这就是所谓的时间差测距法,其示意图如图5.9.2所示。
超声波发射探头和接收探头之间的举例为h,则发射点距离障碍物的垂直举例为s=,由于公式中d远大于h,所以s=d。
图5.9.2超声波测距示意图
图5.9.2时间差测距法示意图
超声波在空气中传播时,常温下传播速度是334m/s,但其传播速度易受温度的影响,声速与温度的关系,如表5.9.1所示。
表5.9.1声速与温度的关系
温度(℃)
-30
-20
-10
0
10
20
30
40
声速(m/s)
313
319
325
332
338
344
350
356
根据声速与温度的对应关系,得到公式C=331.5+0.607T,其中T是温度,C是对应的声速。
在测距较为严格的场合,还需要测量环境温度,通过公式换算出当前温度下超声波对应的声速。
3、超声波发射电路简介
超声波发射电路包括两部分:
40Kz脉冲信号产生和脉冲信号功率放大电路。
(1)40KHz脉冲信号
40KHz脉冲信号的产生可以通过单片机产生,也可以通过555等振荡电路产生。
需要注意的是,在超声波测距中,40KHz的脉冲信号不需要一直发送,发送4-10个脉冲即可。
(2)脉冲信号功率放大电路
超声波测距的大小根发射功率的大小有直接的关系。
常用的功率放大电路有三种;非门驱动(74HC04或CD4069),电荷泵芯片(MAX232)驱动,中周变压器驱动。
这三种方式本质是一致的,都是提高脉冲信号的电压来增大发射的功率。
①非门驱动
5.9.3由非门74LS04构成的驱动电路
在图5.9.3中,U1C和U1D并联输出信号加载到超声波的一个引脚,其输出电平和输入电平反相,U1E和U1F的输出信号并联后加载到超声波的另一个引脚,其输出电平和输入电平同相,超声波探头得到了2倍的VCC,从而提高了发射功率,测量的距离变远。
②电荷泵芯片(max232)驱动
MAX232芯片是为串口通信设计的芯片,它的内部有电荷泵,能实现TTL电平和RS232电平的互相转换(TTL电平:
5V逻辑正,0V逻辑负;RS232电平:
+12V为逻辑正,-12V为逻辑负)。
图5.9.4是MAX232驱动超声波的电路图,T1IN和T2IN接收单片机输出的TTL电平,经过MAX232升压后,转化成RS232电平,然后驱动超声波发射探头。
图5.9.4MAX232驱动电路
③中周变压器驱动
将40KHz脉冲信号通过中周变压器升压,也可以提高超声波的发射功率。
40KHz脉冲接变压器的低压端,超声波探头接高压端,变压器要选用中频变压器。
4、超声波接收电路简介
超声波接收探头接收到40KHz的超声波后,将机械能转换为电信号,在接收端会感应出40KHz的电压波形。
由于信号微弱,且易受其他信号的干扰,所以接收端的电路包括信号的放大、滤波和整形。
常见的接收电路专用接收芯片和分立元件搭建的接收电路
①专用接收芯片(CX21016)
CX20106是SONY公司生产的红外接收专用芯片,由于红外载波频率和超声波40KHz频率非常接近,所以可以用它做作为超声波接收电路。
当超声波接收头受到发射信号时,通过CX20106进行前置放大、限幅放大、带通滤波、峰值检波和比较、施密特触发,便可得到处理后的信号。
7脚为信号输出口,没有信号时为高电平,收到后变为低电平,之后又恢复高电平。
②分立原件构建的接收电路
利用集成运放,将超声波放大,并设计40KHz的带通滤波器,然后再经过整形电路就可以得到TTL电平的输出信号。
5、HC-SR04超声波测距模块的特点
HC-SR04超声波测距模块是淘宝上热卖的一个超声波测距成品模块,测距的范围为2cm-4m,测量精度为3mm,体积小、价格便宜,省去了硬件制作的麻烦,特别适合初学者使用。
图5.9.5是HC-SR04模块的外观和接口。
图5.9.5HC-SR04超声波测距模块实物图和接口。
HC-SR04模块体积较小,45*20*15mm。
模块的正面是发射探头和接收探头,背面是由3个集成IC构成的发射和接收电路。
模块接口简单,除了电源和地外,一个引脚是触发信号输入端,另外一个引脚是回响信号输出端。
图5.9.6是其时序图。
图5.9.6HC-SR04模块时序图
通过时序图,我们看到HC-SR04模块使用非常简单:
只需要在Trig端加入一个10us以上的脉冲触发信号,模块就会自动产生8个40KHz的周期电平,并自动检测回波,一旦检测到回波,则在Echo端输出回响信号,回向信号的脉冲宽度与所测量的举例成正比。
40KHz脉冲信号的产生和回波信号的检测都是由模块内部电路来完成的,那么模块是怎么做到这些呢?
图5.9.7HC-SR04超声波测距模块的电路图。
简单分析一下HC-SR04模块的原理图,发射信号的功率驱动由电荷泵芯片MAX232来完成,接收信号由经过4合1运放TL074完成放大、带通滤波和整形,这和我们之前介绍的超声波电路基本一致。
不同的地方在于HC-SR04模块中加入了一片单片机(STC11),Trig引脚接STC11单片机的P5.0引脚,Trig端输出一个10us以上的脉冲触发信号,STC11单片机的P5.1引脚和P5.2引脚输出极性相反的8个40KHz的周期性电平,并通过MAX232提升电压后送到发送探头。
回波信号的检测也是由STC11来完成,检测到回波后,STC11在P6.7引脚输出回响应信号,回响信号的脉冲宽度与测量距离成正比。
51单片机完成HC-SR04的测距流程:
(1)51单片机向模块触发输入端发送一个10us以上的高电平,然后等待模块的回响输出端变成高电平。
(2)检测到回响输出端变成高电平后,单片机立即开定时器计时,当回向输出端变为低电平时停止计时,读取定时器的值,记录的时间为超声波从发射到接收的时间。
(3)从超声波探头到被测物体的距离=(高电平时间*声速(340M/S))/2。
测距时,被测物体的面积不少于0.5平方米且要尽量平整,超声波探头与被测物体的角度尽量垂直。
图5.9.7HC-SR04超声波测距模块的电路图
5.9.3任务实施
HC-SR04模块厂家配套程序是演示版,不适合嵌入到多任务系统中。
状态机+定时器测脉宽的方法,测量精度高,不过多占用CPU,可移植性好。
1、4位数码管:
段选:
P0,位选,P1。
2、超声波模块:
触发端(Trig):
P2.0;回响端(Echo):
P3.2。
1、接口定义:
2、工程结构图和主程序
(1)工程结构图
测距程序的工程结构图如图5.9.10所示
5.9.10工程结构图
除了主函数,其它任务模块包含数码管显示模块和距离测量模块。
(2)主函数(main.c)
程序如下:
#include
#include"MicroDefine.h"
#include"Seg7Display.h"
#include"DistanceMeasure.h"
sbitled=P2^1;
/***************************************************************************
*函数名称:
main()
*功能:
主函数
*入口参数:
无
*出口参数:
无
*说明:
***************************************************************************/
voidmain()
{
DelayMs(200);
TimerInit();//定时器初始化
while
(1)
{
if(FlagSystem1Ms==1)
{
led=0;
FlagSystem1Ms=0;
Seg7Display();//数码管显示
DistanceToBufffer();//缓冲区更新
SonicMeasureDistance();//超声波测距
led=1;
}
}
}
程序解释:
主程序内容比较简单,在完成定时器的初始化后,间隔1ms,数码管扫描,刷新一次显示缓冲区,并执行超声波测距任务。
3、其它功能模块
(1)数码管显示模块(Seg7Display.c)
4位数码管显示,第1位数码管加小数点,程序略。
(2)距离测量模块(DistanceMeasure.c)
DistanceMeasure.h:
#ifndef_DISTANCEMEASURE_H_
#define_DISTANCEMEASURE_H_
#include
#include
#include"MicroDefine.h"
#include"Seg7Display.h"
sbitSonicTrig=P2^0;//Trig触发端接口
#defineSonicTrigSetSonicTrig=1
#defineSonicTrigResetSonicTrig=0
//10us宏定义
#defineDelay10Us{_nop_();_nop_();_nop_();_nop_();_nop_();\
_nop_();_nop_();_nop_();_nop_();_nop_();}
//变量声明
externbitFlagSystem1Ms;//时标信号
//函数声明
externvoidTimerInit();//定时器初始化
externvoidDistanceToBufffer();//缓冲区更新
externvoidSonicMeasureDistance();//超声波测距
#endif
DistanceMeasure.c:
#include"DistanceMeasure.h"
bitFlagSystem1Ms=0;//时标信号
bitFlagCaptureOk=0;
bitMeasureOk=0;//测量成功标志位
uintPulseWidth=0;//脉冲宽度
uintDistance=0;//测量距离
/***************************************************************************
*函数名称:
TimerInit()
*功能:
定时器初始化
*入口参数:
无
*出口参数:
无
*说明:
定时器0,测量脉宽;定时器1,1ms时标信号
***************************************************************************/
voidTimerInit()
{
TMOD=0x29;//定时器0:
0b1001;定时器1:
0b0010。
TH0=TL0=0;//定时器0初值为0
TH1=TL1=56;//定时器1初值为0
IT0=1;//中断0下降沿触发
EX0=1;//开外中断0
ET1=1;//开定时器1中断
EA=1;//开总中断
TR0=TR1=1;//开定时器0和定时器1
}
/***************************************************************************
*函数名称:
Intr0Init()
*功能:
外部中断0中断服务函数
*入口参数:
无
*出口参数:
无
***************************************************************************/
voidIntr0Isr(void)interrupt0
{
PulseWidth=TH0*256+TL0;//计算脉冲宽度
TH0=TL0=0;//为下一次测量做准备
FlagCaptureOk=1;//捕获成功标志位置1
}
/***************************************************************************
*函数名称:
Timer1Init()
*功能:
定时器1中断服务函数
*入口参数:
无
*出口参数:
无
*说明:
产生1ms时标信号
***************************************************************************/
voidTimer1Isr(void)interrupt3
{
staticucharCnt200us=0;
if(++Cnt200us>=5)//1ms时标信号到
{
Cnt200us=0;
FlagSystem1Ms=1;
}
}
/***************************************************************************
*函数名称:
DistanceToBufffer()
*功能:
更新缓冲区
*入口参数:
无
*出口参数:
无
*说明:
MeasureOk=1,测量成功,向缓冲区送测量的距离
MeasureOk=0;测量不成功,向缓冲区送“---”
***************************************************************************/
voidDistanceToBufffer()
{
if(MeasureOk==1)//测距成功
{
DispBuffer[0]=Distance/100;
DispBuffer[1]=Distance%100/10;
DispBuffer[2]=Distance%10;
}
else//在100ms内,没有完成测距
{
DispBuffer[0]=10;
DispBuffer[1]=10;
DispBuffer[2]=10;
}
}
/***************************************************************************
*函数名称:
SonicMeasureDistance()
*功能:
距离测量
*入口参数:
无
*出口参数:
无
*说明:
状态机,1ms时标信号驱动。
完成需100ms,即1秒之内测量10次
状态0(1ms):
发送超声波触发信号
状态1(99ms):
根据测量的脉宽计算测量距离
***************************************************************************/
voidSonicMeasureDistance()
{
staticucharMeasureState=0;//状态机
staticucharCnt1Ms=0;//1ms计数变量
switch(MeasureState)
{
case0:
//状态0,发送10us高电平触发信号
{//HC-SR04开始测距
SonicTrigSet;
Delay10Us
SonicTrigReset;
MeasureState=1;//发送完后,转到状态1
}break;
case1:
//状态1,99ms后,根据捕获的结果球距离
{
if(++Cnt1Ms>=99)
{
Cnt1Ms=0;
if(FlagCaptureOk==1)//捕获成功,则计算测量距离,
{//测量成功标志位置1
FlagCaptureOk=0;
Distance=PulseWidth*34/(1000*2);
MeasureOk=1;
}
else//捕获不成功,测量成功标志位置0
MeasureOk=0;
MeasureState=0;//转到状态0,继续测量
}
}break;
}
}
程序解释:
测距程序中,分2个部分。
第1部分:
定时器配合外中断测量超声波回响信号的高电平脉宽;第2部分:
基于状态机的距离测量。
程序中用到了2个定时器。
定时器1产生1ms时标信号供给主函数使用,方式2。
定时器0配合外部中断0,测量回响信号的高电平宽度。
定时器0中的GATE门置1,方式1,初值为0。
当回响信号的高电平到来时,定时器0开始计时,回向信号高电平结束,定时器0停止计时,并触发外部中断0的中断服务函数。
在外部中断0服务函数中,计算定时器0的计时值作为测量脉宽,置位测量成功标志位(FlagCapture=1),并清零定时器0的初值,为下一次测量做好准备。
主函数间隔1ms扫描SonicMeasureDistance()函数。
函数以状态机构建,共有2个状态。
状态0:
发送10us的高电平触发信号给HC-SR04模块,HC-SR04接收到高电平触发信号后,连续发送8个40KHz脉冲给超声波发射探头。
需要注意的是程序中的10us延时,_nop_()是汇编指令,12晶振下,1个_nop_()是1us,程序中通过宏定义,连续定义了10个_nop_()的延时,即10us。
另外使用_nop_()指令,头文件中需包含“intrins.h”头文件。
状态0任务完成后,将状态机变量指向下状态1,下一个1ms,进入状态机1。
状态机1:
当计数变量Cnt1Ms连续计数99次后(99ms后),本次测距结束(测距时间==1ms+99ms=100ms)。
如果回响信号测量成功(FlagCaptureOk=1),将脉宽转换成测量距离,并将测量成功标志位置位(MeasureOk=1)。
如果在本次测量中,没有回响信号,则测量成功标志位清零(MeasureOk=0)。
在DistanceToBufffer()中,根据MeasureOk标志位,刷新缓冲区。
如果MeasureOk=1,向缓冲区送入4位测量距离值,如果MeasureOk=0,向缓冲区送入“----”。
超声波速度340米/秒=0.034厘米/微秒,根据脉宽计算的距离=PulseWidth×0.034厘米,
这个距离是超声波探头和被测物体来回的距离,所以实际距离还需要再除2。
0.034为浮点数,程序中,分子乘以1000,分母也乘以1000。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任务59 超声波测距解析 任务 59 超声波 测距 解析