超声波 HC-SR04

来源:互联网 发布:卡易信官方源码 编辑:程序博客网 时间:2024/04/29 06:03

三、实验原理

1. 超声波传感器简介

超声波测距系统主要应用于汽车的倒车雷达、及机器人自动避障行走、建筑施工工地以及一些工业现场例如:液位、井深、管道长度等场合。超声波是一种在弹性介质中的机械振荡,有两种形式:横向振荡(横波)及纵向振荡(纵波)。在工业中应用主要采用纵向振荡。超声波可以在气体、液体及固体中传播,其传播速度不同。另外,它也有折射和反射现象,并且在传播过程中有衰减。在空气中传播超声波,其频率较低,,一般为几十KHZ,而在固体、液体中则频率可用得较高。在空气中衰减较快,而在液体及固体中传播,衰减较小,传播较远。利用超声波的特性,可做成各种超声传感器,配上不同的电路,制成各种超声测量仪器及装置,并在通讯、医疗家电等各方面得到广泛应用。

目前有两种常用的超声波测距方案。一种是基于单片机或者嵌入式设备的超声波测距系统,一种是基于CPLD(Complex Programmable Logic Device)的超声波测距系统。实验采用第一种方案,利用嵌入式设备编程产生频率为40KHZ的方波,经过发射驱动电路放大,使超声波传感器发射端震荡,发射超声波。超声波经发射物反射回来,由传感器接收端接收,再经过接收电路放大、整形。以嵌入式微核心的超声波测距系统通过嵌入式设备记录超声波发射的时间和反射波的时间。当收到超声波的反射波时,接收电路输出端产生一个跳变。通过定时器计数,计算时间差,就可以计算出相应的距离。

2.超声波传感器原理

人们可以听到的声音的频率为20HZ-2KHZ,也就是可听声波,超出此频率范围的声音,20HZ以下的声音称为低频声波,20KHZ以上的声音称为超声波,一般说话的频率范围是10HZ-8KHZ。超声波为直线传播,频率越高,绕射能力越弱,但反射能力越强,为此,利用超声波的这种性质就可以制成超声波传感器。另外,超声波在空气重的传播速度较慢,约330m/s,这就使得超声波传感器的使用变得简单。

超声波传感器是利用超声波的特性研制而成的传感器。超声波是一种振动频率高于声波的机械波,由换能晶片在电压的激励下发生振动产生的,它具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中,它可穿透几十米的深度。超声波碰到杂质或分界面会产生显著反射形成反射成回波,碰到活动物体能产生多普勒效应。因此超声波检测广泛应用在工业、国防、生物医学等方面以超声波作为检测手段,必须产生超声波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声换能器,或者超声探头。

超声波传感器主要由双压电晶片振子、圆锥共振板和电极等部分构成。两电极间加上一定的电压时压电晶片就会被压缩产生机械形变,撤去电压后压电晶片恢复原状。若在两极间按照一定的频率加上电压,则压电晶片也会保持一定的频率振动。经试验测得此型号压电晶片的固有频率为38.4kHz,则在两极外加频率为40 kHz的方波脉冲信号,此时压电晶片产生共振,向外发射出超声波。同理,没有外加脉冲信号的超声波传感器在共振板接收到超声波时也会产生共振,在两极间产生电信号。

超声波探头主要由压电晶片组成,既可以发射超声波,也可以接收超声波。小功率超声探头多作探测作用。它有许多不同的结构,可分直探头(纵波)、斜探头(横波)、表面波探头(表面波)、兰姆波探头(兰姆波)、双探头(一个探头反射、一个探头接收)等。

超声探头的核心是其塑料外套或者金属外套中的一块压电晶片。构成晶片的材料可以有许多种。晶片的大小,如直径和厚度也各不相同,因此每个探头的性能是不同的,我们使用前必须预先了解它的性能。超声波传感器的主要性能指标,包括:

(1) 工作频率。工作频率就是压电晶片的共振频率。当加到它两端的交流电压的频率和晶片的共振频率相等时,输出的能量最大,灵敏度也最高。

