好消息:请在手机淘宝或闲鱼上搜索“电子入门趣谈”,有惊喜哦 :) 我把全本电子入门趣谈的电子版(包括科技提升和理论升华部分,共计50余万字)放到上面开始兜售啦,如果您真的喜欢这本书,又想跟作者一起聊聊天的话 :) ... ...欢迎各界电子科技爱好者朋友们斧正收藏 。作者微信:zhangbolin1202 --- 2019.05.27注
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; //运行完中断函数后,再打开中断开关
}
未完待续。。。