超声波测距仪Word下载.docx
《超声波测距仪Word下载.docx》由会员分享,可在线阅读,更多相关《超声波测距仪Word下载.docx(26页珍藏版)》请在冰点文库上搜索。
Asthetestingofultrasonicwavesisoftenmorerapid,convenientandsimplecomputationandeasytodoreal-timecontrolandmeasurement.What'
smore,it'
sprecisioncanmeetthepracticalrequirementsofindustry.Becauseofthesecharacters,thereisawiderangeofusesofultrasonicrangefinder.
Theexperimentistoproduceaultrasonicrangefinderbasedthepicmicrocontroller.Themainprincipleisbasedonthereflectivepropertiesofultrasound,recordingtimecanbecalculatedbythespeedofsounddistance.
Thefinalperformanceforthefinaltest:
themaximumrangeof4~5meters,canbeaccuratetothecentimeterlevel(errorwithin5cm).
关键字:
PIC16F877;
单片机;
超声测距;
测距
Keyword:
PIC16F877;
SCM;
ultrasonicranging;
ranging
二.系统总体设计
1.超声波测距原理
声波发生器内部由两个压电片和一个共振板组成。
当它的两极外加脉冲信号,且其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,便产生超声波。
反之,如果两极间未加外电压,当共振板接收到超声波时,就成为超声波接收器。
超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时,即得到发射超声波与接收超声波的时间间隔t,根据被测距离s=vt/2来得到测量距离。
由于超声波速度v与温度有关,所以如果温度变化比较大,应通过温度补偿的方法加以校正(测量精度不高,可认为温度基本不变)。
测量距离的公式为:
L=C×
T
(L为测量的距离长度;
C为超声波在空气中的传播速度,大概为340m/s;
T为测量距离的时间差)
2.超声波发射模块
超声波的发射主要装置为超声换能器——压电陶瓷换能器。
其固有频率为40KHz左右,当给其输入一个频率与其固有频率相同的周期信号时,压电陶瓷发生谐振,便会产生超声波。
40KHz的周期信号由单片机的portc1输出。
在单片机开始运行时,将CCP2设置为PWM模式,并设置其脉宽和信号周期,便可以在portc1输出符合要求的周期方波。
本实验中,周期方波的脉宽为12.5us(即占空比为50%),周期为40KHz,高电平为5V,低电平为0V。
如果将单片机输出的信号直接输入到超声换能器,会导致单片机的驱动能力过小,因此在本实验中我采用了一片4069芯片,运用其中的三个与非门来提高信号驱动能力。
3.超声波接受模块
超声波的接受主要装置为超声波探头(也是压电陶瓷换能器)。
当其接收到超声波时,便会产生相同频率的信号。
显然由于超声波在传播的过程中,能量耗减,因此超声波探头接收到的超声波是相当微弱,其产生的同频率的信号(近似为正弦波)也相当微弱(在10mV左右)。
接收到的微弱的超声波信号,必须经过放大才可以使用。
本实验我运用了三级放大电路:
每级是由集成运算放大器(LM324)组成的比例放大电路,理论放大倍数为10.因此理论上总的放大倍数为1000倍(但在实际上无法达到如此大的放大倍数)。
放大后的信号由于高于单片机的低电平阈值,故必须再经过一个电压比较电路(由LM358N组成)输出矩形波。
为了达到最后单片机可以准确识别的电压信号,因此在电压比较器的输出端接一个上拉电压(取稳压输出电压5V)。
CPP1此时处于输入捕捉模式。
当上述信号输入到CPP1时,CPP1自动捕捉送入的每4个下降沿,产生一次CPP1捕捉中断。
在CPP1中断处理中,将工作于同步计数器的tmr1的数值记下,然后进行数据处理。
4.设计原理总图
移动int中断按钮
5.主程序
主程序为单片机工作进行前期准备工作和显示欢迎界面
(1)前期准备工作
①D、E端口的设置
D端口的8个引脚和E端口的0和1引脚要驱动LCD显示器。
因此要通过trisd和trise两个寄存器的修改将它们设置为输出。
由于D端口有两种工作模式——并行从动端口方式(PSP模式)和通用I/O端口方式。
其中PSP并行从动端口用于单片机芯片与外界处理器(可以是MCU、MPU、DSP等)进行通信,故而此处D端口用不上这种工作方式,必须通过将trise的bit4(即PSPMODE控制位)清0来设置为通用I/O端口方式。
②C端口的使用
由于要使用CPP1的输入捕捉功能,故将C端口的bit2(即RC2/CPP1)设置为输入,用于接收超声探头接收到超声波后产生的信号;
由于要使用CPP2的PWM脉宽调制功能,故必须将C端口的bit1(即RC1/CPP2)设置为输出,用于发出驱动超声换能器的电压信号,以发射超声波。
③tmr1和tmr2的设置
由于CPP1输入捕捉模式和CPP2的PWM模式的要求,必须将tmr1和tmr2设定为定时器工作方式(如果tmr1~2工作于异步计数器方式,则CCP1~2在相应的模式下就不能进行正常操作)。
此处除了设置它们为定时器外,还设置了其分频比为1:
1.
(2)显示欢迎界面
调用dis_Welcome子程序,以在LCD上闪烁显示“Welcome!
”。
(原理图如下)
6.dis_Welcome子程序
dis_Welcome程序是一个循环程序。
要跳出此循环,必须加一个变量寄存器quitwel。
为了使字符闪烁,故加上两个计数寄存器:
lcd_count1~2.(原理图如下)
(1)字符闪烁的实现
在这个程序开始运行时,初始化这两个计数器(lcd_count1清0,lcd_count2置为0ffh)。
【lp1开始】每显示一个字符,lcd_count1加1;
当字符全部显示后,lcd_count1加至8h。
一旦lcd_count1达到8h,便让其跳至lp2子程序。
在lp2程序中,每调用一次延时子程序(可延时0.671ms),lcd_count2便减1,当lcd_count2一旦减为0,便对lcd_count2重新赋值为offh。
在lcd_count2减至0的这一段时间(约为255(0ffh)×
0.671=171.105ms=0.171s)中,“Welcome!
”一直显示在LCD上。
在lcd_count2重新赋值后,对LCD进行清屏,每次清屏都将lcd_count2减1并调用延时子程序。
一旦lcd_count2减为0,便会对两个计数器重新赋值。
在lcd_count2减至0的这一段时间(也约为255(0ffh)×
0.671=171.105ms=0.171s)中,LCD上一直无显示。
在赋值之后,程序重新跳到lp1,重复前面的显示。
如此循环往复,显示0.171s后,清屏0.171s,从而造成闪烁效果。
(2)跳出循环的控制
在dis_Welcome程序开始时,对quitwel清0.在int中断处理中,有操作会将quitwel置为1h。
在dis_Welcome中,每次字符显示之后或是清屏操作之后都会判断它是否为0,一旦为非0,便会跳出显示程序的循环,进入wait等待。
如此,便将跳出循环的这一操作置于int中断处理中。
7中断处理程序
在每次中断处理的共同操作:
①中断现场保护
②中断类型的判断:
int中断、CPP1捕捉中断、tmr1溢出中断。
判断之后,进入相应的中断处理子程序。
③中断现场恢复
④返回(原理图如下)
(1)int中断处理
在int中断处理中,要对CPP1和CPP2进行配置,并负责跳出显示循环的跳出控制寄存器quitwel的设置。
①CPP1的配置
开启tmr1的溢出中断(bsfpie1,tmr1ie)和CPP1中断(bsfpie1,ccp1ie)。
通过设置cpp1con(赋值为b'
00000110'
),将CPP1设置为捕捉模式,捕捉CPP1脚送入的每4个下降沿。
清除CPP1的中断标志。
②CPP2的配置
启用tmr2;
配置CPP2为PWM模式,即设置ccp2on<
3:
0>
=0110。
并配置其脉宽及周期。
CPP2的周期公式
PWM周期=(PR2+1)×
4Tosc×
(tmr2预分频值)
为了满足超声压电陶瓷的谐振要求,周期应取其谐振频率40KHz,即周期为25us。
而在主程序中,已设定tmr2的预分频值为1:
1。
由于单片机的晶振周期为Tosc=1us。
故
PR2=(PWM周期)/4Tosc-1=24d=18h
CPP2的脉宽公式
PWM脉宽=ccpr2l:
ccp2on<
5:
4>
×
Tosc×
(tmr2的预分频值)
设计要求为CPP2产生的信号为方波信号,故其脉宽为12.5us。
ccpr2l:
=(PWM脉宽)/Tosc=50d=32h=110010b
故应设置ccpr2l=1100b,ccp2on<
=10b。
(2)CPP1捕捉中断处理
在此中断处理中,测距所需要的时间可由此时的的tmr2值得到,因此数据处理才是本中断最主要的功能。
此外,还负责结果的LCD显示。
①调用mtp乘法程序
将tmr2的值与声速相乘,得到距离。
由于tmr2和声速值都是为16位宽的二进制数,因此乘积为一个32位宽的二进制数,需要4个寄存器存储(即product1~4)。
调用BtoBCD数制程序:
由于LCD显示需要十进制数,故需要将计算出的结果进行数值转换(二进制到十进制)。
由于最大的32位二进制数转化为十进制数时,可以转换为10位的十进制数BCD码(4294967295)。
故将转换结果存于10个寄存器bcd0~9.
②调用dis_distance程序
为了在LCD显示器的第一行显示字符串“distance(m)=”。
③调用dis_bcd程序
在LCD显示器的第二行显示最后测距结果。
由于乘积结果转换为BCD码后,有10位数据。
根据mtp乘积程序处理的数据的单位(tmr2的值存储的时间为us,声速为m/s),故小数点在bcd6和bcd5之间。
由于测距范围在10m之内,因此显示时,先判断十位(bcd7)数字是否为0,为0则不显示,否则依次显示其后代bcd6~3(精度的要求:
精确到mm级)。
(3)tmr1溢出中断处理
为了防止距离过远而造成的,程序始终无法出现CPP1捕捉中断而发生长时间无显示的错误。
8.mtp乘法程序
主要是借助二进制数的特点,根据乘数将将被乘数移位相加实现。
具体流程参见下图。
9.BtoBCD数制转换程序
主要是将需转换值与权值比较,根据其其借位情况判断BCD码的数值。
具体流程详见下面流程图。
10.dis_distance和dis_bcd程序
程序流程图如下图。
三.硬件连接
1.稳压电源(5V)提供电路仿真图
从电源插座进来的是9V直流电,经一片三端稳压器7805,将其转换为5V的稳定电压。
其中C1~C4组成的电路为电源滤波电路。
大电容和小电容并联滤波,以保证电源不受外围电路的影响。
(其中的大电容也可换为470uF,没有影响)
2.超声波发射电路图
从单片机的CPP2输出的周期脉冲,增大发射功率,故让其经过一个与非门混联电路,然后后驱动超声波换能器发出超声波。
电路图中用的是74HC00,它是一个封装了4个与非门的芯片。
但在实验的实际电路中,我使用的是4069,使用了它的三个与非门,而与非门都用作非门使用。
而查阅4069的管脚知道没有使用的与非门的输入都接高电平。
3.超声波接收电路原理图
图中C1
(1)为超声波探头接收到超声波后产生的电压信号。
此信号一般都是相当微弱(10mV左右),如果直接输入到单片机的CPP1端,单片机根本无法识别。
因此,必须将此信号放大。
这个电路的前三个LM324集成电路组成的电路为三级反向比例放大电路,其比例系数为10,整个放大电路放大倍数理论值为1000倍(实际电路中放大倍数远远不够)。
最后一个LM358集成电路构成一个电压比较器。
而在实际运用的电路中,LM358N始终不能满足要求,因此我变换了电压比较器,采用了14个管脚的LM339N来完成我的电路所要达到的效果。
而实验结果证明三级放大后的电压和经过上拉电压的信号已满足条件,只是电压波形的上部存在失真。
4.LCD显示器与单片机的连接图
根据硬件要求,此16位2行的点阵式液晶的16条引脚接法如下图:
液晶显示模块
7~143
77~14
单片机
RE1(9)E(6)
(2)VCC
RE0(8)R/S(4)
(1)
(5)R/S
RD0~RD7
地
不同的LCD所需要的显示不同,在我设计的电路中LCD显示屏的3号管脚我通过一个100的电阻直接接地,来达到效果!
而LCD的15,16号管脚可以打开LCD的背光灯,而在实验中,我15号管脚通过100的电阻接高电平,16号管脚直接接地,完成了LCD管脚的分配。
四.调试过程
问题1:
乘法程序
在软件设计中,遇到的第一个问题就是数据处理中的二进制数乘法。
对于二进制数的特点和单片机数据处理的特点,显然不能遵循十进制数的乘法规则。
两个16位宽的二进制数,他们相乘的结果是332位宽的二进制数。
在惯性思维的影响下,是我们组一度陷入迷茫和停滞。
在网上查了许多关于二进制数的乘法程序,终于找到一个在我们思维可以接受的解决办法。
那就是:
根据乘数将将被乘数移位相加实现乘法。
从乘数的低位到高位,如果为此位为0,则将被乘数直接左移一位,判断下一位乘数是否为0;
如果此位是1,则将被乘数加到乘积存储寄存器product,然后再将被乘数左移一位,判断下一位乘数是否为0;
知道处理完最后一个乘数为止。
即可求出乘积。
问题2:
发射部分的问题
电路我是一部分一部分连接的,为了方便调试,首先我连接的就是发射部分的电路,并进行了调试。
发射部分本来按照电路图,应该运用74HC00,但是为了方便,我使用了更加普遍的4069作为运放,来增加发射电路的驱动能力。
而查阅了管脚图以后,我使用了4069的三个与非门实现驱动,并将相应的电源和地接好。
接着就是检查驱动能力了,我在发射电路的左端用信号发生器,产生了一个频率为40KHZ,幅度为10V的方波,但是在接受端的示波器上接收不到相应的类正弦波,得到的是直流。
我确信我连接部分没有问题,难道是管脚用错,我再次查阅了管脚,这次我打开了很多4069管脚的网页,后来在一张网页中发现,4069中不使用的与非门的输入接高电平。
于是我重新连接了电路,再次调试,得到了想要的结果,发射电路就告一段落。
问题3:
接收电路的问题
在接收电路的设计中,放大电路有两种方案——晶体管放大和集成电路比例放大。
方案的选择成了一个无法回避的问题。
考虑到电源电压为5V,晶体管放大电路的工作点(Q点)不易确定,且相比之下,多级晶体管放大电路比较复杂,故我使用了使用集成电路比例放大电路。
使用芯片为LM324N
按照电路图将电路各个部分连接完毕后我开始了调试,而接收部分的调试,是整个硬件电路调试的核心和难点。
我在接收端的输入用信号发生器给予了一个频率为40KHZ,幅度为0.2V的方波信号,然后用示波器在比较器的输出端口测量,得到了上部失真的信号。
这让我兴奋异常,但仅仅是一瞬间的感觉,因为我发现,输出的波形的上部只能达到4V,不能达到5V,而下部超过了1V。
对于单片机来讲4V左右可以默认为高电平1了,但是如果下部超过1V,那么低电平就无法识别。
于是我开始考虑电路的问题,后来我觉得是因为上拉电阻的问题,将低电平拉的过高,于是我更换R12,R13的电阻值,R12换成了10k电阻,R13换成了30k的电阻,发现能够很好的满足要求。
问题4:
发射和接受联合调试的问题
当分别把发射电路和接受电路连接并调试好后,我将整个电路连接起来,并安装上超声波发射探头和接受探头。
这时我在发射端输入给了一个频率为40kHZ,幅度为5v的方波信号,通过超声波发射探头和接受探头以后,在接收端的输出用示波器观察输出信号,发现是高电平可达到4.5v,低电平约为0.5v左右的类似方波的信号,这让我欣喜若狂,表明做困难的发射和接收电路调试完成。
问题5:
软硬件联合调试的问题
当我把LCD也连接好后,整个硬件电路已经测试完毕,而我的搭档也成功将软件部分的代码修饰完毕,所以我们开始了整个电路的测试。
将单片机烧完以后,我将单片机连接入电路,插上电源,目不转睛的注视着LCD屏幕。
我摁下了复位键,LCD屏幕清晰的显示出了Welcome,这让我们十分开心,离成功我们又前进了一大步。
然后我摁下了中断键,但是怎么摁键都不会出现预期的distance,这让我们很苦恼,硬件主要我在做,我确信不会有什么问题!
于是我们两一起看软件,想找点问题。
后拉主要负责软件的我的搭档找出了问题,是一个中断他设错了,我们简单的改正了错误!
再次迫不及待的进行测试。
上电,看屏幕,复位键,中断键,这次LCD显示屏上清晰的显示出了distance以及相应距离,我们移动面包板,并摁下中断键,显示的距离也相应改变。
我差点激动的哭了出来,一个月的辛劳终于有了收获。
问题6:
电路板焊接中遇到的各种问题
问题描述:
焊点虚焊、集成芯片插错……
解决方案:
使用数字万用表,用排查法解决。
五.参考文献:
PIC单片机实用教程——基础篇(五号宋体)
李学海
北京航空航天大学出版社
使用说明:
的确是一本不可或缺的教材,本书列举了很多实用的具有实战意义的例子,单片机入门就是通过把这本书里的好例子一字一行敲进电脑去来实现的。
PIC单片机实用教程——提高篇
继承了前面基础篇的风格,例子也具有实战意义,主要讲RA、TMR2的使用和CCP模块的PWM脉宽调制功能。
六.实验心得体会
期末考试完之后,为期1个月的单片机实验开始了。
整个实验中,我们与时间赛跑,与困难竞争,向成功追逐。
想想这一个月的各种悲喜经历,都好像已被时间老人深深印在脑海,永不忘却。
开始的一周,主要任务是熟悉单片机的基础知识,更重要的是选题。
这一阶段的学习,确实在这个小学期起到了奠基的作用。
那段时间每天早睡早起,在实验室泡着,天天看书,并对着书上的代码敲着程序,一点点上手。
那段时间是苦闷的,但却是意义重大的,我还记得第一次通过自己对书上代码的修改,编出了键盘的程序以后,那种小小的自豪感彻底满足了我。
基础篇看完后,我和我的同伴开始了选题,我最初提出的题目是“电子称”,而他提出的题目是“激光竖琴”,我们商量着于是分别上网查了关于对方题目的资料,最后我们得出的结论是,这两个题目都不行。
在时间迫近时,我们不约而同的想到了一个答案“超声波测距仪”,在上网搜查资料后,我们决定确定这个题目。
并定出了大致的方案,以指引我们的工作方向
第二周将设计报告交了之后,便着手开始编写程序。
自己编写程序是一件令人头痛的事,因为前面都是看着书上的设计思路,将其翻译为汇编代码。
我负责编写了mtp乘法程序的代码,在找了资料后,我开始上手。
等我调试好交给同伴整理时,时间已过了一半。
为了抓紧时间,并且我觉得我们这个实验软件部分不算很难,硬件部分的调试倒是一个大难题,就算都对,但调试不出来,是没人能帮你的。
于是我们决定分工,从此刻开始我主要负责硬件,同伴则负责软件的编写和调试。
于是我在老师那领了面包板,开始了我硬件的设计和调试工作。
到了第三周结尾,我基本将我的硬件调试完毕,而同伴的软件也差不多弄好,于是我们进行了第一次联合的调试,但发现只有Welcome的显示,并没有距离的显示。
于是我们各自静下心来找原因。
但是这时我小学期遇到的最大问题来了,本来只是显示没有距离,但是第二天我去调试,连Welcome也没有。
我又分别用信号发生器和示波器去检查发射部分,发现发射部分是直流电压,接受部分也接收不到信号,我一下子就有万念俱灰的感觉,有一下子都想放弃了,觉得实在是出不来东西,感到很沮丧。
但是看到周围的同学一个个成功的出了结果,我觉得很不甘心。
我要重做,我像老师重新借了面包板,重新去中发买了芯片,重新连接电路,从发射,到接受,到LCD显示屏,再到单片机,我一次次的进行测试。
但在调试过程我遇到的问题又来了,我发现在超声波接受探头的接收端有个频率为450HZ的三角波信号,幅度有500mv左右大,而且十分稳定。
我初始怀疑是噪声,但是噪声怎么能这么稳定,频率和波形都很稳定。
我一度很苦恼,于是我询问了老师,邱老师为我联系了电路的孙老师,经过和孙老师的一番谈话,我找出了问题。
我重新一级级去测量放大和电压比较器,最后发现还是上拉电阻的问题,我再次更换了上拉电阻。
然后将测试号的单片机装上电路,终于可以测出距离。
而且误差不大,我找来了老师,兴奋的看这一成果。
接着我又去焊了电路板,将面包板的东西复制了过去,成功的完成了实验。
但是我电路板的焊接被邱老师指出了点问题,于是我又重新将一些地方焊接漂亮,减少了误差。
至此实验结束,并成功验收完毕。
小学期告一段落。
在本次实验中,我学到了很多东西。
比如编程时,熟练掌握了mplab的用法;
在硬件设计时,又查书了解了一下滤波器和放大电路的知识;
在焊电路板时,掌握了烙铁的使用方法,并基本已学会了电路板的焊接要领;
更重要的是,在这次试验中我学会了坚持,不放弃,最终胜利是属于我的。
不仅学到了知识,我还收获了许多“实验室生活”的经验。
在与同伴的分工合作中,虽然出现过问题,但最终我们的合作以成功结束。
在此首先感谢