(2) 工作温度。由于压电材料的居里点一般比较高,特别时诊断用超声波探头使用功率较小,所以工作温度比较低,可以长时间地工作而不产生失效。医疗用的超声探头的温度比较高,需要单独的制冷设备。

(3) 灵敏度。主要取决于制造晶片本身。机电耦合系数大,灵敏度高;反之,灵敏度低。

3.超声测距原理  

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340*t/2。这就是所谓的时间差测距法。

超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。

测距的公式表示为:L=C×T

式中L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。

由于超声波也是一种声波,其声速 v 与温度有关,下表列出了几种不同温度下的声速。在使用时,如果温度变化不大,则可认为声速是基本不变的。如果测距精度要求很高,则应通过温度补偿的方法加以校正。

表4.4.1 超声波波速与温度的关系

温度℃

-30

-20

-10

0

10

20

30

100

声速m/s

313

319

325

323

338

344

349

386

 

由于超声波易于定向发射、方向性好、强度易控制、与被测量物体不需要直接接触的优点,是作为倒车距离测量的理想选择。 

4.超声波测距一体模块

(1)模块性能

本模块性能稳定,测度距离精确。能和国外的SRF05,SRF02等超声波测距模块相媲美。模块高精度,盲区(2cm)超近,最大识别距离为300cm。

系统的工作是由软件和硬件的配合过程。先由微机使555使能端置1,继而555送出40kHz频率的方波信号经过压电换能器(超声波发射头)将信号发射出去及发射超声波,同时该时刻启动定时器开时计时。该信号遇到障碍物反射回来在此称为回波。同时,压电换能器(超声波接收头)将接收的回波及接收超声波,通过信号处理的检波放大,及通过三级放大后再送到比较器进行比较输出比较电压,输出电压经过三极管以后,使之电压与微机的I/O口相匹配最后送至微机处理。

(2)产品应用领域

机器人避障、物体测距、液位检测、公共安防、停车场检测。

(3)主要技术参数

u 使用电压:DC5V

u 静态电流:小于2mA

u 电平输出:高5V

u 电平输出:底0V

u 感应角度:不大于15度

u 探测距离:2cm-450cm

u 高精度可达0.2cm

(4)接线方式及工作原理

接线方式:VCC、trig(控制端)、 echo(接收端)、 GND

基本工作原理:

u 采用IO口TRIG触发测距,给大于10us的高电平信号;

u 模块自动发送8个40khz的方波,自动检测是否有信号返回;

u 有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2。

4.4.4 传感器的方向图

 

 

(5)控制方式

本模块使用方法简单,一个控制口发一个10US以上的高电平,该模块内部将发出8个40KHZ的周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到接收到的回响信号的时间间隔就可以计算得到距离。计算公式为:

因此,在实验中,就可以在接收口等待高电平输出。一有输出就可以开定时器计时。当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。如此不断的周期测,即可以达到移动测量的值。

下图给出了超声测距模块的时序图,根据时序图,我们可以知道,回响信号的高电平就是我们用来测量距离的重要指标,通过距离与速度和时间的关系,从而求得相应的距离。

图4.4.5超声测距时序图

一个 10uS 以上脉冲触发信号,该模块内部将发出 8次40kHz 周期电平并检测回波。一旦检测到有回波信号则输出回响信号,回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号的时间间隔可以计算得到距离。建议测量周期为 60ms 以上,以防止发射信号对回响信号的影响。

注意事项

1、此模块不宜带电连接,若要带电连接,则先让模块的 GND 端先连接,否则会影响模块的正常工作。

2、测距时,被测物体的面积不少于 0.5 平方米且平面尽量要求平整,否则影响测量的

结果

 

下图4.4.6给出了超声测距模块的发射端电路

图4.4.6超声测距发射端电路图

压电式超声波换能器是利用压电晶体的谐振来工作的。超声波换能器内部有两个压电晶片和一个换能板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片会发生共振,并带动共振板振动产生超声波,这时它就是一个超声波发生器;反之,如果两电极问未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,这时它就成为超声波接收换能器。超声波发射换能器与接收换能器在结构上稍有不同,使用时应分清器件上的标志。

