超声波测距仪.docx
- 文档编号:6008284
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:16
- 大小:181.30KB
超声波测距仪.docx
《超声波测距仪.docx》由会员分享,可在线阅读,更多相关《超声波测距仪.docx(16页珍藏版)》请在冰豆网上搜索。
超声波测距仪
西安邮电学院
单片机课程设计报告书
题目:
超声波测距仪的设计
院系名称
:
自动化学院
学生姓名
:
专业名称
:
班级
:
时间
:
2011年5月23日至6月3日
超声波测距仪的设计
一、设计目的:
以51单片机为主控制器,利用超声波模块HC-SR04,设计出一套可在数码管上实时显示障碍物距离的超声波测距仪。
通过该设计的制作,更为深入的了解51的工作原理,特别是51的中断系统及定时器/计数器的应用;掌握数码管动态扫描显示的方法和超声波传感器测距的原理及方法,学会搭建51的最小系统及一些简单外围电路(LED显示电路)。
从中提高电路的实际设计、焊接、检错、排错能力,并学会仿真及软件调试的基本方法。
二、设计要求:
设计一个超声波测距仪。
要求:
1.能在数码管上实时显示障碍物的实际距离;
2.所测距离大于200cm,精度小于1cm。
三、设计器材
STC89C51单片机,HC-SR04超声波模块,SM410564四位的共阳数码管,9013三极管,按键,电容、电阻若干,万用板,电烙铁,万用表,5V直流稳压电源,镊子,钳子,导线及焊锡若干。
四、设计方案及分析(包含设计电路图)
(一)超声波测距原理
超声波传感器是一种采用压电效应的传感器,常用的材料是压电陶瓷。
由于超声波在空气中传播时会有相当的衰减,衰减的程度与频率的高低成正比;而频率高分辨率也高,故短距离测量时应选择高频率的传感器,而长距离的测量时应用低频率的传感器。
本次设计中量程大于200cm即可,为短距离测量,因此所选超声波传感器的频率为40Khz。
实用的超声测距方法有两种,一种是接收端和发射端在被测距离的两端,一端发射,另一端接收的直接波方式,适用于身高计;另一种是发射端和接收端在同一端,发射波被物体反射回来后接收的反射波方式,适用于测距仪。
我们此次设计采用反射波方式。
测距仪的分辨率取决于对超声波传感器的选择。
根据本次设计所要求的测量距离的范围及测量精度,我们选用的是HC-SR04超声波测距模块。
(如下图所示)。
此模块已将发射电路和接收电路集成好了,硬件上不必再自行设计繁复的发射及接收电路,软件上也无需再通过定时器产生40Khz的方波引起压电陶瓷共振从而产生超声波。
在使用时,只要在控制端‘Trig’发一个大于10us宽度的高电平,就可以在接收端‘Echo’等待高电平输出。
单片机一旦检测到有输出就打开定时器开始计时。
当此口变为低电平时就停止计时并读出定时器的值,此值就为此次测距的时间,再根据传播速度方可算出障碍物的距离。
(二)超声波测距模块HC-SR04简要介绍
HC-SR04超声波测距模块的主要技术参数使用方法如下所述:
1.主要技术参数:
①使用电压:
DC5V
②静态电流:
小于2mA
③电平输出:
高5V
④电平输出:
低0V
⑤感应角度:
不大于15度
⑥探测距离:
2cm-450cmHC-SR04超声波测距模块实物图
⑦高精度:
可达3mm
2.接线方式:
VCC、trig(控制端)、 echo(接收端)、GND
使用方法:
给Trig端发一个10uS以上的高电平,就可以在接收口Echo端等待高电平输出。
一有输出就可以开定时器计时,当此口变为低电平时就可以读定时器的值,此时就为此次测距的时间,方可算出距离。
3.模块工作原理:
①采用IO触发测距,给至少10us的高电平信号(在我们的程序中我们为了确保有效触发,给了约持续20us时间宽度的高电平);
②模块自动发送8个40khz的方波,自动检测是否有信号返回;
③有信号返回,通过Echo输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340M/S))/2;
综上
(一)和
(二)结合今年《单片机原理及接口技术》所学的关于51单片机的知识,我们提出了自己的设计方案:
以51单片机作为主控制器,在超声波模块HC-SR04的‘Trig’端加一个大于10us的高电平(本次设计中我们为了确保有效触发,程序中设置了约为20us的高电平进行触发),触发发射端产生超声波,同时在接收端(‘Echo’端)等待高电平的输出,一旦检测到有高电平的输出就打开定时器0进行计时。
根据所给超声波模块的技术资料可知:
‘Echo’端高电平持续的时间就是超声波从发射到返回的时间。
当超声波遇到障碍物,回波被接收端接收到后,‘Echo’端变为低电平。
此时关闭定时器0(令TR=0),读出定时器的值。
这个值即为超声波的传播时间(单位为us)。
根据声波在空气中的传播速度,方可算出距离。
【测试距离≈(高电平时间*声速(340M/S))/2】 将此距离进行处理,在数码管上利用动态扫描法实时显示。
我们在Visio中绘制出系统的结构框图如下图所示:
系统的结构框图
在明确了系统的整个结构后,我们将整个系统划分为:
超声波模块、显示模块,以及51单片机外围工作电路模块。
本次所给的超声波测距模块,集成度很高,很好用。
刚领到器件,我们就进行了测试:
给‘Trig’端一个约为20us的高电平,再在‘Echo’端接一个测试灯,‘Vcc’和‘GND’分别接电源的正,负极,当上电后可以发现测试灯会变亮,而且障碍物距离越远,(不能太远,太远会到达该模块的测距盲区,这样灯是常亮的)测试灯亮的时间越长。
因此这个模块很好用,后面只是和单片机的任意两个I/O口连接起来,用单片机控制其工作及检测其状态即可。
(三)动态显示模块
数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。
通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
在本次设计中,我们选用P0口作为‘段码’,连接SM410564‘a,b,c,d,e,f,g,dp’,每一段的亮灭。
选用P2.4~P2.7分别对应‘位码’,即连接SM410564的‘S1,S2,S3,S4’分别控制每一位的亮灭。
‘S1,S2,S3,S4’相当于是每一段的COM端,由于是共阳极,只有某一位对应的COM端为‘1’时,所送的‘段码’对该端来说才是有效的。
就显示这一模块,我们单独利用Proteus进行了仿真,以不断修改我们的延时时间,从而达到较为理想的显示效果。
在进行动态显示的时候延时是非常重要的。
延时太长,四位数码管的显示会有明显的闪烁感;延时太短,则有可能相邻几位显示同一个数码,因为时间太短还来不及变化,显示效果也很不理想。
经过我们仿真调试,不断修改程序中的延时,在仿真环境下,动态显示已很稳定,通过我们编写饿显示测试子程序,可以显示0000~9999,显示效果良好。
我们决定先不管小数点,小数点在后面单独考虑。
下图为我们对显示模块单独进行Proteus仿真时连接的电路图。
在Proteus中仿真显示模块时的线路连接图
仿真虽在时序上和实际差距不大,但在硬件上差距还是很大的。
在仿真环境下,不需要三极管驱动放大,数码管就可以正常显示,因为这是理想的,只要‘0’‘1’信号对了,没有逻辑错误,仿真效果就会和预想的一样,但实际中由于51单片机I/O口‘弱上拉,强下拉’输出的特点,对于位控制端P2.4~P2.7,‘1’表示该位选通,由于是‘弱上拉’则必须放大,否则显示的数码几乎看不清。
(四)硬件整体设计方案
我们在硬件设计上主要包括以下几个模块的设计。
(见下图,硬件设计原理图)
硬件设计原理图
(五)软件设计方案
软件设计以硬件设计为基础。
根据之前分析的结果,以及在仿真环境下和开发板上测试的结果,我们进行软件设计。
由于之前有了一定的软硬件基础,加上对51单片机中断系统即定时器/计数器的使用在这学期刚学过,较为熟悉,因此软件设计较为简单。
软件流程图如下图所示:
软件设计流程图
主要过程描述如下:
上电后先进行初始化,主要是对各变量即定时器0进行初始化,然后单片机给‘Trig’端一个约为20us的高电平,此后在‘Echo’端等待一个高电平,一旦检测到高电平,则立即打开定时器,开始计时。
此后只要定时器0中的值不超过约为65ms(65.5536ms)的计时上限,则认为仍处在有效测量范围内,并未进入盲区,则在‘Echo’等待低电平的产生,一旦检测到低电平,立即读出此时的TH0和TL0,并关闭定时器0。
则超声波从发射到返回总共所用时间为:
time=TH0*256+TL0(us),再根据超声波常温下(27℃)在空气中的传播速度,(约为344m/s)计算出障碍物的距离,在数码管上进行动态的实时显示即可。
具体编写的程序代码,详见附录。
五、问题分析与解决方法
在这次课程设计的制作过程中,我们也遇到了各种各样的问题。
最后都得到了较好的解决。
下面我们就当时在其中遇到的三个比较典型的问题的分析过程和解决方法作一简述。
(一)动态显示的延时大小
一般说来,数码管在进行动态显示时,延时太短则数码管导通时间变短,显示变暗,亮度很低;延时太长则人眼能分辨出其闪烁,达不到理想的显示效果。
因此对于显示程序来说延时很重要。
我们先在Proteus中调试,把延时调好,直到可以稳定的进行动态显示了。
但当把程序下载到开发板上时,显示的效果很差,最终把延时稍微改大了些,才好了。
但老感觉显示的字符在晃。
最后我们利用消隐的方法很好的解决了这一问题。
即每送一次段码,都全灭一次,这样也就没有了晃动感。
(二)三极管驱动数码管显示电路
在Proteus仿真软件中,不接三极管来驱动,数码管是可以正常显示的。
但仿真毕竟只是仿真,和实际还是有很大的区别的。
我们在刚开始没有加三极管驱动,所显示的数码要手捂着才能够看到,亮度很低很低。
后来,查资料发现,单片机的输出电流很小,而且51单片机本来就有“强下拉,弱上拉”的特点,因此必须加相应的驱动。
可以选择加驱动芯片,比如去年数电课设中用到的148芯片,也可以考虑用三极管驱动。
结合实际需要,我们选择了用9013来驱动放大。
9013是NPN型的三极管,我们基极接单片机,射级接数码管的位选端,集电极统一拉高,从而形成了攻击点击放大电路(电压跟随器/电流放大电路)。
从而是数码管足够亮。
(三)误差的讨论
总体来说,用超声波进行测距,特别是像本次利用高频超声波测中断距离,精度相对来说还是很高的,即使不考虑误差的处理,有可能也达到了要求的精度。
但若测长远距离时,就不得不考虑引起误差的因素,如温度,超声波自身的系统误差,等等。
声波在其传播介质中被定义为纵波。
当声波受到尺寸大于其波长的目标物体阻挡时就会发生反射;反射波称为回声。
假如声波在介质中传播的速度是已知的,而且声波从声源到达目标,而返回声源的时间可以测量得到,那么就可以计算出从声波到目标的距离。
超声测距仪是根据超声波遇到障碍物反射回来的特性进行测量的,即:
L=½vt
(1)
上式中,L为待测距离,v(m/s)为超声波在空气中的速度,t为往返时间。
由于超声波在空气中的传播速度与温度T(单位:
摄氏度)有如下关系:
v=331.45+0.61T
(2)
在常温下,温度每变化1摄氏度,超声波速度变化0.6m/s。
所以通过测温电路测量出当前温度,就可以计算出超声波在当前温度下的传输速度。
通常声速随温度的变化比较大,因此产生的测量误差也比较大,所以若是在环境温度变化较大的环境下进行测量时,需要考虑声速补偿的问题。
时间t可以通过脉冲计数的方法间接测量,也就是将时间转化为对计数脉冲个数N的测量,假定计数脉冲的频率为f,则公式
(1)可写成:
L=Nv½f(3)
如果需要非常精准的测距的话,以上的因素不能不考虑到。
由于本次课设只是在实验室,测距仪的周围环境,特别是温度还是比较恒定的。
我们就取了T=27℃时的声速约为348m/s。
如果条件和时间允许的话,可考虑加一个温度传感器,通过采集到的温度值,来选取相应的声速大小,从而极大的减小误差。
六、设计结果
经过我们在实验室的测试,该超声波测距仪达到了所规定的设计要求。
我们利用本次课程设计所提供的STC89C51单片机,SM410564LED显示管,以及超声波测距模块HC-SR04,搭建出了我们的超声波测距仪。
经过我们的不断改进,初步的实验结果表明,该测距仪精度在1cm以下,量程最大可达300cm,完成了设计要求中.所测距离大于200cm,精度小于1cm的要求,且在数码管上可以实时稳定的显示出障碍物距离的大小。
当障碍物移动时,数码管显示的数值大小也在不断变化。
障碍物距离越远,则显示值越大,反之,则越小。
另外,我们在实验室进行测试时发现,该超声波测距仪,测距效果还是比较理想的,见下表。
参照物
用手捂着超声波接收端
障碍物距离一块地板砖
障碍物距离两块地板砖
障碍物距离三块地板砖
障碍物距离四块地板砖
障碍物距离五块地板砖
障碍物距离六块地板砖
实际距离(cm)
<1
60
120
180
240
300
360
显示数值(cm)
‘----’
59.7
121.2
181.5
241.9
299.8
‘----’
注意:
1.实验环境应比较空旷,周围地面上没有堆杂物,因为声波是纵波,如果周围地面上杂物较多,可能接收端接收的不是我们人为设置的已确知距离的来衡量其测量精度的障碍物的距离,很有可能就是周围某个物体充当了障碍物,这样不利于评估超声波测距仪的测距精度。
2.障碍物不要太远,即使程序中没有设置所显示的最大距离为300cm,超声波测距模块HC-SR04的最大量程也只有450cm,距离再大,一时精度下降,二是进入了其测距盲区,不能识别,对于长距离的测量,需要低频率的超声波才可。
3.应保证预设的障碍物和超声波模块保持在一条线上,因为超声波模块探测角度只有15°,同时障碍物表面最好平整,面积足够大才可。
(这样会减小误差,在我们的测试中,我们是利用实验室的板凳面作为障碍物的效果还是很理想的。
)
4.另外,应该进行多次测量求平均值,这样随机误差会比较小,可以保证所发射的超声波是碰到了所设置的距离已知的障碍物才返回的,而不是某个未定的障碍物。
七、设计体会与收获(小组成员每人一份)
最开始的时候觉得我们设计的挺正确的,但在仿真时也是出现了很多问题,电阻阻值大小的选择、电容的大小都会很敏感的影响到实验的预期结果,然后还要顾及超神波测距范围、电阻的电压范围,等等。
经过多次修改电路,最终终于在得以实现。
下一步,我们就开始在面包板上连接。
最大的困难就是人眼并不能看到超声波,只能靠测电压值的变化来观察。
我们在网上查、用万用表测,经过百般折腾才分辨出每个管脚的用途。
在面包板上搭建后却发现还是不能实现预期功能,这样反复的出现这样那样的问题,几乎让人崩溃了。
检查了电路连接的没有任何问题,我们真的是不知所措。
突然去年实习的场景出现在我的脑海之中,无论怎样,都要坚持,说不定只是某个小问题。
我们重拾信心,检查了若干遍,确保电路搭建无误,下载了程序后,满怀期待的开启了电源,终于在面包板上看到了所测距离,人手挡的越远,所显示的数值越大。
我们内心无比兴奋,并迫不及待的想要进入下一环节校正误差的任务。
通过本次实习,让我对proteus这个软件有了进一步的了解和掌握,不仅巩固了理论知识,并熟悉了单片机和超声波传感器的内部结构及工作原理,而且加强了我的团队意识。
我相信这将是我步入工作岗位的坚实一步!
最后感谢老师这两周以来给我们的指导和帮助!
在这两周的课程设计中,我主要负责电路的仿真,鉴于超声波模块无法在仿真软件中仿真,所以只做了剩余电路的连接和测试,对于超声波那块我们在开发板上做了调试。
这次实习中我学到了很多东西,进一步熟悉了仿真软件的应用,了解了超声波模块的工作原理,知道了许多在实际操作中会出现的问题,并且找到了相应的解决办法。
在Proteus仿真软件中,不接三极管来驱动,数码管是可以正常显示的。
但仿真毕竟只是仿真,和实际还是有很大的区别的。
我们在刚开始没有加三极管驱动,所显示的数码要手捂着才能够看到,亮度很低很低。
后来,查资料发现,单片机的输出电流很小,而且51单片机本来就有“强下拉,弱上拉”的特点,因此必须加相应的驱动。
可以选择加驱动芯片,比如去年数电课设中用到的148芯片,也可以考虑用三极管驱动。
结合实际需要,我们选择了用9013来驱动放大。
9013是NPN型的三极管,我们基极接单片机,射级接数码管的位选端,集电极统一拉高,从而形成了攻击点击放大电路(电压跟随器/电流放大电路)。
从而是数码管足够亮。
对于我们这次所做的超声波测距,我们运用的测量思路是从超声波发送开始计时到超声波接收计时停止,然后综合各种影响因素计算出距离。
这个设计只是对静止物体的测距,对于运动物体的测距还需要相应的修改。
我们顺着这个思路设计出了实际电路,而且进行了局部的调试,在用开发板测试完了数码显示后我们焊接了实际电路图,然后烤入程序进行实际调试,调整实际测量中的误差,最终将误差调到最小,结束了我们的设计。
在本次的课程设计中,我主要负责超声波模块的测试和软件程序的编写。
因为今年刚学过单片机的中断系统和定时/计数器,加上自己以前用过Keil编译环境,觉得程序编写应该不是很难。
编写程序首先得熟悉硬件才可以。
因此我们组的超声波模块的测试工作也就由我来完成。
经过测试发现,当给‘Trig’一个大于10us的高电平时,若有障碍物在发射端,则‘Echo’端所接的测试灯会闪一下,而且障碍物距离越远,亮的时间越长。
据此,我决定用定时器0和外部中断0.,将Echo端接外部中断0引脚(P3.2)即TMOD=0x09,即GATE=1,要用软件使TR0为1,同时外部中断引脚/INTO也为高电平时,才能启动定时器工作。
这样当超声波发射出去后,Echo由低变高,响应外部中断,则TR0=1,开始计时,应写在外部中断服务子程序中,当返回时停止计时,读出TH0和TL0即可。
按理说,这种思路应该没有问题,但不知为什么,我们用灯测试时,老是进入不了外部中断,无论是在开发板上还是在后面我们实际焊的板子上。
这个问题我到现在还不是很明白。
我觉得有可能是外部中断的优先级比定时器0中断的优先级高,只有后一级的中断优先级高于前一级时,后面的中断才有可能被响应。
但后来由于时间的关系,我也没再进行进一步的验证自己的想法。
于是我就干脆去掉外部中断0,但硬件上接的口没变,只是没有启用他们的复用功能,把它们均作为普通的I/O口来使用,刚开始就一直等待Echo由高变低,而不是响应外部中断0,一旦检测到Echo由低变高,就立即打开定时器0进行计时,然后只要判断Echo一直为高电平,则定时器0就持续计时,(暂不考虑计满的情况),直到Echo又变低,则停止计时。
若直到定时器0计满,Echo还未变低,则此时在定时器0中断子程序里设置的标志位Flag清零了,据此,则跳出此处等待,可避免死锁情况。
这样的局限性就是最大只有65ms的计时上限,0.065s*340m/s=22.1m
为所测距离上限,但对于本次课程设计所测距离要求大于200cm即可,且该模块量程只有450cm,是完全满足要求的了。
最后TMOD=0x01,没有再用外部中断0,只用了定时器0来计时,基本实现了预想的功能和设计要求。
通过本次课程设计,我懂得了软硬件联调的重要性,进一步认识到了仿真和实际自己焊的板子上的差距。
硬件,仿真,软件以及整套系统的联调,这绝非一己之力所能够完成的,需要靠四个人的紧密合作。
在短短的两周里,使我进一步增强了团队协作意识,巩固了所学的理论知识,学会了软硬件调试即进行简单硬件测试的方法。
总之,这两周的课程设计使我学到了很多有用的东西。
这次实习,我主要负责焊接电路。
说起来这是个比较苦的差事,也是个细心活,在我们组里只有我一个是女生,因此这个细心活,就理所当然有我干了。
手被烫了若干次,但是值得庆幸的是一次成功了,没有干返工的活。
刚接到这个实习题目,真的有些眼高手低,因为之前自己只是下载程序进行调试,还没有自己搭建一个51最小系统。
但是大致的想想,外围电路只有一个显示电路,超声波模块就连四根线(两条电源线,一条控制线,一条状态线),岂不相当之简单,以造成刚开始的眼高手低的局面。
我们小组四个人起初的三天总感觉一头雾水,找了好多的资料,电子版的,书本的……思路好像很清楚又感觉很模糊。
电路设计工作特别是如何布局一直是反反复复。
于是借来一个开发板,参照人家的电路布局,来在我们的万用板上进行合理的规划设计。
因为本次课程设计需要软硬件联调,而硬件是软件的基础,我不敢有丝毫的马虎。
只有硬件电路搭建的没有问题,所编的程序运行后才能出现预想的效果。
在刚领了器件那天,我先参照开发板以及郭天祥的51单片机入门教程上的电路原理图,设计出了外部时钟电路,复位电路,电源电路,并引出了下载程序的串行口,以及后面要和超声波模块连的四条线。
这下就剩下显示线路了。
对于显示这块,去年做数电课设时就用到了数码管显示,直接接相应的脚即可。
但这块却是我的一个重大失误。
我照着仿真时的显示电路直接在板子上连起来,结果用手捂住后才勉强能看到数码管所显示的数值。
在网上查资料后发现,用单片机进行数码管显示时一般都要靠三极管驱动,因为单片机具有“强下拉,若上拉”的特点,而去年数电课设给的148芯片直接就是驱动数码管显示的,因此我采用了共集电极放大电路,进行驱动放大,显示效果就很好了。
后来,在与软件联调的过程中,电路基本上在没出现什么问题。
这次的实习跟以往有所不同,以前只是独自一个人完成所有的环节,虽然任务量大一些,但是对我们今后步入工作岗位进行工作不是很有利,我个人认为本次实习,不仅锻炼我们理论与实践结合的能力,更重要加强了我们的团队意识。
这个是我本次实习收获最大的!
附录:
(程序代码)
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharqian,bai,shi,ge;//数码管显示千,百,十,个,单位为cm
uinttime=0;//探测时间
unsignedlongS=0;//探测距离,注意是长整型
ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xbf};//共阳数码管
sbitecho=P3^7;//接收端
sbittrig=P3^6;//发射端
sbitled=P1^3;//测试灯
ucharflag,a;//标志位
/*函数名称:
init()
**输入参数:
void
**输出参数:
void
**函数功能:
初始化超声波测距仪,定时器,中断
*/
voidinit()
{
led=1;
echo=0;
trig=0;
flag=1;
qian=10;bai=10;shi=10;ge=10;//数码管显示----
TMOD=0x01;//设T0为方式1
TH0=0;
TL0=0;
ET0=1;//允许T0中断
TR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 测距仪