水温自动控制系统设计.docx
《水温自动控制系统设计.docx》由会员分享,可在线阅读,更多相关《水温自动控制系统设计.docx(50页珍藏版)》请在冰豆网上搜索。
水温自动控制系统设计
嵌入式系统设计性实验报告
作者:
班级:
学号
摘要:
在工业生产中,电流、电压、温度、压力、流量、流速和开关量都是常用的主要被控参数。
其中,温度控制也越来越重要。
在工业生产的很多领域中,人们都需要对各类加热炉、热处理炉、反应炉和锅炉中的温度进行检测和控制。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而大大的提高产品的质量和数量。
因此,单片机对温度的控制问题是工业生产中经常会遇到的控制问题.该实验设计基于飞思卡尔MC9S12DG128开发板平台,根据实验任务要求,完成了基于单片机的水温自动控制系统的设计。
关键字:
飞思卡尔单片机水温自动控制MC9S12DG128
前言:
温度是生活以及生产中最基本的物理量,它表征的是物体的冷热程度。
自然界中任何物理、化学过程都与温度有着密切的联系。
在很多生产过程中,温度的测量和控制都直接关系安全生产、生产效率、生产质量、能源利用等方面的问题。
因此,温度的测量和控制在我国的很多经济领域都受到高度重视。
在实际的生产实验环境下,由于系统内部和外界的热量交换是很难控制的,而且其他干扰因素也是无法去精确计算的,因此温度量的变化往往受到不可精确预计的外界环境扰动的影响。
但是正常工业生产过程中,对生产中的温度要求又是相对精确和苛刻的,工业生产中经常要保持反应炉中保持一定的温度,来促进反应的持续快速进行,同时,以前的温度控制大多是人工通过仪表的显示来调节温度的模式,然而人工控制温度的精确度不高,而且反应不灵敏,存在较大误差,因此需要更好的测温控温方法。
随着电子技术和计算机的迅速发展,计算机测量控制技术拥有操作简单、控制灵活、使用便捷以及性价比较高的优点从而得到了广泛应用。
单片机是一种集CPU、RAM、ROM、I/O接口和中断系统等部分于一体的器件,只需要外加电源和晶振就可以实现对数字信息的处理和控制,因此,单片机广泛应用于现代工业控制中。
此控制具有重量轻、体积小、价格低、可靠性高、耗电低和操作灵活等优点,因此利用单片机进行温度测量控制会大大提高其可靠性和准确性。
单片机对温度的测量控制是基于传感器、A/D转换器以及扩展接口和执行机构来进行的。
在闭环过程控制系统中,过程的实时参数由传感器和A/D转换器来进行实时采集,并由单片机自动记录、处理并控制执行机构来进行调节和控制。
因此需要对单片机进行扩展和开发,来形成一个完整的单片机温度控制系统。
一.系统方案
1.1水温控制系统设计任务和要求
该系统为一实验系统,系统设计任务:
设计并制作一个水温自动控制系统,控制对象为1升净水,容器为搪瓷器皿。
水温可以在一定范围内由人工设定,并能在环境温度降低时实现自动控制,以保持设定的温度基本不变。
同时满足以下要求:
(1)温度设定范围为40~90℃,最小区分度为1℃,标定温度≤1℃。
(2)环境温度降低时(例如用电风扇降温)温度控制的静态误差≤1℃。
(3)用十进制数码管显示水的实际温度保留一位小数。
(4)采用适当的控制方法(如数字PID),当设定温度突变(由40℃提高到60℃)时,减小系统的调节时间和超调量。
(5)温度控制的静态误差≤0.2℃。
(6)从串口输出水温随时间变化的数值。
1.2水温控制系统部分
水温控制系统是一个过程控制系统,组成框图如下所示,有控制器、执行器、被控对象及其反馈作用的测量变送组成。
控制系统框图
1.2.1CPU——中央处理器
采用89S52单片机实现,此单片机软件编程自由度大,可以编程实现各种控制算法和逻辑控制。
进行数据转换,控制电路部分采用SSR固态继电器控制电炉丝的通断此方案电路简单可以满足题目中的各项要求的精度。
下图为以AT89S52单片机为检测控制中心的水箱温度自动控制系统,总体框图如下:
控制器设计总体框图
温度控制采用改进的PID数字控制算法,显示采用3位LED静态显示,该设计结构简单,控制算法新颖,控制精度高,具有较强的通用性。
1.2.2温度控制系统算法分析
常用的控制算法有以下几种:
1.经典的比例积分微分控制算法;
2.根据动态系统的优化理论得到的自适应控制和最优控制方法;
3.根据模糊集合理论得到模糊控制算法。
水温控制系统的控制对象具有热储存能力大,惯性也较大的特点,水在容器内的流动或热量传递都存在一定的阻力,因而可以归于具有纯滞后的一阶大惯性环节。
对于大惯性系统的过渡过程控制,一般可采用以下几种控制方案:
开关量控制
这种方法通过比较给定值与被控参数的偏差来控制输出的状态,开通或关断,因此控制过程十分简单,也容易实现;但由于输出控制量只有两种状态,使被控参数在两个方向上变化的速率均为最大,因此容易引起反馈回路振荡,控制精度不高;这种控制方案一般在大惯性系统对控制精度和动态特性要求不高的情况下采用。
比例控制(P控制)
比例控制的输出与偏差成比例关系,当负荷变化时,抗干扰能力强,过渡过程时间短,但过程终了存在余差;适用于控制通道滞后较小、负荷变化不大、允许被控量在一定范围内变化的系统。
比例积分控制(PI控制)
控制器的输出与偏差的积分成比例,积分的作用使过渡过程结束时无余差,但降低了系统的稳定性;PI控制适用于滞后较小,负荷变化不大,被控量不允许有余差的控制系统。
比例积分加微分控制(PID控制)
微分的作用使控制器的输出与偏差变化的速度成比例,它对克服对象的容量滞后有显著的效果;在比例基础上加入微分作用,使稳定性提高,再加上积分作用,可以消除余差;PID控制适用于负荷变化大、容量滞后较大、控制品质要求又很高的控制系统。
结合本设计任务与要求,由于水温系统的传递函数事先难以精确获得,因而很难判断哪一种控制方法能够满足系统对控制品质的要求;但从以上对控制方法的分析来看,PID控制方法最适合本例采用:
一方面,由于可以采用单片机实现控制过程,无论哪一种控制方法都不会增加系统硬件成本,而只需对软件作相应改变即可实现不同的控制方案;另一方面,采用PID的控制方式可以最大限度地满足系统对诸如控制精度、调节时间和超调量等控制品质的要求。
1.2.3控制策略
PID控制器是一种线性控制器,它根据给定值r(t)与实际输出值y(t)构成控制偏差e(t):
将偏差e(t)的比例P、积分I和微分D通过线性组合成控制量,对被控对象进行控制,因此成为PID控制。
其控制规律为
或者写成传递函数形式:
式中:
:
比例系数
:
积分时间常数
:
微分时间常数
二、系统设计的功能
系统整体框图
本系统软件设计包括两个部分:
管理程序和控制程序。
管理程序包括LED显示动态刷新、控制指示灯、处理键盘的扫描和响应。
用来进行掉电保护的处理、执行中断服务操作等等。
另一方面,控制程序包括A/D转换、数据采样、数字处理、报警设置、中值滤波、PID计算等等。
系统整体框图如上图。
该系统组成部分:
单片机:
单片机是整个控制系统的核心,在此我们用AT89S52可以提供系统控制所需要的I/0口、中断、定时以及存放中间结果的RAM电路。
键盘设定:
用于温度设定,一共有三个按键。
数据采样:
将由传感器及相关电路采集到的温度转为电压信号,经A/D转换后,送入AT89S52相应接口中,换算成温度值,用于控制和显示。
数据显示:
采用了共阴极数码管LED进行显示设置温度与测量温度。
串行口传输:
将采样温度值,上传至PC机,可利用PC的端口下载程序。
继电器/热电管:
通过三极管控制继电器的开关来完成对热电炉的功率控制。
三、硬件设计原理及内容
3.1硬件设计原理图
硬件原理图
3.2串口通信部分电路
串口通信电路
串口电路主要用于连接具有相同接口的室内设备。
本次采用的是9芯接头的串行口,引脚含义如下:
1.接收线信号检测(载波检测DCD)6.数据通信设备准备就绪(DSR)
2.接受数据线(RxD)7.请求发送(RTS)
3.发送数据线(TxD)8.清除发送
4.数据中断准备就绪(DTR)9.振铃指示
5.信号地(SG)
3.3键盘设置电路
我用4*4键盘设计温度输入,如上图所示,S1~S9分别对应1~9,S10对应0
3.4数码显示电路
数码管作为单片机系统最为常用的输出器件,在显示时候可以由数字和少量字母组合完成输出功能的系统中应用十分广泛。
四、系统软件设计流程
4.1程序框架结构
一个整体的系统软件设计是由各个在系统里起着不同作用的模块整合在一起,从而实现系统的所要实现的功能。
本系统硬件接口如下:
P1--AD;
P00~P07--LEDa~LEDdp.;
P25~P27--S1~S3;
P20~P23--COM1~COM3;
此系统包括主控制程序,A/D采样数据处理程序,PID算法程序,LED显示及按键处理程序。
结构框架如下图:
程序结构图
4.2程序流程图及程序
4.2.1主程序模块
由于模块化程序的设计,通过调用程序即可实现所需使用的功能,主程序流程图如下图:
主程序流程图
主程序如下:
//函数:
主程序
//语法:
intmain(void)
//描述:
键盘扫描、温度控制
//参数:
无
//返回:
无
intmain(void)
{intKeyValue;
status=temperature_set;
System_Initial();
PID_Initial();//PID初始化
while
(1){
KeyValue=GetCh();//键盘扫描、去抖动处理、取键值
key_value_process(KeyValue);//键值处理
if(status=temperature_control)
display_AD_temperature();//测量温度显示、PID计算
if(Out<=0)turn_off_timer();
}
}
4.2.2系统初始化
系统初始化包括A/D口初始化、按键初始化等。
对端口的初始化即是对端口相应位进行设置。
A/D口初始化程序:
voidSystem_Initial(void)
{
CS=1;
WR=1;
RD=1;
}
4.2.3按键程序
(1)、按键扫描:
当按下一个键是,会出现所按的键在闭合位置与断开位置之间跳几下才稳定到闭合状态的情况,当释放一个按键时也会出现类似的情况,这就是抖动的问题。
抖动持续的时间因操作者而异,一般为5~10ms,稳定闭合时间一般为十分之几秒~几秒,由操作者的按键动作所确定。
在软件上,解决抖动的方法通常是延迟等待抖动的消失或多长识别判定。
如下图:
程序:
sbitS1=P2^5;
sbitS2=P2^6;
sbitS3=P2^7;
unsignedGetCh(void)
{
unsignedchars=0,k=0;
if(!
S1)s=1;
if(!
S2)s=2;
if(!
S3)s=3;
k=s;
if(s)
{
while(s)
{
delay(1000);
s=0;
if(!
S1)s=1;
if(!
S2)s=2;
if(!
S3)s=3;
}
}
returnk;
}
(2)键值处理:
4.2.4A/D采样数据处理
当采样到温度数据时,为了防止在采样过程中外界干扰而造成采样数据的不准确,必须调用温度均值处理程序,然后确定温度系数使采样转换得到的电压信号转换成温度值,并进行十进制转换,用于显示和PID计算。
其中均值处理是一个比较重要的环节,是A/D转换前必不可少的工具,流程图如下图所示:
子程序如下:
voidGetAD(void)
{
CS=0;
nop();\\空操作
WR1=0;
Delay(100);
WR1=1;
nop();
CS=1;
while(!
INTR);
nop();
CS=0;
nop();
RD1=0;
nop();
dat=P2;
RD1=1;
nop();
CS=1;
ch=dat;
intadc_data;
if(G_ADC_flag){//判断是否有温度采样1,有;0,无
G_ADC_flag=0;
adc_data=adc_data_cmp();
adc_data/=SET_ADC_TIME;//计算温度平均值
if(adc_data>0x0255)K=0.079;//确定温度系数
elseK=0.076;
fT=adc_data*K;//换算成温度值
//将温度值转换成十进制用于LED显示
guiLED_Value[0]=(int)fT/10;
guiLED_Value[1]=(int)fT%10;
guiLED_Value[2]=(int)(fT*10)%10;
stPID.Proportion=1;//设置PID比例值
stPID.Integral=0.5;//设置PID积分值
stPID.Derivative=0.0;//设置PID微分值
Out=100*PIDCalc(&stPID,(int)(fT*10));//PID计算
}
}
4.2.4数据采样中断
下图是数据采样中断服程序的流程图,此中断程序采用的是2Hz中断,定时0.5秒采样一次。
采样中断程序:
//函数:
intadc_data_cmp()
//语法:
intadc_data_cmp()
//描述:
ADC采样数据的均值处理,抗干扰作用
//参数:
无
//返回:
无
intadc_data_cmp()
{intmax;
intmin;
intSum;
inti;
max=ADC_DataSave[0];
for(i=0;i<10;i++)
{
if(ADC_DataSave[i]>max)
max=ADC_DataSave[i];//取出最大值
}
min=ADC_DataSave[i];
for(i=0;i<10;i++){
if(ADC_DataSave[i]min=ADC_DataSave[i];//取出最小值
}
for(i=0;i<10;i++)
Sum+=ADC_DataSave[i];//计算累计值
Sum=Sum-max-min;//排除最大最小值
return(Sum);
}
4.2.5继电器控制
继电器是和单片机HCS12的P25口相连的,它的开断完全取决于PID计算的结果。
当输出小于零说明设定值小于实际输出值,这是就要关闭电炉,同时关闭定时器的计时。
如果输出值大于设定值2摄氏度时就可以开电炉对水开始加热。
如果设定值与实际输出值差值在2摄氏度以内时,我们就调用中断程序定时加热。
下图控制程序的中断服务程序,用来对继电器定时加热。
它利用中断定时器10ms确定加热时间,当加热时间未到时,继续时间累积,若加热时间到时,就调用关定时器子程序,停止计时。
控制程序中断程序流程图
五、调试过程及数据
5.1串口调试
通过串口RS232和PC机进行连接,同时利用PC机上的超级终端进行串口调试。
输入串口通信函数,并把单片机的PC机的波特率设置为相同值(在此我们设为9600bit/s)。
调试完成后输入数据和输出数据符合理论要求,接受正常,验证串口调试完毕。
5.2键盘调试
按原理图接上电路,烧写程序,由键盘上的0~9来控制数据,A键表示设定温度值,B键表示保存退出。
5.3LED数码管调试
调试过程中按实验电路将数码管与单片机连接,载入程序,运行后发现LED显示正常,显示为程序设定值“3210”但是却不显示小数点位,检查程序后,发现在程序中小数点控制位没有定义,在老师的帮助下,设计小数点控制程序,再次调试后,小数点显示正常。
LED数码管调试完毕。
六、实验结果与心得
实验结果:
各模块调试完毕后,整体连接完成,但是模块间的契合控制出现问题,键盘按键不能准确控制数码管的显示数字,而且调试过程中数码管的扫描频率过高,数码管显示模糊。
心得:
通过这次水温自动控制系统的设计,我对单片机最小系统有了更深刻的了解,而且对Protel软件有了熟练的应用,绘制原理图方面并没有太大困难。
原理图绘制完毕后,是进程程序编写,这方面由于自身C语言基础不好,所以程序方面比较困难,而且经验不足,在老师和同学的帮助下,程序问题基本得到解决。
总体来说,通过这次实验,对自己在课堂中学到的知识是一个实践的过程,无论是动手能力还是只是的应用都得到了提高,当时也体会到理论和实践的差距还是比较大的,自己在某些知识方面的认识还是存在缺陷,对于某些基础学科的掌握还存在问题。
在此,谢谢老师的指导。
七、参考资料
电子设计自动化.马淑华高原P218ProtelDXP使用操作流程
计算机控制技术.顾德英张健马淑华P60A/D转换器接口设计
嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P119串行通信子函数
嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P134键盘处理函数
电力电子技术.金海明郑安平P119PWM整流电路基本原理
嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P141LED函数
嵌入式系统——使用HCS12微控制器的设计与应用.王宜怀P132键盘抖动处理
八、附录
实验程序
1、串行通信子函数(包含串行通信头文件SCI.h,以及串行口初始化和收发子函数的程序文件SCI.c)。
入口参数:
无
出口参数:
无
调用函数:
SCIInit
功能:
调试时间:
2011-6-1
作者:
(1)SCI.h源程序
//串行通信寄存器及标志位定义
#defineReSendStatusRSCI0SR1//SCI状态寄存器
#defineReTestBit5//接收缓冲区满标志位
#defineSendTestBit7//发送缓冲区空标志位
#defineReSendDataRSCI0DRL//数据寄存器
#defineEnableSCIReIntSCI0CR2|=0x20
#defineDisableSCIReIntSCI0CR2&=0xDF
//串行通信相关函数声明
voidSCIInit(void);//串行口初始化函数声明
voidSCISend1(INT8Uo);//串行发送1个字节
voidSCISendN(INT8Un,INT8Uch[]);//串行发送n个字节
INT8USCIRe1(INT8U*p);//串行接收1个字节
INT8USCIReN(INT8Un,INT8Uch[]);//串行接收n个字节
voidinterruptSCI_isr(void);
(2)SCI.c源程序
//[SCI.c]串行通信----------------------------------------------------------
//本文件包含:
//
(1)SCIInit:
串行口初始化
//
(2)SCISend1:
串行发送1个字节
//(3)SCISendN:
串行发送n字节
//(4)SCIRe1:
串行接收1字节
//(5)SCIReN:
串行接收n字节
//硬件连接:
//MCU的SCI0模块接口与PC方的串行口相连
//-------------------------------------------------------------------------*
#include/*commondefinesandmacros*/
#include/*derivativeinformation*/
#include
//头文件
#include//串行通信头文件
//SCIInit:
DG128串行口0初始化函数-------------------------------------------*
//功能:
//开SCI0关SCI1,关串口中断,对串行口进行初始化,默认为允许SCI,正常码输出
//,8位数据,无校验等,允许发送器允许接收器.查询方式收发,波特率为9600
//(设
=19.6608Mhz)
//参数:
无
//返回:
无
//说明:
//
(1)若初始化SCI1,只需SCI0->SCI1
//
(2)该初始化函数与芯片有关
//-------------------------------------------------------------------------*
voidSCIInit(void){
INT8Ut;
//定义波特率Bt=9600,SCI0BD=
/(16*Bt)
SCI0BDL=0x34;//须先给低8位赋值
SCI0BDH=0x00;//再给高8位赋值
SCI0CR1=0x00;//设置允许SCI,正常码输出,8位数据,无校验
t=SCI0DRL;//读数据寄存器(清0)
t=SCI0SR1;//读状态寄存器(清0)
SCI0CR2=0x0C;//允许SCI0接收和发送,查询方式
}
//SCISend1:
串行发送1个字节-------------------------------------------------
//功能:
串行发送1个字节
//参数:
o=要发送的数据
//返回:
无
//-------------------------------------------------------------------------
voidSCISend1(INT8Uo){
//判断ReStatusR的第SendTestBit位是否为1,是1可以发送
while
(1)
if((ReSendStatusR&(1<=0){
ReSendDataR=o;
break;
}
}
//SCISendN:
串行发送N个字节-------------------------------------------------
//功能:
发送数组中的N个字节数据
//参数:
n=待发送的数据字节数,ch=存放待发送数据的数组首地址
//返回:
无
//内部调用函数:
SCISend1
//---------------------------