下图4.4.7给出了超声测距模块的接收端电路

集成电路CX20106是一款红外线检波接收的专用芯片,常用于电视机红外遥控接收器。考虑到红外遥控常用的载波频率38kHz与测距的超声波频率40kHz较为接近,可以利用它制作超声波检测接收电路。实验证明用CX20106接收超声波(无信号时输出高电平),具有很好的灵敏度和较强的抗干扰能力。适当更改电容C4的大小,可以改变接收电路的灵敏度和抗干扰能力。

图4.4.7  超声波接收电路

下图4.4.8给出了超声测距模块的电路

图4.4.8  超声波收发电路

5.超声波测距模块的影响因素

超声波传感器应用起来原理简单,也很方便,成本也很低。但是目前的超声波传感器都有一些缺点,比如,反射问题,噪音,交叉问题。

(1)反射问题
  如果被探测物体始终在合适的角度,那超声波传感器将会获得正确的角度。但是不幸的是,在实际使用中,很少被探测物体是能被正确的检测的。 其中可能会出现几种误差:
    1)三角误差
    当被测物体与传感器成一定角度的时候,所探测的距离和实际距离有个三角误差。
    2)镜面反射
    这个问题和高中物理中所学的光的反射是一样的。在特定的角度下,发出的声波被光滑的物体镜面反射出去,因此无法产生回波,也就无法产生距离读数。这时超声波传感器会忽视这个物体的存在。
    3)多次反射
    这种现象在探测墙角或者类似结构的物体时比较常见。声波经过多次反弹才被传感器接收到,因此实际的探测值并不是真实的距离值。
这些问题可以通过使用多个按照一定角度排列的超声波圈来解决。通过探测多个超声波的返回值,用来筛选出正确的读数。
    (2) 噪音
    虽然多数超声波传感器的工作频率为40-45Khz,远远高于人类能够听到的频率。但是周围环境也会产生类似频率的噪音。比如,电机在转动过程会产生一定的高频,轮子在比较硬的地面上的摩擦所产生的高频噪音,机器人本身的抖动,甚至当有多个机器人的时候,其它机器人超声波传感器发出的声波,这些都会引起传感器接收到错误的信号。
这个问题可以通过对发射的超声波进行编码来解决,比如发射一组长短不同的音波,只有当探测头检测到相同组合的音波的时候,才进行距离计算。这样可以有效的避免由于环境噪音所引起的误读。

(3)交叉问题
    交叉问题是当多个超声波传感器按照一定角度被安装在机器人上的时候所引起的。超声波X发出的声波,经过镜面反射,被传感器Z和Y获得,这时Z和Y会根据这个信号来计算距离值,从而无法获得正确的测量。
解决的方法可以通过对每个传感器发出的信号进行编码。让每个超声波传感器只听自己的声音。

四、实验内容

1.实验器材连线

本实验所使用的振动传感器实物图如图4.4.10所示,实物规格图如图4.4.9所示。

图4.4.9 超声测距模块实物规格图

图4.4.10振动传感器模块

将振动传感模块安装到开发板上,然后用JLINK仿真器的一端用USB接口与电脑相连,一端的20Pin的JTAG引脚与NXP LPC2378节点板的J2相连,并给NXP LPC2378节点板上电,如图4.4.11所示。

图4.4.11超声测距开发板连接图

2.距离测量

       char *p;

       int idx;

       int xpos,ypos;

       long count;

       char sndBuf[20];

       unsigned char hbyte,lbyte;

        

       //通讯板IO控制引脚设置

    IO1DIR &=~(1<<16); //IOZ/A          输入--接收开关状态信号

    delay(10);

       //P3.0~P3.7定义为IO引脚

       PINSEL6 &= 0x0000;

      

       //定义P3.1为输入,P3.3为输出

       FIO3DIR0 = 0;

       FIO3DIR0 |= 1<<3;

      

       //传感板类型识别CODE0~CODE3,作为输入端

       FIO2DIR &=~(1<<5);

       FIO2DIR &=~(1<<6);

       FIO2DIR &=~(1<<7);

       FIO2DIR &=~(1<<8);

      

      

       Uart1ToUart0=0;

         

