下面是做出来的实物图:
一、前言
课题背景:
在日常生活和工业控制中,经常会需要进行位置监控和距离测量,可用的方法很多,有激光测距、雷达测距、超声波测距。与微波雷达测距、激光测距相比,超声波具有方向指向性强、能量消耗比较缓慢、在介质中的传播距离比较远等优点。但是,由于声音的传播速度和温度有关,一般情况下,温度每变化1℃,声速会变化大约0. 61 m/s。因此,超声波测距的精度受温度影响比较大,要实现高精度的超声波测距,须考虑温度变化对声速的影响,从而进行必要的补偿。
国内外发展现状:
近十年来,国内科研人员在超声波回波信号处理方法、新型超声波换能器研发、超声波发射脉冲选取等方面进行了大量理论分析与研究,并针对超声测距的常见影响因素提出温度补偿、接收回路串入自动增益调节环节等提高超声波测距精度的措施。目前国产低功率超声波探头,一般不能用于探测15m以外的物体,美国AIRMAR公司生产的Airducer AR30超声波传感器的作用距离可达30m,但价格较高。随着传感器和单片机控制技术的不断发展,非接触式检测技术已被广泛应用于多个领域。
课题设计要求:
具体要求为:
1)利用超声波传感器实现非接触式测距,并用温度传感器进行超声波补偿。要求学生在查阅各传感器资料及其应用方法的基础上,设计出硬件结构图。
2)掌握根据硬件结构图设计并绘制硬件电路图,并搭建、安装和制作硬件。
3)掌握利用各种仪器设备,如万用表、示波器等,对硬件进行调试的基本方法
4)记录实验数据,采用数据处理方法和相关软件对实验数据进行处理并加以分析,与真实数据结果对比,得出有意义的结论。
二、整体方案设计
系统方案结构框图:
方案一:
系统工作原理和功能:
本系统工作时,由单片机提供 40 k Hz 的脉冲信号,经放大后通过超声波发射器输出。超声波在空气中传播,在到达被测物体时被反射回来,由超声波接收器接收。当超声波接收器接收到反射波时,先经放大器放大,用锁相环电路检波处理后产生一个负跳变,在 INT0 产生一个中断请求信号,单片机响应外部中断请求,执行外部中断服务程序。单片机在启动发射电路时同时启动单片机内部的定时器 T0,利用定时器记录超声波发射的时间和收到反射波的时间。在外部中断程序中读取时间差,计算距离。其中温度补偿环节为:温度补偿环节,设超声波速度为v,往返时间为 t,温度为 T,v = 331.5 + 0. 61T,距离为速度除以二可得。
方案二:
系统工作原理和功能:
接口向触发引脚发送≥10 μs 的脉冲触发信号,该模块内部将发出 8 个 40 kHz 周期电平并检测回波,一旦检测到有回波信号,则 3 脚输出回响信号,所测的距离与回响信号的脉冲宽度成正比,由此可通过发射信号到收到回响信号的时间间隔计算得到距离。
超声波时序图如下:
方案比较选择:有系统总体框图可以看出方案二的结构更为简单,而且HC-SR04模块将超声波发射、接收电路集成在一起,使用方便,价格也便宜,所以选择方案二。
三、传感器工作原理
1)温度传感器DS18B20
DS18B20的引脚图如右图所示:其中UDD接电源,GND接地,I/O为数据输入/输出口。
DS18B20的读写时序和测温原理与DS1820相同,只是得到的温度值的位数因分辨率不同而不同,且温度转换时的延时时间由2s减为750ms。 DS18B20测温原理如图所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。
超声波模块HC-SR04
HC-SR04模块的引脚图如图所示:
VCC Trig Echo GND
Vcc、 Trig(控制端)、 Echo(接收端)、 Gnd,工作原理如下:
(1)采用IO 触发测距,给至少10us 的高电平信号;
(2)模块自动发送8 个40khz 的方波,自动检测是否有信号返回;
(3)有信号返回,通过IO 输出一高电平,高电平持续的时间就是
(4)超声波从发射到返回的时间.测试距离=(高电平时间*声速)/2;
四、硬件电路设计
整体硬件设计原理图如下图所示:
1)温度测量模块
温度测量选择DS18B20,单片机口接 DS18B20 数据总线,控制 DS18B20 进行温度转换和传输数据,数据总线接10kΩ的上拉电阻,作用是使总线控制器在温度转换期间无需一直保持高电平。DS18B20 protel 硬件图如右图所示。
超声波测距模块
本次设计采用HC-SR04模块,采用单片机IO 触发测距,给至少10us 的高电平信号;模块自动发送8 个40khz 的方波,自动检测是否有信号返回;有信号返回,通过IO 输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速)/2;HC-SR04硬件protel图如下图所示:
数码管显示模块
本次显示用到数码管为共阴极数码管,显示内容为温度值和检测的距离值,单片机控制其段选码和位选码就能控制数码管的点亮情况,同时本次试验所用的数码管的显示方式为动态显示。数码管的protel硬件图如下图所示:
五、软件设计及仿真调试
软件设计流程图:
主函数流程图
加入温度传感和超声波模块后的流程
仿真调试
由于在proteus软件中找不到超声波传感器,所以就用了一个方波作为单片机接收到的回响信号,仿真结果如下图所示:
图中左边显示的是温度29度,右边显示的是测得的距离290cm。
改变回响信号频率或改变温度值,测得的距离也将不同,如下图所示:
增大回响信号频率,显示结果如下:
增大温度值,显示结果如下:
同时还可以用示波器观察发射信号和回响信号波形,如下图所示:
图中黄色的代表发射信号脉冲(20us左右),红色代表回响信号波形。
最后做出的硬件调试结果如图所示:左边显示的是补偿前的距离,右边显示的是补偿后的距离
由上图可以看出温度对超声波测距有影响,而且随着距离的增大,所补偿的距离也越多,这是因为距离越大,超声波传播时间也越长,这样温度对声速的变化也会凸显出来。
六、设计总结及改进思路
1)系统技术特点:
本次课程设计采用HC-SR04超声波测距模块测出距离,考虑到温度对声速的影响,需要将温度值检测出来,然后修正声速值,单片机发送一个大于10us的发射脉冲,然后检测HC-SR04模块的回响信号的高电平时间,测试距离=(高电平时间*声速)/2,然后将距离值同数码管显示出来。
2)技术层面的改进:
本次课程设计显示模块采用的是数码管,实验时发现显示时会出现闪烁问题,还存在显示空间不足的缺陷,8位数码管只能显示温度值和补偿后的距离值,或者显示补偿前后的距离值,因此可以采用lcd液晶显示,既解决了显示闪烁的问题,又有足够的空间显示。
为期将近三天的传感及检测课程设计,在克服一个又一个困难的过程中,巩固了我们所学的理论知识,还培养我的实际动手能力,还培养我们在实际的工程设计中查阅专业资料、工具书或参考书,掌握工程设计手段和软件工具,并能用设计报告表达设计思想和结果的能力。
这次课程设计不仅培养了我的设计思想和仿真及编写程序的能力,更检验了我对本门课学习的情况,培养我们严肃认真的学习态度。过程中我通过集体讨论设计方法、设计步骤等问题,使我感受到团队合作的重要性。真正做到理论联系实际,提高动手能力和分析问题、解决问题的能力,并能用设计报告表达设计思想和结果的能力正是我们这次课程设计的目的。
单片机源程序如下:
#include #define uchar unsigned char #define uint unsigned int #include sbit RX=P2^1; sbit TX=P2^0; unsigned long time=0; unsigned int timer=0; unsigned char posit=0; unsigned long S=0; unsigned long S0=0; uchar c[7]; uint temp;// variable of temperature uint t; float v; bit flag1; // sign of the result positive or negative bit flag =0; sbit DS=P2^2; //define interface sbit dula=P2^6; sbit wela=P2^7; unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; void delay(uint count) //delay { uint i; while(count) { i=200; while(i>0) i--; count--; } } void dsreset(void) //send reset and initialization command { uint i; DS=0; i=103; while(i>0)i--; DS=1; i=4; while(i>0)i--; } bit tmpreadbit(void) //read a bit { uint i; bit dat; DS=0;i++; //i++ for delay DS=1;i++;i++; dat=DS; i=8;while(i>0)i--; return (dat); } uchar tmpread(void) //read a byte date { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tmpreadbit(); dat=(j<<7)|(dat>>1); } return(dat); } void tmpwritebyte(uchar dat) //write a byte to ds18b20 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //write 1 { DS=0; i++;i++; DS=1; i=8;while(i>0)i--; } else { DS=0; //write 0 i=8;while(i>0)i--; DS=1; i++;i++; } } } void tmpchange(void) //DS18B20 begin change { dsreset(); delay(1); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion } uint tmp() //get the temperature { float tt; uchar a,b; dsreset(); delay(1); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread(); b=tmpread(); temp=b; temp<<=8; //two byte compose a int variable temp=temp|a; tt=temp*0.0625; temp=tt*10+0.5; return temp; } /*void zh(uint temp) { uchar A1,A2,A2t,A3; A1=temp/100; A2t=temp%100; A2=A2t/10; A3=A2t%10; c[0]=table[A1]; c[1]=table1[A2]; c[2]=table[A3]; }*/ void Conut() { ime=TH0*256+TL0; time=time*12/11.0592; TH0=0; TL0=0; v=331.5+0.607*t; S0=(long)(0.17*time); S= (long)(time*v/2000); //??????CM if((S>=4000)||flag==1) // { flag=0; S=0; //c[4]=0x30; //c[5]=0x50; //c[6]=0x50; // c[7]=0x79; } else { c[4]=table[S%10000/1000]; c[5]=table[S%1000/100]; c[6]=table1[S%100/10]; c[7]=table[S%10/1]; c[0]=table[S0%10000/1000]; c[1]=table[S0%1000/100]; c[2]=table1[S0%100/10]; c[3]=table[S0%10/1]; } } /********************************************************/ void zd3() interrupt 3 //T1 { TH1=0xf8; TL1=0x30; timer++; if(timer>=100) { timer=0; flag1=1; } } void zd0() interrupt 1 { flag=1; } void hc_sr04() { TX=1; //800MS _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); TX=0; …………
设计资源 培训 开发板 精华推荐
- LTC4090 演示板,具有 2A 高压降压稳压器的 USB 电源管理器
- LT3088HST 升压型固定输出稳压器的典型应用
- RT7295A 3.5A、18V、500kHz ACOTTM 同步降压转换器的典型应用
- AD8602DRZ-REEL7 高端运算放大器电流监视器的典型应用
- LDF 1-A 极低压降固定稳压器的典型应用
- STEVAL-ILL063V1,基于浮动升压拓扑中的 LED5000 的 3A LED 驱动器评估板
- 基于 MCF5235CVM150 MPU ColdFire MCF5xxx 处理器的 M5235EVB、M523xEVB 评估板
- AM1G-2405DZ ±5V 1 瓦 DC-DC 转换器的典型应用
- 苏扬恩号
- loli 萝丽 萝莉8通道接收