这些控制技术大大的提高了控制精度,不但使控制变得简便,而且使产品的质量更好,降低了产品的成本,提高了生产效率。
论文首先介绍了单片机控制系统的整体方案设计及原理,然后具体介绍了控制系统的温度传感器部分、A/D转换部分、控制器89C51部分以及数码管显示和键盘控制部分,接着相信介绍了温度控制系统各个单元电路的设计,最后阐述了温度控制系统软件设计的主程序和各个子程序。
关键字:
单片机89C51温度传感器A/D转换器温度控制
1.设计目的
设计制作和调试一个由工业控制机控制的温度测控系统。
通过这个过程学习温度的采样方法,A/D变换方法以及数字滤波的方法。
通过实践过程掌握温度的几种控制方法,了解利用计算机进行自动控制的系统结构。
2.设计要求和设计指标
1、每组7名同学,每个小组根据设计室提供的设备及设计要求,设计出实际电路组成一个完整的计算机温度测控系统。
2、根据设备情况以及被控对象,选择1~2种合适的控制算法,
框图和源程序,并进行实际操作和调试通过。
编制程序温度指标:
60~80℃之间任选;偏差:
1℃。
3.总体方案设计
本系统主要由数据采集、信号放大、模数转换等模块构成。
设计思想是通过温度传感器将温度信号转变为电流<电压)信号,但我们要知道经温度变化引起电流<电压)信号的改变是非常小的,此时如果被模数转换器采集的话效果是非常不明显的,因此我们将其通过一个信号放大模块进行放大。
再通过模数转换器后送入单片机AT89C51,而单片机通过PID算法控制烘箱的电炉加热,并且使数码管显示实时温度,从而实现温度的高精度控制。
4.硬件选择以及相关电路设计
4.1温度传感器的选择
传感器的选取目前市场上温度传感器繁多就此我们提出了以下三种选取方案:
方案一:
选用铂电阻温度传感器,此类温度传感器在各方面特性都比较优秀,但其成本较高。
方案二:
采用热敏电阻,选用此类元器件有价格便宜的优点,但由于热敏电阻的非线性特性会影响系统的精度。
方案三:
选用美国AnalogDevices公司生产的二端集成电流传感器AD590,此器件具有体积小、质量轻、线形度好、性能稳定等优点。
其测量范围在-50℃--+150℃,满刻度范围误差为±0.3℃,当电源电压在5—10V之间,稳定度为1﹪时,误差只有±0.01℃,其各方面特性都满足此系统的设计要求。
比较以上三种方案,方案三具有明显的优点,因此此次设计选用方案三。
图4-1温度采集过程图
选用温度传感器AD590,AD590具有较高精度和重复性<重复性优于0.1℃,其良好的非线形可以保证优于0.1℃的测量精度,利用其重复性较好的特点,通过非线形补偿,可以达到0.1℃测量精度)。
超低温漂移高精度运算放大器OP-07将“温度-电压”信号放大。
便于A/D进行转换,以提高温度采集电路的可靠性。
集成温度传感器的输出形式分为电压输出和电流输出两种。
电压输出型的灵敏度一般为10mV/K,温度0℃时输出为0,温度25℃时输出为2.982V。
电流输出型的灵敏度为1µA/K。
这样便于A/D转换器采集数据。
4.2模数转换器
ADC0809是M美国国家半导体公司生产的CMOS工艺8通道,8位逐次逼近式A/D转换器。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换,其转换时间为100μs左右。
是目前国内应用最广泛的8位通用A/D芯片。
图4-2ADC0809引脚图
4.2.1ADC0809内部结构
图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法。
地址锁存与译码电路完成对A、B、C3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连,表4-1为通道选择表。
图4-3ADC0809内部结构图
表4-1通道选择表
4.2.2信号引脚
ADC0809的内部结构和外部引脚分别如图4-3和图4-2所示。
内部各部分的作用和工作原理在内部结构图中已一目了然,在此就不再赘述,下面仅对各引脚定义分述如下:
<1)IN0~IN7——8路模拟输入,通过3根地址译码线ADDA、ADDB、ADDC来选通一路。
<2)D7~D0——A/D转换后的数据输出端,为三态可控输出,故可直接和微处理器数据线连接。
8位排列顺序是D7为最高位,D0为最低位。
<3)ADDA、ADDB、ADDC——模拟通道选择地址信号,ADDA为低位,ADDC为高位。
地址信号与选中通道对应关系如表4-1所示。
<4)VR(+>、VR(->——正、负参考电压输入端,用于提供片内DAC电阻网络的基准电压。
在单极性输入时,VR(+>=5V,VR(->=0V;双极性输入时,VR(+>、VR(->分别接正、负极性的参考电压。
<5)ALE——地址锁存允许信号,高电平有效。
当此信号有效时,A、B、C三位地址信号被锁存,译码选通对应模拟通道。
在使用时,该信号常和START信号连在一起,以便同时锁存通道地址和启动A/D转换。
(6)START——A/D转换启动信号,正脉冲有效。
加于该端的脉冲的上升沿使逐次逼近寄存止,重新从头开始转换器清零,下降沿开始A/D转换。
如正在进行转换时又接到新的启动脉冲,则原来的转换进程被中。
<7)EOC——转换结束信号,高电平有效。
该信号在A/D转换过程中为低电平,其余时间为高电平。
该信号可作为被CPU查询的状态信号,也可作为对CPU的中断请求信号。
在需要对某个模拟量不断采样、转换的情况下,EOC也可作为启动信号反馈接到START端,但在刚加电时需由外电路第一次启动。
<8)OE——输出允许信号,高电平有效。
当微处理器送出该信号时,ADC0808/0809的输出三态门被打开,使转换结果通过数据总线被读走。
在中断工作方式下,该信号往往是CPU发出的中断请求响应信号。
4.2.3工作时序与使用说明
图4-4ADC0809工作时序图
用单片机控制ADC时,多数采用查询和中断控制两种方式。
查询法是在单片机把启动命令送到ADC之后,执行别的程序,同时对ADC的状态进行查询,以检查ADC变换是否已经完成,如查询到变换已结束,则读入转换完毕的数据。
中断控制是在启动信号送到ADC之后,单片机执行别的程序。
当ADC转换结束并向单片机发出中断请求信号时,单片机响应此中断请求,进入中断服务程序,读入转换数据,并进行必要的数据处理,然后返回到原程序。
这种方法单片机无需进行转换时间管理,CPU效率高,所以特别适合于变换时间较长的ADC。
本设计采用查询方式进行数据收集。
由于ADC0809片内无时钟,故运用8051提供的地址锁存使能信号ALE经D触发器二分频后获得时钟。
因为ALE信号的频率是单片机时钟频率的1/6,如果时钟频率为6MHz,则ALE信号的频率为1MHz,经二分频后为500kHz,与AD0809时钟频率的典型值吻合。
由于AD0809具有三态输出锁存器,故其数据输出引角可直接与单片机的总线相连。
地址码引脚ADDA~C分别与地址总线的低3位A0、A1、A2相连,以选通IN0~IN7中的一个通道。
采用单片机的P2.7<地址总线最高位A15)作为A/D的片选信号。
并将A/D的ALE和START脚连在一起,以实现在锁存通道地址的同时启动ADC0809转换。
启动信号由单片机的写信号和P2.7经或非门而产生。
在读取转换结果时,用单片机的读信号和P2.7经或非门加工得到的正脉冲作为OE信号去打开三态输出锁存器。
编写的软件按下列顺序动作:
令P2.7=A15=0,并用A0、A1、A2的组合指定模拟通道的地址;执行一条输出指令,启动A/D转换;然后根据所选用的是查询、中断、等待延时三种方式之一的条件去执行一条输入指令,读取A/D转换结果。
ADC0809是一个8路8位逐次逼近的A/D转换器。
AD0809的转换时间为100µs。
在CPU启动A/D命令后,便执行一个固定的延时程序,延时时间应略大于A/D的转换时间;延时程序一结束,便执行数据读入指令,读取转换结果。
我们只用了其一路AD转换,参考电压2.56V,即一位数字量对应10mV即1℃。
所以用起来很方便。
ADC0809是带有8路模拟开关的8位A/D转换芯片,所以它可有8个模拟量的输入端,由芯片的A,B,C三个引脚来选择模拟通道中的一个。
A,B,C三端分别与AT89C51的P0.0~P0.2相接。
地址锁存信号(ALE>和启动转换信号输出允许,由P2.6和/RD或非得到。
时钟信号,可有89C51的ALE输出得到,不过当采用12M晶振时,应该先进行二分频,以满足ADC0809的时钟信号必须小于640K的要求。
4.3控制器89C51
AT89C51是美国ATMEL公司生产的低电压,高性能CMOS8位单片机,片内含4kbytes的可反复擦写的Flash只读程序存储器和128bytes的随机存取数据存储器(RAM>,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU>和Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比的应用场合,可灵活应用于各种控制领域。
AT89C51单片机的主要特性:
(1>与MCS-51兼容,4K字节可编程闪烁存储器;
(2>灵活的在线系统编程,掉电标识和快速编程特性;
(3>寿命为1000次写/擦周期,数据保留时间可10年以上;
(4>全静态工作模式:
0Hz-33Hz;
(5>三级程序存储器锁定;
(6>128*8位内部RAM,32可编程I/O线;
(7>两个16位定时器/计数器,6个中断源;
(8>全双工串行UART通道,低功耗的闲置和掉电模式;
(9>片内振荡器和时钟电路;
图4-5AT89C51结构图
4.4数码管显示电路
4.4.1LED数码管的组成
LED数码管显示器是由发光二极管显示字段的显示器件,也称为数码管。
其结构如图4-6所示。
它由8个发光二极管构成,通过不同的组合可用来显示0-9、A-F及小数点“.”等字符。
数码管有共阴极和共阳极两种结构规格,电阻为外接。
共阴极数码管的发光二极管阴极共地,当某发光二极管的阳极为高电平时,二极管点亮;共阳极数码管的发光二极管是阳极,并接高电平,对于需点亮的发光二极管将其阴极接低电平即可。
图4-6LED数码管显示图
4.4.2数码管显示方式
<1)静态显示方式
直接利用并行口输出。
LED显示工作于静态显示方式时,各位的共阴极连接在一起接地。
每位的段选线分别于一个8位的锁存输出相连。
一般称之为静态显示,是由于显示器中的各位相互独立。
而且各位的显示字符一经确定,相应锁存器的输出将维持不变,直到显示另一个字符为止。
本实验采用串入并出的静态显示方式。
利用通信号串行输出。
在实际应用中,多位LED显示时,为了简化电路,在系统不需要通信功能时,经常采用串行通信口工作方式0,外接移位寄存器74LS164来实现静态显示。
<2)动态显示方式
对多位LED显示器的动态显示,通常都时采用动态扫描的方法进行显示,即逐个循环点亮各位显示器。
这样虽然在任一时刻只有一位显示器被点亮,但是由于间隔时间较短,且人眼具有视觉残留效应,看起来与全部显示器持续点亮一样。
为了实现LED显示器的动态扫描,除了要给显示器提供的输入之外,还要对显示器加位选择控制,这就是通常所说的段控和位控。
因此多位LED显示器接口电路需要有两个输出口,其中一个用于输出8位控信号;另一个用于输出段控信号,其连接图如图4-7所示。
图4-7数码管显示电路
5.PID控制算法
在工程实际中,应用最为广泛的调节器控制规律为比例、积分、微分控制,简称PID控制,又称PID调节。
PID控制器问世至今已有近70年历史,它以其结构简单、稳定性好、工作可靠、调整方便而成为工业控制的主要技术之一。
当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确定,这时应用PID控制技术最为方便。
即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用PID控制技术。
PID控制,实际中也有PI和PD控制。
PID控制器就是根据系统的误差,利用比例、积分、微分计算出控制量进行控制的。
PID控制器广泛的应用于各种工业控制。
其主要的优点在于:
原理简单,使用方便;适应性强;鲁棒性好;对模型依赖少。
它是将给定值与实际输入值进行偏差计算得到e(t>,然后进行比例、积分、微分计算,通过线性组合构成控制器,实现对被控对象的控制。
对于增量型的PID控制规律为:
Uk=kp*ek+ki*∑ek+kd*(ek-ek-1>Uk为PID控制的输出信号
6.各子程序设计及流程图
6.1A/D转换程序流程图
数据处理
图6-1A/D转换程序流程图
6.2显示程序流程图
图6-2显示程序流程图
6.3PID控制器流程图
图6-3PID控制器流程图
6.4温度控制总程序流程图
图6-4温度控制总程序流程图
总结
在工业生产和日常生活中,对温度控制系统的要求,主要是保证温度在一定温度范围内变化,稳定性好,不振荡,对系统的快速性要求不高。
在论文中简单分析了单片机温度控制系统设计过程及实现方法。
本系统的测温范围为-10℃~40℃,温度检测系统根据用户设定的温度范围完成一定范围的温度控制。
AT89C5包括14k字节Flash闪速存储器,128字节内部RAM,32个I/O口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路,都为我们实现电路功能提供了非常有利的条件。
同时也因为开发环境友好,易用,方便,大大加快本系统设计开发。
参考文献
[1].于海生等编著.微型计算机控制技术[M].北京:
机械工业出版社,2007.
[2].邴志刚等编著.计算机控制:
基础•技术•工具•实例[M].北京:
清华大学出版社,2005.
[3].邹伯敏主编.自动控制原理(第二版>[M].北京:
机械工业出版社,2002.
[4].吕震中,刘吉臻,王志明编.计算机控制技术与系统<第二版)[M],北京:
中国电力出版社,2005.
[5].张宇河主编.计算机控制系统[M].北京:
北京理工大学出版社,2002.
[6].冯勇编,现代计算机控制系统[M].哈尔滨:
哈尔滨工业大学出版社,2003
[7].曹巧媛主编.单片机原理及应用(第二版>.北京:
电子工业出版社,2002
[8].周润景,张丽娜.基于PROTEUS的电路及单片机系统设计与仿真[M].北京:
航空航天大学出版社,2006.P321~P326
[9].王忠飞,胥芳.MCS-51单片机原理及嵌入式系统应用[M].西安:
西安电子科技大学出版社,2007.P268-273
附录1:
温度控制系统总电路图
附录2:
温度控制系统程序清单
<1)主函数如下:
#include
#include
#include"KEYSCAN.H"
#include"PID.H"
voidPIDBEGIN(void>。
//PID参数初始化//
voidmain(>
{
unsignedcharkey1=0,i,k。
unsignedinttmp。
unsignedcharshu[3]={13,13,0}。
unsignedcharcounter=0。
PIDBEGIN(>。
while(1>
{
if(counter--==0>
{
tmp=ReadTemperature(>。
counter=20。
}
view(tmp>。
//温度显示;
compare_temper(>。
}
}
<2)PID算法温度控制程序
#ifndef_PID_H__
#define_PID_H__
#include
#include
#include
structPID{
unsignedintSetPoint。
//设定目标DesiredValue
unsignedintProportion。
//比例常数ProportionalConst
unsignedintIntegral。
//积分常数IntegralConst
unsignedintDerivative。
//微分常数DerivativeConst
unsignedintLastError。
//Error[-1]
unsignedintPrevError。
//Error[-2]
unsignedintSumError。
//SumsofErrors
}
structPIDspid。
//PIDControlStructure
unsignedintrout。
//PIDResponse(Output>
unsignedintrin。
//PIDFeedback(Input>
sbitoutput=P3^4。
unsignedcharhigh_time,low_time,count=0。
//占空比调节参数
unsignedcharset_temper=33。
voidPIDInit(structPID*pp>
{
memset(pp,0,sizeof(structPID>>。
}
unsignedintPIDCalc(structPID*pp,unsignedintNextPoint>
{
unsignedintdError,Error。
Error=pp->SetPoint-NextPoint。
//偏差
pp->SumError+=Error。
//积分
dError=pp->LastError-pp->PrevError。
//当前微分
pp->PrevError=pp->LastError。
pp->LastError=Error。
return(pp->Proportion*Error//比例
+pp->Integral*pp->SumError//积分项
+pp->Derivative*dError>。
//微分项
}
温度比较处理子程序
compare_temper(>
{
unsignedchari。
//EA=0。
if(set_temper>temper>
{
if(set_temper-temper>1>
{
high_time=100。
low_time=0。
}
else
{
for(i=0。
i<10。
i++>
{get_temper(>。
rin=s。
//ReadInput
rout=PIDCalc(&spid,rin>。
//PerformPIDInteration
}
if(high_time<=100>
high_time=(unsignedchar>(rout/800>。
else
high_time=100。
low_time=(100-high_time>。
}
}
elseif(set_temper<=temper>
{
if(temper-set_temper>0>
{
high_time=0。
low_time=100。
}
else
{
for(i=0。
i<10。
i++>
{get_temper(>。
rin=s。
//ReadInput
rout=PIDCalc(&spid,rin>。
//PerformPIDInteration
}
if(high_time<100>
high_time=(unsignedchar>(rout/10000>。
else
high_time=0。
low_time=(100-high_time>。
//EA=1。
}
}
}
/T0中断服务子程序,用于控制电平的翻转,40us*100=4ms周期
voidserve_T0(>interrupt1using1
{
if(++count<=(high_time>>
output=1。
elseif(count<=100>
{
output=0。
}
else
count=0。
TH0=0x2f。
TL0=0xe0。
}
voidPIDBEGIN(>
{
TMOD=0x01。
TH0=0x2f。
TL0=0x40。
EA=1。
ET0=1。
TR0=1。
high_time=50。
low_time=50。
PIDInit(&spid>。
//InitializeStructure