//设置LCD屏幕引脚  

       PINSEL3=PINSEL3 & 0x00000000;

       IO1DIR=IO1DIR|0x05700000;

 

 

     // 设置串口0,P0.2-TXD0 P0.3-RXD0

    //PINSEL0 = PINSEL0 & 0x00000050;     

    //P0.2 P0.3不使用上拉电阻

    PINMODE0 = PINMODE0 & 0x000000A0;      

    //去除P0.16上拉电阻

    //PINMODE0 |= 0x80000000;

    PINMODE1 |= 0x00000002;

    //设置引脚方向

    IO0DIR |=1<<15;

    IO0DIR &=~(1<<16);

   

        

//屏幕初始化   

    RESET0;    //复位                           

    delay(50);

    RESET1;                    

    delay(100);

    lcd_init();

    delay(20);

    LCD_Frame();

 

   

    DispAscStr(0,12,"  ",2,&xpos,&ypos);

    DispChnStr(xpos,ypos,"超声模块测试",6,&xpos,&ypos);

       ClearRect(2);

    idx=0;

       while(1)

       {

      

              delay10us(100);

             

              //发送10us启动电平

              FIO3PIN0 |= 1<<3;

              delay10us(1);

              FIO3PIN0 &= ~(1<<3);

             

          //等待高电平出现

              while(!(FIO3PIN0&(1<<1)));

 

        //配置定时器0

          T0TC=0;     //清除定时器值

          T0PR=0x10;  //预分频寄存器

          T0CTCR=0;   //定时器模式,检测PCLK边沿

          T0TCR=0x01; //计数器使能、计数器复位

 

        //等待降为低电平

          while(FIO3PIN0&(1<<1));

          

          //显示距离值,大概80为1CM

          count=T0TC;

          count=count/80;

          sndBuf[0]=count/10000+'0';      //万

          sndBuf[1]=count%10000/1000+'0'; //千

          sndBuf[2]=count%1000/100+'0';   //百

          sndBuf[3]=count%100/10+'0';     //十

          sndBuf[4]=count%10+'0';         //个

          sndBuf[5]='c';

          sndBuf[6]='m';

          DispAscStr(0,40,sndBuf,7,&xpos,&ypos);

              delay10us(3000);

                     }

3.倒车实验

本实验模仿倒车,当距离小于20cm时,提示司机注意安全倒车距离,大于安全距离时显示距离障碍物的距离。修改Main.c中的代码如下:

       while(1)

       {

      

              delay10us(100);

             

              //发送10us启动电平

              FIO3PIN0 |= 1<<3;

              delay10us(1);

              FIO3PIN0 &= ~(1<<3);

             

          //等待高电平出现

              while(!(FIO3PIN0&(1<<1)));

 

        //配置定时器0

          T0TC=0;     //清除定时器值

          T0PR=0x10;  //预分频寄存器

          T0CTCR=0;   //定时器模式,检测PCLK边沿

          T0TCR=0x01; //计数器使能、计数器复位

 

        //等待降为低电平

          while(FIO3PIN0&(1<<1));

          

          //显示距离值,大概80为1CM

          count=T0TC;

          count=count/80;

              //模仿倒车,当距离小于20cm时发出警告,并显示当前距离值

          if(count<20)

          {

                  DispAscStr(0,100,"warning",7,&xpos,&ypos);

                  sndBuf[0]=count/10000+'0';       //万

                 sndBuf[1]=count%10000/1000+'0'; //千

                 sndBuf[2]=count%1000/100+'0';   //百

                 sndBuf[3]=count%100/10+'0';     //十

                 sndBuf[4]=count%10+'0';         //个

                 sndBuf[5]='c';

                 sndBuf[6]='m';

                 DispAscStr(0,40,sndBuf,7,&xpos,&ypos);

          }

          else

          {

                 //先做清屏,再做输出显示

              drawrect(0,100,128,48,0x2345);

                 sndBuf[0]=count/10000+'0';      //万

                 sndBuf[1]=count%10000/1000+'0'; //千

                 sndBuf[2]=count%1000/100+'0';   //百

                 sndBuf[3]=count%100/10+'0';     //十

                 sndBuf[4]=count%10+'0';         //个

                 sndBuf[5]='c';

                 sndBuf[6]='m';

                 DispAscStr(0,40,sndBuf,7,&xpos,&ypos);

          }

              delay10us(3000);

       }

