小型澡堂供水总管温度控制系统的设计剖析Word下载.docx
《小型澡堂供水总管温度控制系统的设计剖析Word下载.docx》由会员分享,可在线阅读,更多相关《小型澡堂供水总管温度控制系统的设计剖析Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
系统采用AT89C51作为系统的微处理器来完成对水温的控制和键盘显示功能。
C51单片机片内除了128B的RAM外,片内又集成了4KB的ROM作为程序存储器,是一个程序不超过4K字节的小系统。
系统程序较多时,只需要外扩一个容量较小的程序存储器,占用的I/O口减少,同时也为键盘、显示等功能的设计提供了硬件资源,简化了设计,降低了成本。
因此89C51可以完成设计要求。
综上所述的二种方案,该设计选用方案二比较合适。
3系统总体结构设计
单片机温度控制系统是以89C51单片机为控制核心,辅以采样反馈电路,驱动电路,晶闸管主电路对电炉炉温进行控制的微机控制系统。
其系统基本控制原理为:
将温度设定值(即60℃)和温度反馈值同时送入控制电路部分,然后经过调节器运算得到输出控制量,输出控制量控制驱动电路得到控制电压施加到被控对象上,电炉因此达到规定的温度。
结构图如图3-1所示:
图3-1电阻炉控制系统总体结构设计图
图3-2
系统总体结构图
4系统模块设计
4.1温度信号输入通道
温度检测电路包括温度检测电路、放大器和A/D转换三部分。
原理图如图4-1所示
图4-1温度输入信号通道
4.1.1温度传感器
采用的是NationalSemiconductor所生产的LM35。
计算公式:
LM35是一种得到广泛使用的温度传感器。
由于它采用内部补偿,所以输出可以从0℃开始。
LM35有多种不同封装型式。
在常温下,LM35不需要额外的校准处理即可达到±
1/4℃的准确率。
其在静止温度中自热效应低(0.08℃),单电源模式在25℃下静止电流约50μA,工作电压较宽,可在4—20V的供电电压范围内正常工作非常省电。
工作电压4~30V,在上述电压范围以内,芯片从电源吸收的电流几乎是不变的(约50μA),所以芯片自身几乎没有散热的问题。
这么小的电流也使得该芯片在此系统中特别适合,输出可以由第三个引脚取出,根本无需校准。
4.1.2运算放大器
运算放大器采用差动运算放大器LM324。
LM324系列器件带有差动输入的四运算放大器。
与单电源应用场合的标准运算放大器相比,它们有一些显著优点。
该四放大器可以工作在低到3.0伏或者高到32伏的电源下,静态电流为MC1741的静态电流的五分之一。
共模输入范围包括负电源,因而消除了在许多应用场合中采用外部偏置元件的必要性。
可以得出运放的输出电压为
为了使后面的A/D转换器得到合适的输入模拟电压,本系统选取==100kΩ,==200kΩ。
4.1.3A/D转换器
ADC0809是CMOS单片型逐次逼近式A/D转换器,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型D/A转换器、逐次逼近寄存器、逻辑控制和定时电路组成。
温度信号输入通道的总增益由温度传感器、运放和A/D转换器三个环节的增益所决定。
在本系统中,由于温度要求100℃是固定的,这三个环节的增益也是固定的。
这样有利于整个通道在设计和安装时,避免不必要的精度误差和偏差。
4.2执行信号输出通道
本系统采用脉冲宽度调制(PWM)的控制方法。
单片机输出控温信号:
输出高电平时,使双向可控硅导通,电热丝通电;
输出低电平时,双向可控硅截止,电热丝断电。
脉冲宽度与周期T的比值为P,它反映了系统的输出控制量。
执行信号输出通道的原理图如图3-2所示,单片机系统AT89C51的P2.5口输出信号经过光电耦合器,直接控制双向可控硅的门极,从而控制电热丝的平均加热功率。
这样使输出通道省去了数/模(D/A)转换器和可控硅一项触发电路,大大简化了硬件;
而且可控硅工作在过零触发状态,提高了设备的功率因数,减轻了对电网的干扰。
AT89C51的I/O脚的负载能力不足以驱动光电耦合器的发光二极管,所以用1413的一路作为功放。
光电耦合器的光敏二极管所能通过的电流足以触发5A的双向可控硅,其间不必加功放环节,其中对可控硅可用负极性触发。
图3-2执行输出信号控制通道
触发电路6V不必采用稳压,只需一般的阻容滤波即可,但不能与单片机基本系统5V电源相通。
可控硅门极回路与220V电源相通,光电耦合器的结缘耐压能有效地把单片机系统与220V强电隔离。
4.3LED接口设置
设计中用到四个LED数码管显示器。
LED工作方式有两种:
静态显示方式和动态显示方式。
LED数码管,其原理和数字表扫描显示的原理一致即采用动态显示,动态显示是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
选择导通数码管的方式是采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路的。
图3-3显示模块电路图
4.4单片机及其电路设计
单片机控制系统原理图如图3-4所示。
微处理器采用51系列单片机AT89C51。
单片机系统的硬件结构简单,调试方便。
单片机系统主要I/O口的分配如下:
89C51的P1口为温度信号的输入口,P0口为温度显示信号数据输出,P2口的P2.0端到P2.3端为显示信号的扫描,P2.4端口为执行信号输出口。
图3-4单片机控制系统
5SMITH预估控制算法
如图4-1,在所示的单回路控制系统中,D(s)表示控制器的传递函数,用于校正
部分;
表示被控对象的传递函数,
为表示被控制对象中不包含纯滞后部分的传递函数,
为被控制对象纯滞后部分的传递函数。
y(t)
D(s)
—
u(t)
e(t)
图5-1带纯滞后环节的控制系统
令
=
,
为被控对象的放大系数,;
为被控对象的时间常数;
为纯滞后时间。
由图4-2可见,纯滞后补偿的数字控制器由两部分组成:
一部分是数字PID控制器(由D(s)离散化得到);
一部分是施密斯预估器。
图5-2具有纯滞后补偿的控制系统
施密斯预估器的输出可按图5-3的顺序计算:
图3-3史密斯预估器框图
图中,u(k)是PID数字控制的输出,是施密斯预估的输出。
从图中可知,必须先计算传递函数的输出m(k)后,才能计算反馈回路偏差:
纯滞后补偿器的输出:
其中
,上式称为施密斯预估控制算式。
偏差:
控制器的输出:
式中,
为PID控制的比例系数;
为积分系数;
为微分系数。
在纯滞后补偿控制算法中,相对于标准的PID算法,只是加入了补偿环节,可以采用PID的方式来处理。
为了提高控制质量,我们对其进行改进,采用所谓的积分分离的PID位置式算法。
当偏差绝对值小于某一预定门限时,采用标准的PID算法:
式中:
为系统控制量,
为第i-1次偏差,T为采样周期,
为积分时间,k为比例系数,
为系统基准控制量。
当偏差绝对值大于这一预定门限时,舍去积分项的运算。
6系统软件设计
系统主程序初始化时,允许INT0中断,并设置为边沿触发方式,ADC0809EOC为中断请求信号口,中断服务程序把“转换结束”标志置位时,采用查询的方式,根据ADC0809的D0~D7的信息分别进行处理和存放。
程序的每次循环,只读入一组数据。
为了削弱干扰和纯滞后带来的影响,程序采用纯滞后补偿的方法,即SMITH预估控制,对读入信号进行平滑加工。
显示更新程序把滤波后的温度从单片机的P0输送到显示接口电路。
图5-1控制系统的主流程图
程序还对系统控制量作上、下限幅,使输出脉冲宽度与脉冲周期的比值p的范围为5%~95%。
本系统中的脉冲周期取10s,与采样周期相同,这样与电热元件并联的指示灯始终闪烁发光,这是系统正常工作的一种标志。
操作人员还可以从亮、暗时间的比例,方便地了解系统的控制量。
控制系统主流程图如上图所示。
心得体会
本次课程设计之初,通过老师的给的资料,对报告的要求和所设计的内容有了一定的了解。
由于对电阻炉,温度传感器等不是太了解,于是在我查询了相关的资料,了解了电阻炉,温度传感器,根据题目的要求选择了热电阻中的铂电阻。
同时本次课程设计中运用到了51单片机、ADC0809等较多的芯片,为此查询了相关芯片的引脚图,对这些芯片有了大致的了解,在学会使用这些芯片的过程,加深了我运用专业知识解决实际问题的能力并且在芯片选型以及设计方案对比方面有了一定的训练。
本次课程设计让Protues,Word,Keil等软件的使用,增强了我相应专业软件的使用能力,对单片机的使用让我重新回顾了C语言和汇编语言的使用,对以前的知识有了复习的机会。
而本次课程设计主要的难点也是在于程序的设计。
本次课程设计中也遇到了些问题,如刚开始时题目的理解错误,程序运行出错,仿真出问题等,在同学的指导和帮助下,这些问题得到了一定的解决。
在今后的学习生活中也是如此,除了自己的努力外,还需请教他人,从他人那里学习有关经验和获得帮助,另外此次课程设计为毕业设计打下了良好的基础。
参考文献
[1]陈立周、陈宇.《单片机原理及其应用》.机械工业出版社,2006
[2]于海生.《计算机控制技术》.机械工业出版社,2003
[3]谭浩强.《C程序设计》.清华大学出版社,2005
[4]于海生.《计算机控制技术》.机械工业出版社,2007.
[5]刘红丽、张菊秀.《传感与检测技术》.国防工业出版社,2007.
[6]康华光编著.《电子技术基础.模拟部分》.高等教育出版社,2000
附录一
电阻炉微型计算机温度控制系统设计原理图:
附录二
程序代码
#include<
reg51.h>
intrins.h>
math.h>
string.h>
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)
sbitdata1=P1^0;
sbitclk=P1^1;
sbitplus=P2^0;
sbitsubs=P2^1;
sbitstop=P2^2;
sbitoutput=P3^4;
sbitDQ=P3^3;
unsignedcharflag,flag_1=0;
unsignedcharhigh_time,low_time,count=0;
//占空比调节参数
unsignedcharset_temper=35;
unsignedchartemper;
unsignedchari;
unsignedcharj=0;
unsignedints;
/***********************************************************
延时子程序,延时时间以12M晶振为准,延时时间为30us×
time
***********************************************************/
voiddelay(unsignedchartime)
{
unsignedcharm,n;
for(n=0;
n<
time;
n++)
for(m=0;
m<
2;
m++){}
}
获取温度子程序
voidget_temper()
unsignedchari,j;
do
i=reset();
/*复位*/
}while(i!
=0);
/*1为无反馈信号*/
i=0xcc;
/*发送设备定位命令*/
write_byte(i);
i=0x44;
/*发送开始转换命令*/
delay(180);
/*延时*/
/*设备定位*/
i=0xbe;
/*读出缓冲区内容*/
j=read_byte();
i=read_byte();
i=(i<
<
4)&
0x7f;
s=(unsignedint)(j&
0x0f);
s=(s*100)/16;
j=j>
>
4;
temper=i|j;
/*获取的温度放在temper中*/
/****************************************************************
Smith控制算法
****************************************************************/
voidSMITHInit(structSMITH*pp)
{
memset(pp,0,sizeof(structSMITH));
}
/**************************************************************
SMITH计算部分
**************************************************************/
unsignedintSMITHCalc(structSMITH*pp,unsignedintNextPoint)
unsignedintdError,Error;
Error=pp->
SetPoint-NextPoint;
//偏差
pp->
SumError+=Error;
//积分
dError=pp->
LastError-pp->
PrevError;
//当前微分
PrevError=pp->
LastError;
LastError=Error;
return(pp->
Proportion*Error//比例项
+pp->
Integral*pp->
SumError//积分项
Derivative*dError);
//微分项
温度比较处理子程序
compare_temper()
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);
low_time=(100-high_time);
elseif(set_temper<
=temper)
if(temper-set_temper>
0)
high_time=0;
low_time=100;
100)
high_time=(unsignedchar)(rout/10000);
//else
//{}
/*****************************************************
T0中断服务子程序,用于控制电平的翻转,40us*100=4ms周期
******************************************************/
voidserve_T0()interrupt1using1
if(++count<
=(high_time))
output=1;
elseif(count<
output=0;
count=0;
TH0=0x2f;
TL0=0xe0;
显示子程序
voiddisplay()
unsignedcharcodenumber[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
unsignedchardisp_num[6];
unsignedintk,k1;
k=high_time;
k=k%1000;
k1=k/100;
if(k1==0)
disp_num[0]=0;
disp_num[0]=0x60;
k=k%100;
disp_num[1]=number[k/10];
disp_num[2]=number[k%10];
k=temper;
disp_num[3]=number[k/10];
disp_num[4]=number[k%10]+1;
disp_num[5]=number[s/10];
disp_1(disp_num);
主程序
main()
unsignedcharz;
unsignedchara,b,flag_2=1,count1=0;
unsignedcharphil[]={2,0xce,0x6e,0x60,0x1c,2};
;
TMOD=0x21;
TL0=0x40;
SCON=0x50;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
PS=1;
EA=1;
EX1=0;
ET0=1;
ES=1;
TR0=1;
TR1=1;
high_time=50;
low_time=50;
PIDInit(&
spid);
//InitializeStructure
spid.Proportion=10;
//SetPIDCoefficients
spid.Integral=8;
spid.Derivative=6;
spid.SetPoint=100;
//SetPIDSetpoint
while
(1)
if(plus==0)
EA=0;
for(a=0;
a<
5;
a++)
for(b=0;
b<
102;
b++){}
set_temper++;
flag=0;
elseif(subs==0)
if(subs==0)
set_temper