实验报告
传感器应用技术
课程名称超声波测距温度补偿
班级10电子1
姓名李百仪
学号10732110
指导教师承浩
2011-2012学年第二学期
(一)设计目的
采用超声波测量距离的方法,实时检测现场温度用以实现实际波速的校准,减小温度对测距产生的误差,最终由LCD液晶显示所测距离、温度及对应的波速,测量范围为7cm~1m,误差±2cm。
(二)设计方案
超声波传声器结构简单、行能可靠、成本低、易集成,因此采用超声波测距的方式进行距离测量。
在常温下,超声波的传播速度为340m/s,但其传播速度V易受到空气中的温度、湿度、压强等因素的影响,其中温度的影响最大。一般温度每升高1摄氏度,声速增加约为0.6m/s。表1为超声波在不同温度下的波速值。
表1 一些温度下声速
由此可见温度对超声波测距系统的影响是不可忽略的。为了得到较为精确的测量结果,必须对波速进行温度补偿。通过实验可获得波速与温度之间的经验模型:V=331.5+0.607T,T为现
场温度,V为实际波速。从式中可看出,要获得精确的波速值,必须首先获取现场温度T的大小。本设计采用ds18b20检测现场温度,用以实现实际波速的校准。
超声波测距原理
超声波传感器分机械方式和电气方式两类,它实际上是一种换能器,在发射端它把电能或机械能转换成声能,接收端则反之。本次设计超声波传感器采用电气方式中的压电式超声波换能器,它是利用压电晶体的谐振来工作的。它有两个压电晶片和一个共振板。当它的两极外加脉冲信号,其频率等于压电晶片的固有振荡频率时,压电晶片将会发生共振,并带动共振板振动,产生超声波。反之,如果两电极间未外加电压,当共振板接收到超声波时,将压迫压电晶片作振动,将机械能转换为电信号,就成为超声波接收器。在超声波电路中,发射端输出一系列脉冲方波,脉冲宽度越大,输出的个数越多,能量越大,所能测的距离也越远。超声波发射换能器与接收换能器其结构上稍有不同,使用时应分清器件上的标志。超声波测距的方法有多种:如往返时间检测、相位检测法、声波幅值检测法。本实验采用往返时间检测法测距。其原理是超声波传感器发射一定频率的超声波,借助空气媒质传播,到达测量目标或障碍物后反射回来,经反射后由超
声波接收器接收脉冲,其所经历的时间即往返时间,往返时间与超声波传播的路程的远近有关。测试传输时间可以得出距离。
假定s为被测物体到测距仪之间的距离,测得的时间为t/s。超声波传播速度为v/m·s-1表示,则有关系式(1)
s=vt/2 (1)
温度补偿及其原理
目前,大多数温度测控系统在进行温度测量时,通常采用模拟式温度敏感元件,如热电阻、热电偶、红外测温仪等,将温度转化为电信号,经过信号放大电路放大到合适的范围,再由A/D 转换为数字量。此种形式的温度测量结构复杂,测量精度易受原器件参数影响。
DS18B20是Dallas公司开发的1-wire(单总线)高精度数字式半导体温度传感器,它具有节省I/O口弦资源,结构简单,成本低廉,精度高,便于总线扩展和维护等诸多特点。1-wire是将数据线、控制线、地址线合为1根信号线。
DS18B20的测温原理如图1所示,图1中低温度系数的晶振的振荡频率受温度很小,用于产生固定频率的脉冲信号送给计数器1,高温度系数晶振随温度变化其振荡频率明显改变,产生的信号作为计数器2的脉冲输入图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入计数器1和温度寄存器中,计数器1的温度寄存器被预置在-55℃所对应的一个基数值。
计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时温度寄存器的值将加1,计数器1的预置将重新被装入,重新开始对低温度系数晶振产生的脉冲进行计数。如此循环直至计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图1中的斜率累加器用于补偿和修正测温过程中振荡器温度特性的非线性,以产生高分辨率的温度测量。其输出用于修正计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值。由经验公式V=331.5+0.607T得出现场波速,实现温度补偿。
图1
另外,由于DS18B20单总线通信功能是分时完成的,因此他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
(三)硬件设计
·系统总体设计
本系统由超声波发射、回波信号接收、显示和单片机等硬件电路部分以及相应的软件部分构成。
整个系统由单片机AT89S52控制,超声波传感器采用收发分体式,分别是一支超声波发射换能器TCT40—16T和一支超声波接收换能器TCT40—16R。超声波信号通过超声波发射换能器发射至空气中,遇被测物反射后回波被超声波接收换能器接收。进行相关处理后,输入单片机的INT0脚产生中断,计算中间经历的时间,同时再根据具体的温度计算相应的声速,根据式(1)就可得出相应的距离用来显示。
·超声波发射部分
超声波发射部分是为了让超声波发射换能器TCT40—16T能向外界发出40 kHz左右的方波脉冲信号。40 kHz左右的方波脉冲信号的产生通常有两种方法:采用硬件如由555振荡产生或软件如单片机软件编程输出,本系统采用后者。编程由单片机P1.0端口输出40 kHz左右的方波脉冲信号,由于单片机端口输出功率不够,40 kHz方波脉冲信号分成两路,送给一个由74HC04组成的推挽式电路进行功率放大以便使发射距离足够远,满足测量距离要求,最后送给超声波发射换能器TCT40—16T以声波形式发射到空气中。发射部分的电路,如图2所示。图中输出端上拉电阻R1,R6,一方面可以提高反向器74HC04输出高电平的驱动能力,另一方面可以增加超声换能器的阻尼效果,缩短其自由振荡的时间。
图3 超声波发射电路
·超声波接收部分
传统的接收电路采用LM386等功率放大器件,结合其他一些硬件电路实现,电路结构复杂,制作成本较高,且检测灵敏度没有保障。本设计选用了索尼CX20106A芯片,这是一款专用的红外信号接收芯片,内部集成了检波、除噪、放大电路,具有很高的信号检测灵敏度,且输出信号电平等级与单片机相同。
上述TCT40—16T发射的在空气中传播,遇到障碍物就会返回,超声波接收部分是为了将反射波(回波)顺利接收到超声波接收换能器TCT40—16R进行转换变成电信号,经过索尼
CX20106A芯片对此电信号进行放大、滤波、整形等处理后,得到一个负脉冲送给单片机的
P3.2(INT0)引脚,以产生一个中断。超声波接收电路图如图4所
图4 超声波接收电路
·温度补偿电路
温度采用DS18B20传感器进行测量,P1.3接DS18B20数据总线,控制DS18B20进行温度转换和传输数据,同时数据总线上还接10k的上拉电阻。本系统对DS18B20采用外部供电,其优点在于I/O线不需要强上拉,而且总线控制器无需在温度转换期间一直保持高电平。这样在转换期间可以允许在单线总线上进行其他数据传输,硬件结构如图5所示
图5
·单片机控制电路
单片机采用STC89C52,借用实验箱电路,单片机原理电路如图6所示
图6 单片机原理电路
·显示电路
采用简单的数码管显示
图7显示接口电路图
(四)软件设计
系统软件设计采用模块化设计,主要包括主程序设计、T1中断服务程序、INT0外部中断服务程序、温度测量子程序、距离计算子程序、显示子程序、延时子程序等。
系统软件编制时考虑相关硬件的连线,同时还要进行存储空间、寄存器以及定时器和外部中断引脚的分配和使用。本设计中P1.0引脚连接到7HC04推挽放大电路再连接到超声波发射传感器,P1.0引脚输出的将是软件方式产生的40 kHz方波,而P3.2(INTO)则被用来接收回波。P1.3引脚连接18B20进行温度测量。
主程序首先要对系统环境初始化,设置定时器T0工作模式为16位定时/计数器模式,置位总中断允许位EA并对液晶清屏,显示边框等基本显示;然后调用超声波发生子程序送出一个超声波脉冲,同时调用测温子程序进行现场温度的测量并由经验公式V=331.5+0.607T得出现场温度对应的波速。为了避免超声波从发射器直接传送到接收器引起的直射波触发,需要延时约0.1ms 后才打开外中断0接收返回的超声波信号。由于采用的是12mhz晶振,计数器每计一个数就是1us,所以当主程序检测到接收成功的标志位后,将计数器T0中的数按式(3-1)计算,即可得被测物体与测距之间的距离。则有
CM (3-1)
其中:为计数器T0的计数值,V为现场温度对应的波速。
测出距离后,结果由液晶显示出来,然后再发超声波脉冲调用温补子程序重复测量过程。·主程序流程图
·超声波发生子程序和超声波接收中断程序设计
超声波发生子程序的作用是通过P1.0端口发送两个
左右的超声波脉冲信号(频率为40khz的方波),脉冲宽
度约为12us左右,同时把计数器T0打开进行计时。
超声波测距主程序利用外部中断0检测返回超声波
信号,一旦接收到返回超声波信号(INT0低电平),立即
进入超声波接收中断程序。进入该中断后,就立即关闭计
数器T0,停止计时,并将测距成功标志子赋值1,寄存器
用00h单元。
·温度采集及波速补偿程序设计
DS18B20对时序和电性参数要求很高,所以单片机
在通过单总线接口访问DS18B20时,其工作流程必须要
遵守严格的操作时序,如果时序中任意一步缺少或顺序错
乱,DS18B20将不会响应。DS18B20的操作顺序是:第
一步:对DS18B20初始化;第二步:发送ROM命令;
第三步:发送功能命令。超声波测距系统上电后,单片机
开始初始化DS18B20,检测现场温度,软件控制DS18B20
的具体流程图如图9所示
图9
通过以上程序,超声波测距系统上电启动后即可获得现场温度,在进行测距工作时单片机会把温度值通过公式V=331.5+0.607T补偿到超声波的波速中,使得现场的实际波速得到校正,从而降低温度对测距结果的影响,提高超声波测距系统的精度。
(四)调试及性能分析
超声波发射电路结构简单没有过多调试,主要对接收部分进行调试。
超声波接收电路采用的是索尼CX20106A芯片,这是一款专用的红外信号接收芯片,电路结构简单但参数设置的不当会直接影响接收的效果。
其中2号脚与地之间连接 RC串联网络,它们是负反馈串联网络的组成部分,改变它们的数值能改变前置放大的增益和频率特性。增大R或减小C将使负反馈量增大,放大倍数下降,反
之则放大倍数增大。在制作过程中R取4.7欧姆C取3.3uf,导致放大倍数过大,测距功能不能正常工作,后来R取4.7k,C不变,测距功能基本可以实现,最终为了方便调节放大倍数将R 用10k电位器代替,以此达到最佳效果。
5号脚与地之间接入的电阻用以设置带通滤波器中心频率f0,阻值越大,中心频率越低,本设计采用经验值200k,此时中心频率约为40khz。
6号脚与地之间接的积分电容,标准值为330pf,由于手头没有330pf的就用两个680pf的电容串联,这样做对功能有一定影响但不是很大,具体规律是电容太大会导致探测距离缩短。
其它引脚不用调试。
温度采集及显示的调试中出现数据显示的位置错误,原因是显示程序中存储数据的数组重复利用,在显示完一组数据后应对存储数据的数组重新赋值,这样问题就可得到解决。
·测量数据
表1 距离
表2 温度及对应的波速
数据分析
测量工距用两成为23cm的三角尺,挡板。最小有效测量距离为6cm,测量误差在1cm左右,重复性较好。误差原因主要有尺子短,温度补偿和距离计算中的数据取整造成的误差。
软件调试
(五)心得体会
在单片机课程设计中,经过选题、设计电路、购买元件、焊接电路、程序编写调试等步骤,最终得到完整的作品。这次课程设计是本门课程课堂教学的延伸和发展,是理论知识与工程实践之间的衔接。通过本课程设计,我获益匪浅,增强了我对单片机专业知识的学习,加深了认识,进一步巩固了我的动手能力,培养独立自主、综合分析的思维与创新能力,最终使初步具有设计小型计算机控制系统的硬件及软件的能力。同时,通过资料搜集、方案分析、系统设计与报告撰写的一系列过程,得到一次科学研究工作的初步训练。从而,在专业知识与研究方法方面为日后的毕业设计乃至毕业后的工作奠定良好的基础。本次课程设计使我得到了锻炼,让我明白学习不知能是纸上谈兵,要能在生活生产中用到的具体使用。
(六)附录
#include
#include
#include <1302.h>
#define TX P1_0
#define RX P1_1
sbit p25=P2^5;
sbit p26=P2^6;
sbit p27=P2^7;
unsigned char s;
unsigned char cnt;
float v;
unsigned char code dsp_code_ca[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void display(void);
void init_t(void);
void delay1(void);
void Pulse()
{
unsigned char i;
for (i =0 ;i<10; ++i) {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
// _nop_(); //延时,调整发射频率
TX = ~TX;
}
}
unsigned int sonic()
{
unsigned int n;
RX=1;
TR1=0;
TH1=TL1=0;
Pulse();
TR1=1; //开定时器
TF1=0; //查询方式中断标志位
for(n=0;n<160;n++); // 排出相邻干扰
while( RX ==1 && TF1 == 0 ) ;
TR1=0;
if ( TF1 )
{
n=9999;
}
else{
n=(TH1<<8)+TL1;
n=(unsigned int) (n*0.017);//0.018446); // 0.017*12/11.0592
}
return n;
}
void main()
{
// unsigned int cnt;
TMOD= 0x10;// 超声用定时器1
EA = 1;
while(1)
{
ReadyReadTemp(); //读温度准备
TL=ReadOneChar(); //先读的是温度值低位
TH=ReadOneChar(); //接着读的是温度值高位
TN=TH*16+TL/16; //实际温度值=(TH*256+TL)/16,即:TH*16+TL/16
//这样得出的是温度的整数部分,小数部分被丢弃了
// TD=(TL%16)*10/16; //计算温度的小数部分,将余数乘以10再除以16取整,
//这样得到的是温度小数部分的第一位数字(保留1位小数) v = (331.45+0.61*TN)/2000;