基于NTC热敏电阻的温度测量与控制系统设计.docx
《基于NTC热敏电阻的温度测量与控制系统设计.docx》由会员分享,可在线阅读,更多相关《基于NTC热敏电阻的温度测量与控制系统设计.docx(32页珍藏版)》请在冰豆网上搜索。
基于NTC热敏电阻的温度测量与控制系统设计
题目名称:
基于NTC热敏电阻的温度测量与控制系统设计
摘要:
本系统由TL431精密基准电压,NTC热敏电阻(MF-55)的温度采集,A/D和D/A转换,单片机STC89C51为核心的最小控制系统,LCD1602的显示电路等构成。
温度值的线性转换通过软件的插值方法实现。
该系统能够测量范围为0~100℃,测量精度±1℃,并且能够记录24小时内每间隔30分钟温度值,并能够回调选定时刻的温度值,能计算并实时显示24小时内的平均温度、温度最大值、最小值、最大温差,且有越限报警功能。
由于采用两个水泥电阻作为控温元件,更有效的增加了温度控制功能。
关键词:
NTCTL431温度线性转换
Abstract:
ThesystemiscomposedofTL431asprecisevoltage,thetemperatureacauisitioncircuitwithNTCthermistors(MF-55),thetransformcircuitofA/DandD/A,thecoreoftheminimumcontrolsystemwithSTC89C51,1thedisplaycircuitusingLCD1602,etc.Getthetemperatureofthelineartransformationbythesoftwaremethod.Therangeofthemeasuresystemis0~100℃,measurementaccuracy+1℃.Itcanrecord24hoursofeachintervaltemperaturebyper30minutesselectedoftemperature.Thetimecanbecalculatedandreal-timedisplaywithin24hoursoftheaveragetemperature,maximumtemperatureandminimumtemperature,maximumvalue,andeachtemperaturesensorhasmoreallthewaylimitalarmfunction.Duetothetwocementresistanceastemperaturecontrolcomponents,themoreeffectiveincreasethetemperaturecontrolfunction.
Keyword:
NTCTL431temperaturelinearconversion
1方案设计与论证
1.1整体设计方案比较和选择
温度测量和控制系统,基于NTC热敏电阻的特性进行设计。
当外界温度变化时,可以将温度值转换为电压值。
电压值经过模数转换后送入单片机进行处理。
当某路传感器温度超越设定的温度上下阀值时,即产生相应的声光报警信号并显示该传感器的温度值,直至温度回到门限内(要求具有1℃的回差)或通过控制键解除警报。
后向通道通过水泥电阻作为控温元件,增加温度控制功能。
最后将输出的数字信号经过D/A转换,变换为温度,最终经过LCD1602进行显示。
NTC热敏电阻特点是在工作温度范围内电阻阻值随温度的上升而降低,可满足0℃~100℃测量范围,但热敏电阻精度、重复性、可靠性较差,不适用于检测小于1℃的信号;而且线性度很差,不能直接用于A/D转换,应该用硬件或软件对其进行线性化补偿。
该温度测控系统,需要前向通道(温度采集器和AD转换器),单片机控制系统和后向通道(温度控制系统)三部分组成。
其中温度采集器部分有以下三种方案:
方案1:
采用NTC热敏电阻,恒流源(采用LM317L,内部提供1.2V的基准电压)和相电压跟随器运放构成(如图1所示)。
方案优点:
该方案硬件电路简单,电路电流值较小,焦耳热损耗很小,温度测量误差可以控制在很小的范围内。
方案缺点:
因为恒流源要提供毫安数量级的电流,但受电源变化的影响较大,故要求电源十分稳定,同时其输出精度不高。
图1方案1系统设计框图
方案2:
采用恒压源、滑动变阻器和同相电压跟随器的运放电路构成(如图2所示)。
方案优点:
原理简单,电路简单;
方案缺点:
恒压源不能保证绝对的恒压,从而使温度测得不稳定。
图2方案2系统设计框图
方案3:
基于紧密稳压电源TL431作为恒压源,后接电桥电阻电路和三运放电路(如图3所示)。
三运放的放大增益计算公式:
由于:
=
=30K;
=20K;
=
=1K
所以:
最大可以放大约60倍。
电桥中
和
的取值决定了输出电压的精确度,经过多次测量,所以该处取值都为20K。
图3方案3系统设计框图
方案选定:
方案3
方案论证:
综上所述前面采用电桥方法可以减小由于恒压源输出电压的波动感的影响。
后面采用差分放大,从而输出很稳定,能够满足系统设计的要求,所以选择方案3。
其中运放选OP07(零点漂移很小,类似于精密放大,虽然带宽不是很宽,但是在此处已经足够了),方案3中,R5用滑动变阻器,可以很方便的改变增益。
同时又不影响电路的对称性。
2系统设计
2.1总体设计
经过TL431精密稳压源输出2.5V电压给一个桥式电阻电路,由于NTC热敏电阻的特性,所以随着温度的变化,电阻值减少了,后面在接一个三运放电路将电压放大到所需要的电压值。
输出的电压值经过8位A/D转换器ADC0804转换后,将数字信号经由单片机STC89C51进行处理,然后将这些值送由LCD1602进行显示(如图4所示)。
图4系统总体方案
2.2各单元模块功能介绍及电路设计
2.2.1学习板电路
学习板系统总体设计电路图(如图5所示)。
图5学习板系统总体设计图
学习板上独立按键和矩阵按键的电路图(如图6所示)。
图6键盘电路
STC89C51单片机电路图(如图7所示)。
图7单片机电路
2.2.2测温通道电路
下图为前向通道的电源部分。
中间有D1和D2两个发光二极管,用来指示电源是否正常供电,此外还加了两个大小电容的并联电路,起滤波作用(如图8所示)。
图8前向通道电源电路
控温电路,采用两个水泥电阻,更有效的对NTC热敏电阻进行控温操作(如图9所示)。
图9控温电路
2.2.3报警电路
蜂鸣器电路,当温度超过限度是起报警作用(图10报警电路)。
图10报警电路
2.2.3模数转换电路
前向通道中,当温度值转换为电压后,还需要将电压值进行A/D转换,转换后的值才能送到单片机进行处理。
后向通道中进行温度显示前应该先经过D/A转换(如图11模数转换电路)。
图11AD以及DA转换原理图
2.3特殊器件的介绍
热敏电阻器是一种随(感应)温度的变化其电阻值呈显著变化的热敏感半导体元件。
温度升高时阻值下降的热敏电阻器,称为负温度系数热敏电阻器(NTC)。
NTC负温度系数热敏电阻R-T特性如下图12所示:
图12B值相同,阻值不同的R-T特性曲线示意图
电阻值和温度变化的关系式为:
其中,RT为在温度T(K)时的NTC热敏电阻阻值,RN为在额定温度TN(K)时的NTC热敏电阻阻值。
(TN取25℃,RN=1.20kΩ),T为规定温度(K),B为NTC热敏电阻的材料常数,又叫热敏指数。
而且,
通过公式
(1)、
(2)以及表1,可求得B=3900K,从而可以得出电阻值和温度变化的关系式为:
3软件设计
3.1软件流程图
该程序基于小系统板,小系统板上有显示、ADC转换、键盘等电路。
学习系统板上主控单片机为STC89C51,所以采用c51编程方便简单,软件流程图如下:
图8主程序流程图
3.2线性转换处理--线性插值
在ADC进行数据采集的过程中不可能每一个数值都在整温度所对应的ADC数值上,所以如果在两个数据的中间一段就要对其进行进一步的精确定位。
这样就必须知道采集到的数据在表1-2中的具体位置,因此要对数据表进行搜索、查找。
线性表的查找(也称检索),可以有比较常见的顺序查找、折半查找及分块查找等方法,分析线性表1-2可以得到折半查找的算法是比较高效的。
这样的插值计算实际上是分段的,用直线段来拟和温度曲线,因此在处理的过程中分段越细致拟和的曲线就越接近实际温度曲线。
表1插值表
温度传感器在0℃到100℃输出0V—2.5V,温度起点为0℃,满量程为100℃。
学习系统板子上有8位的A/D转换器对应输出的数字量为00000000B—11111111B(0-2.5V),应用以下变换公式进行变换:
AX=A0+(AM-A0)(NX-N0)/(NM-N0)
式中,A0为一次测量仪表的下限。
AM为一次测量仪表的上限。
AX实际测量值。
N0仪表下限对应的数字量。
NM仪表上限对应的数字量。
NX测量值对应的数字量。
温度非线性转换程序模块采用折线拟合法进行线性化处理
4系统测试
4.1测试方法
步骤1:
先安上元件后,测试电路是否正确连通,待没有任何问题后将集成芯片安上。
以此可以防止集成芯片由于电压过大而烧坏。
步骤2:
将NTC热敏电阻放入冰水混合物中(0℃,进行调零操作。
此时电压输出为0V。
步骤3:
将NTC热敏电阻放入沸水杯子中,进行调满操作。
此时的电压输出为最大,即为2.5V。
步骤4:
记录不同温度时刻对应的温度转换值和实际温度值,进行NTC温度特性曲线的绘制。
4.2测试结果
对于电桥温度的取值会影响后面测试温度的精度,所以在电桥平衡电阻(R1,R2)分别在200K和6.8K和20K时,对温度进行了测量。
具体情况如下图表格和图所示:
、
表2第一次温度曲线实际测量数据
表3第二次温度曲线实际测量数据
表3最终温度测量数据
4.3结果分析
又图上特性曲线可以看出,温度变化从0度开始到100°时,变化规律为先慢接着较快后很慢;
5结论
由于系统架构设计合理,功能电路实现较好,系统性能优良、稳定,较好地达到了题目要求的各项指标。
基于学习板小系统进行软件调试很容易。
在采集温度部分有调零和满刻度调整电路,在三运放的放大部分有滑动变阻器,可以很容易改变增益。
在实现温度转换时,利用插值法,在提高测量精度是变得更容易。
此外,在后面的控温部分可以采用TEC半导体制冷片。
因为采用三极管放大电路必须考虑三极管所允许的最大允许电流,否则会造成三极管烧坏。
参考文献
[1]陈武凡.小波分析及其在图像处理中的应用.科学出版社,2002.01.
[2]高吉祥主编.高频电子线路.北京:
电子工业出版社,2003
[3]易波.通信原理.长沙:
国防科技大学出版社出版,1998
[4]何立民.单片机应用系统设计系统配置与接口技术[M].北京:
北京航空航天大学,1990.
[5]李晓荃.单片机原理与应用[M].北京:
电子工业出版社,2000.
[6]樊昌信.通信原理(第五版)[M].北京:
国防工业出版社,2001.
[7]全国大学生电子设计设计竞赛组委员会.全国大学生电子设计竞赛训练教程[M].北京电子工业出版社,2005.
[8]俞俊民.自制恒流源[J].沈阳电力高等专科学校学报,1997.
[9]朱传奇.简易使用的直流电流源[J].山东电力技术,1999.
[10]马云峰.单片机控制的直流电流源设计[J].潍坊高等专科学校学报,1999.
[11]Richardc.Dorf.modernconctrolsysterm[M].BEIJING:
SciencePublishingHouse,2002.
[12]DonaldA.Neamen.Electroniccircuitanalysisanddesign[M].TsinghuaUniversityPressandSpringerVerlag.2002.
附录:
附1:
元器件明细表
1.基准稳压集成芯片TL431
2.ADC0804
3.DAC0832
4.单片机STC89C51
5.三极管8050
6.液晶LCD1602
附2:
仪器设备清单
1、数字信号发生器
2、数字万用表
3、模拟示波器
4、稳压电源
附3:
电路图图纸
前后向通道电路图
学习板小系统原理图
前后向通道PCB图
附4:
程序清单
******************************************
***课题:
NTC测温***
***创建时间:
2011年6月11日***
******************************************
/********************************************************************
主函数部分
********************************************************************/
voidmain()
{
ucharb=0,c,d;
floate;
init();//液晶初始化
xianshi(7,mima1,0x80);//显示密码字样
do{
du_key1();//扫描键盘
du_key2();
if(adjust1==4&adjust4==3)
{
b=1;
adjust1=0;
adjust4=0;
}
}
while(b==0);
Timer_start();
xianshi(16,deng1,0x80);//显示“pleasewait……”字样
while(remember<=50);
init();
xianshi(6,wendu1,0x80);
while
(1)
{
du_key1();
du_key2();
chunshu();
lvbo();
if(adjust1==1)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(8,look_shi,0x80);
}
write_command(0x80+9);
write_date(shu[adjust2]);
}
elseif(adjust1==2)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(7,look_ge,0x80);
}
c=adjust3/10;
d=adjust3%10;
write_command(0x80+8);
write_date(shu[c]);
write_command(0x80+9);
write_date(shu[d]);
}
elseif(adjust1==3)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(9,look,0xc0);
}
Look_for();
deep_chuli(wendu);
write_command(0xc0+10);
write_date(AD_buffer[0]);
write_command(0xc0+11);
write_date(AD_buffer[1]);
write_command(0xc0+12);
write_date('.');
write_command(0xc0+13);
write_date(AD_buffer[2]);
}
elseif(adjust1==4)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(9,day_aver,0xc0);
}
day_average();
deep_chuli(wendu);
write_command(0xc0+10);
write_date(AD_buffer[0]);
write_command(0xc0+11);
write_date(AD_buffer[1]);
write_command(0xc0+12);
write_date('.');
write_command(0xc0+13);
write_date(AD_buffer[2]);
}
elseif(adjust1==5)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(5,pwm_1,0xc0);
}
write_command(0xc0+5);
write_date(shu[tiao/10]);
write_command(0xc0+6);
write_date(shu[tiao%10]);
}
elseif(adjust1==6)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(5,pwm_2,0xc0);
}
write_command(0xc0+5);
write_date(shu[tiao/10]);
write_command(0xc0+6);
write_date(shu[tiao%10]);
}
elseif(adjust1==7)
{
flag=flag+1;
if(flag==1)
{
init();
xianshi(7,cha,0xc0);
}
e=max-min2;
deep_chuli(e);
write_command(0xc0+8);
write_date(AD_buffer[0]);
write_command(0xc0+9);
write_date(AD_buffer[1]);
write_command(0xc0+10);
write_date('.');
write_command(0xc0+11);
write_date(AD_buffer[2]);
}
else
{
flag=flag+1;
if(flag==1)
{
xianshi(6,wendu1,0x80);
xianshi(4,max1,0xc0);
xianshi(4,min1,0xc0+8);
}
line_processer(15,average);
if(flag1==1)
{
min2=wendu;
max=wendu;
flag1=0;
}
if(wendu>max)
{
max=wendu;
}
elseif(wendu{
min2=wendu;
}
deep_chuli(wendu);
baojin();
write_command(0x80+6);
write_date(AD_buffer[0]);
write_command(0x80+7);
write_date(AD_buffer[1]);
write_command(0x80+8);
write_date('.');
write_command(0x80+9);
write_date(AD_buffer[2]);
deep_chuli(max);
write_command(0xc0+4);
write_date(AD_buffer[0]);
write_command(0xc0+5);
write_date(AD_buffer[1]);
write_command(0xc0+6);
write_date('.');
write_command(0xc0+7);
write_date(AD_buffer[2]);
deep_chuli(min2);
write_command(0xc0+12);
write_date(AD_buffer[0]);
write_command(0xc0+13);
write_date(AD_buffer[1]);
write_command(0xc0+14);
write_date('.');
write_command(0xc0+15);
write_date(AD_buffer[2]);
}
}
}
/*******************************************************************
子程序部分
********************************************************************/
/*******************************
AD采集
*******************************/
voidAD_caiji(ucharx)
{
csad=0;
WR1=0;//启动ad
_nop_();
WR1=1;
delay1();
AD_data=0xff;
RD1=0;
AD_buffer[x]=AD_data;
RD1=1;
WR1=0;
}
voidchunshu()//数据存储
{
uchari;
for(i=0;i<16;i++)
{
AD_caiji(i);
}
}
/********************************************
滤波模块
数据滤波去掉最大,最小值后求均值
**********************************************/
voidlvbo()
{
ucharx,y;
uintbuff;
for(x=15;x>0;x--)
{
for(y=x;y>0;y--)
{
if(AD_buffer[y]>AD_buffer[y-1])//大小排序(从大到小)
{
buff=AD_buffer[y-1];
AD_buffer[y-1]=AD_buffer[y];
AD_buffer[y]=buff;
}
}
buff=AD_buffer[0];
AD_buffer[0]=AD_buffer[x];
AD_buffer[x]=buff;
}
buff=0;
for(x=14;x>0;x--)
{
buff