4.声速测量

利用声速、传播时间、传播距离的关系,模仿实验条件,简单的测出实验环境下的光速的大概值。

while(1)

       {

      

              delay10us(100);

             

              //发送10us启动电平

              FIO3PIN0 |= 1<<3;

              delay10us(1);

              FIO3PIN0 &= ~(1<<3);

             

          //等待高电平出现

              while(!(FIO3PIN0&(1<<1)));

 

        //配置定时器0, 使用定时器0的计数功能

        //计数功能是在外部脉冲边沿到来时,TC加1

          T0TC=0;     //清除定时器值

          T0PR=0x10;  //预分频寄存器

          T0CTCR=0;   //定时器模式,检测PCLK边沿

          T0TCR=0x01; //计数器使能、计数器复位

 

        //等待降为低电平

          while(FIO3PIN0&(1<<1));

          

          //显示距离值,大概80为1CM

          /*

          实验板用的是12MHZ的晶振,每个计数时间为12/(12*10^6)=(1*10^-6)s

          根据固定距离测出声速

          实验时提供距离为100cm作为测试距离,用来测量声速

          1************1/12*10^-6 *v *(count/2)=distence*******************             2************v=2*2*10^6*distence/count*************************

          3************v=340m/s,distence 单位:m***************************

          */

          count=T0TC;

           dis=1;//这里的 distence 为1m,也就是100cm

             // 计算公式

             v_rate=24*100000*dis/count;

           sndBuf[0]=v_rate/10000+'0';      //万

           sndBuf[1]=v_rate%10000/1000+'0'; //千

           sndBuf[2]=v_rate%1000/100+'0';   //百

           sndBuf[3]=v_rate%100/10+'0';     //十

           sndBuf[4]=v_rate%10+'0';         //个

               sndBuf[5]='m';

               sndBuf[6]='/';

               sndBuf[7]='s';

               DispAscStr(0,40,sndBuf,8,&xpos,&ypos);

              delay10us(3000);

       }

5.自动门实验

本实验模仿自动门的功能。当测距器遇到障碍物的距离大于50cm时,认为没有人员的到来,当测距器与障碍物的距离小于50cm认为有人到达,打开门。

while(1)

       {

      

              delay10us(100);

             

              //发送10us启动电平

              FIO3PIN0 |= 1<<3;

              delay10us(1);

              FIO3PIN0 &= ~(1<<3);

             

          //等待高电平出现

              while(!(FIO3PIN0&(1<<1)));

 

        //配置定时器0

          T0TC=0;     //清除定时器值

          T0PR=0x10;  //预分频寄存器

          T0CTCR=0;   //定时器模式,检测PCLK边沿

          T0TCR=0x01; //计数器使能、计数器复位

 

        //等待降为低电平

          while(FIO3PIN0&(1<<1));

          

          //显示距离值,大概80为1CM

          count=T0TC;

          count=count/80;

          

          //自动门人员检测

              //当有人到达门前,原有的距离被改变,当人与测距器的距离

              //达到临界值时,打开自动门

              //本实验当人距离自动门50cm时,自动开门,否则,门关闭

              //初始时,门关闭

             

          if((count<50)&&(idx==1))

          {

                 drawrect(0,40,128,48,0x2345);

                 DispAscStr(0,40,"status:open",11,&xpos,&ypos);

                 idx=0;

          }

          else if((count>50)&&(idx==0))

          {

              drawrect(0,40,128,48,0x2345);

                 DispAscStr(0,40,"status:close",12,&xpos,&ypos);

                 idx=1;

          }

              delay10us(3000);

       }


0 0
原创粉丝点击