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

好消息:请在手机淘宝或闲鱼上搜索“电子入门趣谈”,有惊喜哦 :) 我把全本电子入门趣谈的电子版(包括科技提升和理论升华部分,共计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; //运行完中断函数后,再打开中断开关
}
 


未完待续。。。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值