热电阻的单片机测温系统.docx
《热电阻的单片机测温系统.docx》由会员分享,可在线阅读,更多相关《热电阻的单片机测温系统.docx(27页珍藏版)》请在冰豆网上搜索。
热电阻的单片机测温系统
摘要
电子温度计是日常生活中最普遍的电子产品之一,常用的转换元件有热电阻、热敏电阻、热电偶等,通常我们将这些转换元件通过非电量转化电量的检测方法,结合电量和温度之间的关系,我们可以计算出其温度值。
在本课题中将介绍一种利用电阻电桥失衡输出的电压转换温度的设计。
在设计中,利用AT89S系列单片机作为控制器,计算铂电阻(PT100)电量与温度的转换,并在LED显示温度。
关键词:
AT89S52ADC0832
Abstract
Electronicthermometerisindailylife the mostcommononeofelectronic products,andthe common interfaceelementhave heatresistance, thermal resistance,thermocouple,etc.,usuallywewilltheseinterfaceelement throughthenon-electricity intoelectricitydetection methods,combinedwith powerand therelationship betweenthetemperature,wecancalculatethetemperaturevalue.Inthistopic willintroducea kindof make use ofthe resistancebridge unbalancedoutputvoltage transitiontemperaturedesign.Inthedesign, the useof AT89S series microcontrollerasthecontroller,calculationofplatinumresistance (PT100)powerandtemperature conversion,and in theLEDdisplaytemperature.
ﻩKeyword:
AT89S52ADC0832
1.引言4
2.设计任务及要求ﻩ4
3.单臂电桥测温原理及铂电阻ﻩ4
3.1直流电桥平衡原理ﻩ4
3.2铂电阻的特性ﻩ5
3.3由铂电阻构成的单臂电桥5
4方案设计和选择ﻩ6
4.1系统结构框图6
4.2方案设计与确定ﻩ6
5电路图、元器件介绍以及参数计算7
5.1测量电路ﻩ7
5.2信号调理电路ﻩ8
5.3模数转换电路9
5.4 单片机及外围电路ﻩ11
5.5 显示电路13
6 软件设计14
6.1 ADC的启动与输入14
6.2软件修正误差15
7整体组装及调试15
7.1仿真15
7.2硬件组合及相关数ﻩ16
7.3误差分析ﻩ17
7.4调试ﻩ17
附录:
ﻩ18
参考资料:
ﻩ18
整体原理图18
程序21
1.引言
当今,铂电阻广泛应用于医疗、电机、工业、温度计算、卫星、气象、阻值计算等高精温度设备,应用范围非常之广泛。
日常生活中,温度已经成为人们必须知晓的一个物理量。
温度的高低密切关系着生活中的每一个角落。
温度传感器成为常用的传感器之一,为知晓生活中温度的高低提供了极大的便利。
2.设计任务及要求
基于热电阻的温度测量仪器的设计
设计任务与要求:
1.理解电阻测温的原理;
2.理解数模转换器的原理以及与MCU的接口方法;
3.理解显示器与MCU的接口方法;
4.编程实现温度的测量及显示;
5.温度的确定方法建议不采用查表法,采用传感器的关系表达式;
6测量温度范围:
0~200℃。
3.单臂电桥测温原理及铂电阻
3.1直流电桥平衡原理
近年来,低漂移集成运算放大器的发展,直流电桥得到了广泛的应用。
如图3-1所示,U为电源电压,R1、R2、R3、R4电阻。
初始状态
则电桥输出的电压或电流为零。
此时电桥处于平衡状态。
因此
为电桥的条件。
当其中任意一个电阻的阻值改变时,
变化,其输出电压为
图3.1平衡电桥
3.2铂电阻的特性
本次设计使用Pt100电阻,所以这里将只介绍Pt100电阻的特性。
pt100是铂热电阻,它的阻值会随着温度的变化而改变。
PT后的100即表示它在0℃时阻值为100欧姆,在100℃时它的阻值约为138.5欧姆。
它的工作原理:
当PT100在0摄氏度的时候他的阻值为100欧姆,它的阻值会随着温度上升而成近似匀速的增长。
但他们之间的关系并不是简单的正比的关系,而更应该趋近于一条抛物线。
由于我们本次设计涉及到的温度范围:
0~200℃。
故阻值和温度之间的关系可以用下式近似表示
等式中,
、
分别为0℃和t℃的电阻值。
,
Pt100在正常工作下其电流最大
3.3由铂电阻构成的单臂电桥
如图3-1所示,当
为铂电阻时(铂电阻的介绍将在第四节中介绍)。
由于外界温度的影响下,铂电阻的阻值改变,导致平衡电桥失衡,从而
输出。
因此,我们利用铂电阻的电阻随温度变化而产生电桥输出电压,并利用铂电阻的特性,从而实现由非电量转换成电量的测量。
4方案设计和选择
4.1系统结构框图
ﻩﻩ图4.1
4.2方案设计与确定
方案一:
使用运算放大器做求差,直接求出并放大输出电压,后进入A/D转换器,转换后进入单片机进行运算。
方案二:
亦使用运算放大器,与方案一不同的是,方案一使用单路电压输入进入A/D转换器,而方案二则采用电桥两路的电压,经过调理电路,输入A/D转换器,由单片机进行求差处理。
方案分析,两者的原理都是利用电桥失衡后的输出电压进行求差运算,以此获得铂电阻阻值和变化电压之间的关系。
不同的是,方案一采用的是硬件求差,而方案二采用的是软件求差。
相对后者来说,前者经过求差电路,单一的输出电压值,直接由单片机进行温度变化较后者使用软件求差的精度更高。
由于两路电压都在时刻小幅变化,对于软件求差而言,微小的变化,导致求得的小数点后值不同,从而影响整个温度检测精度。
本次设计,由于希望通过编程上对误差的修正来保证温度准确度,故采取了方案二。
5电路图、元器件介绍以及参数计算
5.1测量电路
5.1.1原理图
图5.1.1
如图5.1.1所示,使用
=5V的直流电输入,当
(铂电阻)的温度变化时阻值随之改变,
的电势产生变化,而
的电势则不变。
5.1.2元件选择
只考虑电阻的初始平衡,和Pt100的最大电流。
故选取2个1K电阻和1个500Ω电位器。
故最大电流
满足Pt电阻的要求。
5.2信号调理电路
5.2.1 原理图
图5.2.1
由于两路的信号调理电路及选取电阻是相同,所以只给出一路的信号调理电路。
第一级运放为一个电压跟随器为了降低输出阻抗,增加电压稳定性。
第二级运放为一个正向电压放大器,由于输出电压较小,为了使A/D转换器正常工作,故需要放大后进A/D
5.2.2高精度运算放大器OP07介绍
Op07芯片是一种低噪声,非斩波稳零的双极性(双电源供电)运算放大器集成电路。
由于OP07具有非常低的输入失调电压(对于OP07A最大为25μV),所以OP07在很多应用场合不需要额外的调零措施。
OP07同时具有输入偏置电流低(OP07A为±2nA)和开环增益高(对于OP07A为300V/mV)的特 ﻩ图5.2.2ﻩ点,这种低失调、高开环增益的特性使得OP07特别适用于高增益的测量设备和放大传感器的微弱信号等方面。
5.2.3元件选择及参数设置
通过运算,可知电桥的输出电压
和
仅为0.45V(理想状态电桥平衡下)。
由于热电阻1℃的变化导致1Ω一下的电阻变化,如此电压的变化量也不会太大,这样会增加我们对测量的难度和不准确度。
为此,为了解决微小信号变化的输出,采取了使用OP07运放的正向放大电路,放大电压,增益如下
由于设计选择的ADC0832最大输入电压为5V,故在第二级运放后的输出电压必须小于5V。
选择
=12K,
=24K,故可得
=3,最大输出电压
。
5.3模数转换电路
5.3.1原理图
图5.3.1
5.3.2 ADC0832选用及芯片介绍
由于ADC0832的连接和使用的简易,故为了降低电路的复杂度,采用了ADC0832作为本次设计模数部分。
ADC0832是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。
由于它体积小,兼容性,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的普及率。
ﻩ
芯片接口说明:
CS_ 片选使能,低电平芯片使能。
CH0模拟输入通道0,或作为IN+/-使用。
CH1模拟输入通道1,或作为IN+/-使用。
GND 芯片参考0电位(地)。
DI 数据信号输入,选择通道控制。
DO数据信号输出,转换数据输出。
图5.3.2ADC0832封装
CLK 芯片时钟输入。
Vcc/REF电源输入及参考电压输入(复用)。
5.4单片机及外围电路
5.4.1原理图
图5.4.1单片机及外围电路
5.4.2AT89S51资料及选用
现在市面上的单片机种类繁多,由于本次电路不需要负责的运算能力与速度,故选用最普遍的AT系列单片机。
AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4kBytes ISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内 图5.4.2
集成了通用8位中央处理器和ISP Flash存储单元,AT89S51在众多嵌入式控制应用系统中得到广泛应用。
5.4.3AT89S51引脚功能
VCC:
电源电压输入端。
GND:
电源地。
P0口:
P0口为一个8位漏级开路双向I/O口,使用P0外部必须被拉高。
P1-P3口:
P3口管脚是8个带内部上拉电阻的双向I/O口。
RST:
复位输入端
ALE/PROG:
地址锁存允许/编程脉冲信号端
PSEN:
外部程序存储器的选通信号,低电平有效。
EA/VPP:
外部程序存储器访问允许。
XTAL1:
片内振荡器反相放大器和时钟发生器的输入端。
XTAL2:
片内振荡器反相放大器的输出端。
ﻩﻩﻩﻩﻩﻩﻩﻩﻩ图5.4.3
5.5显示电路
5.5.1原理图
图5.5.1 显示电路原理图
显示电路由四位共阴数码管和1片74HC573锁存器组成,并由P3口进行位选,P1口进行段码输出。
74HC573芯片的作用是增大数码管的驱动电流。
6软件设计
图6.1.1总流程图ﻩ
6.1ADC的启动与输入
本次设计使用的是ADC0832的两个输入通道,所以需要在接收输入前,首先选择通道。
如图5.3.1所示,ADC0832的DI口和DO口连在一起并一起连入单片的P2.0口,这是因为通信时,DI和DO并不是同时有效的,而单片机接口则是双向的。
表中可得知,当对DI端口输入第一个1时表示将通道属性选择为单极性;当输入第二个值是,0表示0通道,1表示1通道。
表1
在设计软件的时候,首先需要将片选设为低电平,此时开始ADC0832工作;第二步选择通道,再输入选通道输入码之前需要输入1位‘1‘作为起始位,随后输入相应选通码。
值得注意的是选择0通道后,需将DO口置1,否则输出口呈高阻态将无法正确输出信号。
输入信号时,ADC0832采取的是一位位输出方式,故单片机需要一位位的接收。
6.2软件修正误差
由于输入ADC的电压时刻在变化,故每一时刻的电压差值都不相同,由于软件求差的缘故,可能会导致较大变化的跳动。
为此通过软件的计算来尽可能弥补两路求差带来的误差。
设计中将采用一个定时器,在一段时间内的反复采集,求其平均值,来尽量减小系统误差。
7整体组装及调试
7.1仿真
为确保做出来的设计没有大的问题,设计之前先进行仿真设计,仿真软件使用的是proteus。
由于该软件没有误差的影响,所以仿真阶段只是确保了大体上的正确。
ﻩ图7.1.1
7.2硬件组合及相关数
本次设计使用两个模块,将显示电路单独置于另一块版。
目的是便于调试和检查。
模数转换器通道0输入电压和温度的关系
工业温度计测定的室温T/℃
ADC0832CH0输入电压U/V
22.28℃
1.4979V
32.01℃
1.5477V
32.80℃
1.5490V
由上述数据,可以得到以下关系
可以看到T和U成近似的线性关系,由此可以推论出测量电路无问题。
7.3误差分析
误差主要来源:
1.电阻、运放相关参数与理论值有差别
2.由于热电阻温度不为0,故热电阻阻值不可能为100度,电桥不能平衡。
3.转换输入电压变化跳动微小,可能造成较大的误差。
4.转换数据的时候,取的有效位数不同造成计算后的温度不准确
7.4调试
硬件调试的主要方法,检测数码管是否选通并点亮。
检测各级运放的输入输出电压,并与理论值作比较。
软件调试的方法,选通数码管并点亮,观察显示与程序结果是否一致。
8总结体会
本次设计之初,选用的运放求差电路,通过硬件求差后进模数转换器,并通过单片机进行温度的计算。
在后续的思路中,考虑到ADC0832可以有两路输出,因此想到了通过用编程获取电桥失衡输出电压,并通过软件进行误差修正。
前期准备中,在有基本思想和大体框架下,自主查询了各种数据手册,了解了其主要的参数与性能,并考虑实际电路选择器件。
通过Proteus软件仿真后,也出现了很多的计划之外的问题,例如经过运放后的电压过大大于5V,如此一来就在ADC0832最大输入电压之外了。
为此解决方案是减小放大倍数或在模数转换器前加入一个5V的稳压管。
仿真软件只能实现一个功能性的仿真,而在设计时候需要考虑周到。
例如电压跟随器,减小了电桥电压的输出阻抗,稳定了进入放大电路的电压值。
制作出PCB板之后,由于位选通未加大驱动电流,故显示失败。
重新制作的显示电路中,加上了一片74HC573芯片,增大了IO口的输出驱动电流,以此点亮数码管。
实体电路完成之后就进行电桥调零,将一片100Ω的电阻替代热电阻的位置,测试两路输出电压是否为零,并通过电位器调零。
在测试后,保证硬件电路无错的前提下,进行软件的编写。
起初编写的软件,显示电路部分1秒内闪烁次数过多,并且其他位有节奏闪烁。
前者的原因是采集频率过快,为此启动了一个定时器,定时溢出后中断内执行采集和求差程序部分;后者的原因是选通后的延时时间过长,故降低延时时间即可。
该设计的重点与难点在于软件求差和误差修正上。
对于误差修正,采用的方法是多次测量,按大小排序后剔除两边数据,求得的均值为其输入电压。
但由于时间关系未能成功实现,导致数码管的温度显示幅度跳动厉害,误差较大。
本次课程设计独立的完成对于整体电路设计的流程有一个熟悉的了解,对于以后的设计积累了经验。
设计电路需知晓其理,考虑实际情况进行分析。
感谢王老师在本次设计中提供的建议和意见。
附录:
参考资料:
贾伯年:
《传感器技术》 东南大学出版社
康华光:
《电子技术基础》 高等教育出版社。
王选民:
《智能仪器原理及设计》清华大学出版社
整体原理图
ﻩﻩﻩ
ﻩﻩﻩﻩ图电路1
元器件清单:
表1
PCB板图:
ﻩﻩﻩﻩﻩﻩ图pcb-1
ﻩﻩﻩﻩ图pcb-2
程序
#include
#include<math.h>
#defineoutput P1
sbitAD_DIDO=P2^0;
sbit AD_CS=P2^1;
sbitAD_CLK=P2^2;
sbitled_1=P3^0;
sbitled_2=P3^1;
sbit led_3=P3^2;
sbitled_4=P3^3;
unsignedcharcodeDuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示段码值0~9
unsigned char res_R[6];
void startAD(intchannel);
unsignedchar ADresult(int channel);
voidResPr(doubleresult);
signed charnum;
unsignedcharcompare(unsignedchar*a);
unsigned charge,shi,bai,xiaoshu;
unsignedcharres0,res1,diff;
void display();
voidDelay(unsignedintr);
voidcal(unsignedchar dif);
voidInit_Timer0();
//voidTimer0_isr( )interrupt1;
voidmain()
{
ﻩInit_Timer0();
ﻩwhile(1)
{ﻩ
ﻩ
ﻩﻩdisplay();
ﻩ}
ﻩﻩ
}
void startAD(intchannel)
{
if(channel==1)
{
AD_CS=0;
//Delay
(1);
AD_DIDO=1;ﻩ
//Delay
(1);
ﻩAD_CLK=0;
//ﻩDelay
(1);ﻩﻩ//第1个上降沿
AD_CLK=1;
//ﻩDelay
(1);
ﻩAD_DIDO=1;ﻩ//选择通道1转换
AD_CLK=0;
//Delay
(1);ﻩ//第2个上降沿
ﻩAD_CLK=1;
//ﻩDelay
(1);
AD_DIDO=1;
ﻩAD_CLK=0;
//Delay
(1);ﻩ//第3个上降沿
AD_CLK=1;
//ﻩDelay
(1);
AD_CLK=0;
//ﻩDelay
(1);ﻩﻩ//第3个下降沿
}
else
{ﻩAD_CS=0;
//Delay(1);
AD_DIDO=1;ﻩ
AD_CLK=0;
//Delay
(1);ﻩﻩﻩ//第1个上降沿
ﻩAD_CLK=1;
//Delay(1);
ﻩAD_DIDO=1;ﻩ//选择通道1转换
AD_CLK=0;
//ﻩDelay
(1);ﻩ//第2个上降沿
AD_CLK=1;
//Delay(1);
AD_DIDO=0;
ﻩAD_CLK=0;
//Delay
(1);ﻩﻩ//第3个上降沿
AD_CLK=1;
//Delay(1);
ﻩAD_DIDO=1;
AD_CLK=0;
//ﻩDelay
(1);ﻩ//第3个下降沿
}
}
unsignedchar ADresult(intchannel)
{
unsignedchari;
unsigned charval;
startAD(channel);
ﻩfor(i=0;i<8;i++)
ﻩ{
ﻩval=val<<1;
ﻩﻩAD_CLK=1;
ﻩAD_CLK=0;
ﻩif(AD_DIDO)
ﻩ{
ﻩﻩval=val|0x01;
ﻩ}ﻩ
}
AD_CS=1;
ﻩreturn val;
}
voidcal(unsignedchar dif)
{
ﻩdoubleaa,bb,rt,wendu,xiao1,xiao2,rr1,gen;
floatz;
z=(float)dif/51;
aa=3.96847e-3;
ﻩbb=-5.847e-7;
xiao1=0.090909;
ﻩxiao2=0.909091;
ﻩrt=(1000*(xiao1+z/15))/(xiao2-z/15);
rr1=1-0.01*rt;
gen=sqrt(aa*aa-4*bb*rr1);
wendu=(-aa+gen)/(2*bb);
ResPr(wendu);
}
voidResPr(doubleresult)
{
ﻩintnum=result*10;
ﻩbai=num/1000;
shi=(num%1000)/100;
ge=(int)((num%1000)%100)/10;
xiaoshu=(int)((num%1000)%100)%10;
}
voiddisplay()
{
ﻩ led_1=1;led_2=1;led_3=1;led_4=1;
output=DuanMa[bai];//取显示数据,段码
led_1=0;
ﻩ
Delay(5);//扫描间隙延时,时间太长会闪烁,太短会造成重影
ﻩ led_1=1;
output=DuanMa[shi];
led_2=0;
Delay(5);
ﻩled_2=1;
output=DuanMa[ge]|0x80;
led_3=0;
ﻩDelay(5);
led_3=1;
output=DuanMa[xiaoshu];
ﻩ led_4=0;
Delay(5);
led_4=1;
}
voidDelay(unsignedintr)
{
unsignedintx,y;
for(x=r;x>0;x--)
for(y=110;y>0;y--);
}
void Init_Timer0()
{
TMOD=0x01;//使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0=0x00;//给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
voidTimer0_isr( )interrupt1
{
unsignedchari,k=0;
TH0=(65536-10000)/256;ﻩ
TL0=(65536-10000)%256;
i++;
if(i==35)
{
ﻩi=0;
ﻩif(k==0)
ﻩﻩ{
res1=ADresult(1);
ﻩﻩﻩk=10;
ﻩ}
ﻩ
for(num=0;num<25;num++)
ﻩres_R[num]=ADresult(0);
ﻩﻩres0=compare(res_R);
ﻩdiff=res0-res1;
ﻩﻩcal(diff);
}
}
unsignedchar compare(unsignedchar *a )
{
unsignedinti,j,t,n;
unsignedcharres=0;
for(i=0;i<25;i++)
fo