任务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=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-10010203040声速〔m/s〕313319325332338344350356根据声速与温度的对应关系,得到公式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.4 MAX232驱动电路③中周变压器驱动将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.5 HC-SR04超声波测距模块实物图和接口. HC-SR04模块体积较小,45*20*15mm.模块的正面是发射探头和接收探头,背面是由3个集成IC构成的发射和接收电路.模块接口简单,除了电源和地外,一个引脚是触发信号输入端,另外一个引脚是回响信号输出端.图5.9.6是其时序图.图5.9.6 HC-SR04模块时序图 通过时序图,我们看到HC-SR04模块使用非常简单:只需要在Trig端加入一个10us以上的脉冲触发信号,模块就会自动产生8个40KHz的周期电平,并自动检测回波,一旦检测到回波,则在Echo端输出回响信号,回向信号的脉冲宽度与所测量的举例成正比.40KHz脉冲信号的产生和回波信号的检测都是由模块内部电路来完成的,那么模块是怎么做到这些呢?图5.9.7 HC-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.7 HC-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) 主函数程序如下:#include#include"MicroDefine.h"#include"Seg7Display.h"#include"DistanceMeasure.h"sbit led=P2^1;/****************************************************************************函数名称:main<>*功能 :主函数*入口参数:无*出口参数:无*说明 : ***************************************************************************/void main<>{ DelayMs<200>; TimerInit<>; //定时器初始化 while<1> { if { 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"sbit SonicTrig=P2^0; //Trig触发端接口 #define SonicTrigSet SonicTrig=1#define SonicTrigReset SonicTrig=0 //10us宏定义#define Delay10Us {_nop_<>;_nop_<>;_nop_<>;_nop_<>;_nop_<>; \ _nop_<>;_nop_<>;_nop_<>;_nop_<>;_nop_<>;}//变量声明extern bit FlagSystem1Ms; //时标信号 //函数声明extern void TimerInit<>; 。