您的位置:首页 > 其它

17-《电子入门趣谈》第三章_电子世界中的五官---传感器-3.2.2超声传感器测距

2015-12-29 09:18 197 查看
3.2.2 超声波传感器

日常生产生活中,很多场合如汽车倒车、机器人避障、工业测井、水库液位测量等需要自动进行非接触测距。超声波测量是进行非接触测距的一种有效成熟的技术方式。超声波是指频率大于20 kHz的在弹性介质中产生和传播的机械震荡波,其具有指向性强、能量消耗缓慢、传播距离相对较远等特点,因此常被用于非接触测距。由于超声波对光线、色彩和电磁场不敏感,因此超声波测距对环境有较好的适应能力,此外超声波测量在实时、精度、价格上也能得到很好的折衷。超声波传感器是进行超声波测量的核心部件。

下面我们来举个具体的例子看看超声波传感器的应用方法。我们选择的超声波传感器是HC-SR04超声波测距模块。项目实现功能:利用HC-SR04超声波测距模块、51单片机和发光二极管完成距离的测量任务,当测得的距离大于设定值时发光二极管LED0会亮;当测得的距离小于设定值时发光二极管LED1会亮,并且LED0灭。

HC-SR04传感器操作非常简单,继续看吧。

(1)超声波测距的原理

知识点:

超声波传感器分机械方式和电气方式两类,它实际上是一种换能器,在发射端它把电能或机械能转换成声能,接收端则反之。本次设计超声波传感器采用电气方式中的压电式超声波换能器,它是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,就成为超声波接收器。在超声波电路中,发射端输出一系列脉冲方波,脉冲宽度越大,输出的个数越多,能量越大,所能测的距离也越远。超声波发射换能器与接收换能器其结构上稍有不同,使用时应分清器件上的标志。

超声波测距的方法有多种:如往返时间检测法、相位检测法、声波幅值检测法。本设计采用往返时间检测法测距。其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。测试传输时间可以得出距离。

  假定s为被测物体到测距仪之间的距离,测得的时间为t/s,超声波传播速度为v/m•s-1表示,则有关系式(1)

s=vt/2 (1)
  在精度要求较高的情况下,需要考虑温度对超声波传播速度的影响,按式(2)对超声波传播速度加以修正,以减小误差。

v=331.4+0.607T (2)
  上式中,T为实际温度单位为℃,v为超声波在空气中的传播速度,其单位为m•s-1。

2)HC-SR04超声波测距模块简介

我们选择的超声波传感器是HC-SR04超声波测距模块。该模块具有2cm---400cm范围的非接触式测距功能。测量精度可以达到3mm,满足绝大多数学生科技作品中非接触式测距的范围和精度要求。模块包括超声波发射器、接收器与控制电路。该模块的基本工作原理:

(1)采用IO口TRIG 触发测距,给最少10us 的高电平信呈。
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO口ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;(是不是很简单很神奇?)
(3)HC-SR04超声波模块运用方法

1、实物图



如上图接线,VCC供5V电源, GND为地线,TRIG触发控制信号输入,ECHO回响信号输出等四个接口端。
2、模块电气参数



3、 超声波时序图



通过阅读超声波时序图,我们可以发现只需要提供一个10uS 以上脉冲触发信号,该模块内部将自动发出8 个40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。
注:这个模块不宜带电连接,若要带电连接,则先让模块的GND端先连接,否则会影响模块的正常工作。测距时,被测物体的面积不少于0.5平方米且平面尽量要求平整,否则影响测量的结果

4、硬件电路图:

硬件电路图如下图所示。我们利用HC-SR04超声波测距模块、51单片机和发光二极管完成距离的测量任务,当测得的距离大于设定值时发光二极管LED0会亮;当测得的距离小于设定值时发光二极管LED1会亮。



上图是基于51单片机的超声波测距电路图设计。VCC 供5V电源, GND为地线,TRIG 触发控制信号输入,ECHO 回响信号输出等四个接口端。ECHO端接单片机的 P3^3脚, TRIG端接单片机的P3^6脚。

5、程序设计

程序流程图:



#include<reg52.h>
#include<intrins.h>
#defineuint unsigned int
intCounter_T1=0;
floattime;
sbit  ECHO=P3^3;                        //超声波接口定义,回响信号输入端
sbit  TRIG=P3^6;                  //超声波接口定义,触发信号控制端

sbitLED0=P1^0;
sbitLED1=P1^1;
unsignedlong L;

/********************************************************
**函数名: StartModule()
**返回:无
**函数功能描述:启动测距信号
**********************************************************/
void  StartModule()
{
char i;
TRIG=1;
for(i=0;i<25;i++)   //让高电平延时超过10us。
_nop_();
TRIG=0;
}
/********************************************************
**函数名: Conut(void)
**返回:无
**函数功能描述:计算距离
**********************************************************/

void  Conut(void)             //计算距离
{
while(!ECHO){};             //当ECHO引脚为零时等待
TR1=1;                          //开启计数
while(ECHO){};              //当RX为1计数并等待
TR1=0;                             //关闭计数
time=Counter_T1*65536+TH1*256+TL1;//读取脉宽时间,若晶振12M,算出的是us.
Counter_T1=0;  //溢出次数计数清零
TH1=0;  //计数器也清零,重新计数
TL1=0;
L=(time*1.7)/100;        //算出来是CM
if(L<100)     //L是设定的距离值
{
LED1=0;
LED0=1;
}
if(L>100)
{
LED0=0;
LED1=1;
}
}

/********************************************************
**函数名:main(void)
**返回:无
**函数功能描述:主函数入口
**********************************************************/
voidmain(void)
{
LED0=1;
LED1=1;
TMOD=0X01;
TR1=0;
TH1=0;
TL1=0;
ET1=1; //使用中断,计算定时器溢出次数
EA=1;
while(1)
{
StartModule();
Conut();
}
}

/********************************************************
**函数名: T_1(void)
**返回:无
**函数功能描述:计算定时器溢出次数
**********************************************************/
voidT_1(void) interrupt 3
{
ET1=0; //保持好习惯,先把中断关了
TF1=0; //保持好习惯,清0中断标志位

Counter_T1++;

ET1=1; //运行完中断函数后,再打开中断开关
}


未完待续。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: