水温控制系统.docx

上传人:b****8 文档编号:11182158 上传时间:2023-02-25 格式:DOCX 页数:23 大小:99.19KB
下载 相关 举报
水温控制系统.docx_第1页
第1页 / 共23页
水温控制系统.docx_第2页
第2页 / 共23页
水温控制系统.docx_第3页
第3页 / 共23页
水温控制系统.docx_第4页
第4页 / 共23页
水温控制系统.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

水温控制系统.docx

《水温控制系统.docx》由会员分享,可在线阅读,更多相关《水温控制系统.docx(23页珍藏版)》请在冰豆网上搜索。

水温控制系统.docx

水温控制系统

设计报告

1.设计原理

水温控制系统以STC89C52单片机作为控制核心,采用开关控制和PID控制算法相结合,通过控制单位时间内加热时间所占的比例(即控制波形占空比)来控制水的加热速度,实现对1L水的全量程(10℃――70℃)内的升温、降温功能的自动控制。

根据设计要求系统可划分为控制模块、温度测量模块、水温调节模块、键盘输入模块、显示电路模块等。

系统原理图如图所示

STC89C52首先写命令给DS18B20开始转换数据,将转换后的温度数据送入89C52进行处理,处理后在液晶屏上实时显示。

并将实际测量温度值与键盘设定值进行比较,根据比较结果进行温度调节,当温差比较大时采用开关量调节,既全速加热和制冷,当温差小时采用PID算法进行调节,最终达到温度的稳定控制。

其中,加热采用内置(水中)电加热器实现,热量直接与水传递,加热效果好,控温方便;降温采用半导体制冷片实现。

其体积小,安装简单,易于控制,价格便宜,可短时间内反复启动,但其制冷速率不高,所以设计中配套散热风扇以达到快速降温的目的。

2.温度控制算法

实际温度控制系统,常采用开关控制或数字PID控制方式。

开关控制的特点是可以使系统以最快的素的向平衡点靠近,但在实际应用却很容易造成系统在平衡点附近震荡,精度不高;而数字PID控制具有稳态误差小特点,实用性广泛的特点,但误差较大时,系统容易出现积分饱和,从而份致系统出现很大的超调量,甚至出现失控现象。

因此,本设计将开关控制,放积分饱和、防参数突变积分饱和等方法溶入PID控制算法组成复式数字PID控制方法,集各种控制策略的优点,既改善了常规控制的动态过程又保持了常规控制的稳态特性。

2.1控制算法的确定

温度控制过程为:

当水温温差大时,采用开关控制方式迅速减小温差,以缩短调节时间;当温差小于某一值后采用PID控制方式,以使系统快速稳定并保持系统无静态误差。

在这种控制方法中,PID控制在较小温差时开始进入,这样可有效避免数字积分器的饱和。

PID参数和被控制对象关系密切,要精确得到被控对象模型比较困难,为此,采用离线模糊整定的方法来确定PID参数,即给出一组PID参数的初值,测得相应的数据,按使这个量减小的方向调节PID参数,用整定后的参数控制该系统,并根据输出的调节时间、超调量及稳态误差,调节PID参数,如此反复,求得一组使系统性能最优的PID参数。

复合PID控制系统方框图如图所示。

2.2PID控制算法

根据设计要求,系统对1L净水进行加热或降温处理,根据水的对象特性,会出现惯性温度误差问题,原因如下:

温度控制器采用发热丝对水进行加热。

发热丝通电加热时,内部温度很高。

当容器内水温升高至设定温度时,温度控制器发出信号停止加热。

但这时发热丝的温度会高于设定温度,发热丝还将继续对对水进行加热,导致水的温度还会继续上升几度,然后才开始下降。

当水温下降到设定温度的下限时,温度控制器又发出加热信号,开始加热,但发热丝要把温度传递到被加热器件需要一定的时间,导致水温会继续下降几度。

所以,为了对水温实现精确控制,使温度测量误差在±0.5℃内,必须采用PID模糊控制算法,通过Pvar、Ivar、Dvar(比例、积分、微分)三方面的结合形成一个模糊控制来解决惯性温度误差问题。

利用数值逼近方法,在采样时刻t=iT(T为采样周期,i为正整数)时,PID调节规律可通过下式近似计算。

则增量式PID算法的输出量为:

式中,ei、ei-1、ei-2分别为第n次、n-1次和n-2次的偏差值,Kp、Ti、Td分别为比例系数、积分系数和微分系数,T为采样周期。

单片机每隔固定时间T将现场温度与用户设定目标温度的差值带入增量式PID算法公式,由公式输出量决定PWM方波的占空比,后续加热电路根据此PWM方波的占空比决定加热功率。

现场温度与目标温度的偏差大则占空比大,加热电路加热功率增大,使温度的实测值与设定值的偏差迅速减少;反之,二者的偏差小则占空比减小,加热电路加热功率减少,直至目标值与实测值相等,达到自动控制的目的。

2.3PID参数的确定

PID参数的选择是设计成败的关键,它决定了温度控制的准确度。

由于温度系统是一个具有较大滞后性的系统,所以本系统的采样周期定为10秒,加热周期定为1秒钟,根据一些文献提供的经验值,初步确定Kp=2,Ti=2,Td=0.5,根据公式Ki=Kp*T/TI;Kd=Kp*TD/T;计算得出Ki=1,Kd=1;然后,由按键对系统设定一个温度值,在线应用工程整定法中的经验法对P,I,D各参数进行调整,经验法是一种凑试法,它通过模拟或闭环运行,观察调节过程的响应曲线,如果曲线不够理想,则按某种程序将参数反复凑试,直到调节质量满意为止。

凑试程序通常是先比例后积分,最后加入微分。

凑试法整定PID参数的步骤是:

1)首先进行P整定。

将参数Kp由小而大慢慢变化,直至得到反应快,超调小的响应曲线。

若无静差或静差在允许范围内且响应曲线满意,整定结束,否则继续下步。

2)进行PI整定。

略小于Kp值,将Ti由大而小缓慢变化,在保持系统动态性能良好的前提下,消除静差或是静差允许范围内。

反复改变Kp,Ti值以求得较好效果,若效果满意,则整定结束,否则继续下去。

3)进行PID整定。

略改变Kp,Ti的值,使Td由小而大缓慢变化,以求得较好的响应曲线和较小的静差。

逐步反复的试凑,直至获得满意效果为止。

对于一定的系统,合理的参数组并不唯一,根据一些文献的实践经验,在具体实施PID参数整定时,以下几个结论比较实用:

1)比例系数Kp是PID调节中最关键的一个参数,Kp增大,系统稳定性增加,但调节灵敏度减弱,一般曲线振荡频繁时,要增大Kp,而曲线飘浮绕大弯时,要减小Kp.

2)积分时间常数Ti主要起消除静差的作用,减小Ti,消除静差快,但稳定性减小,一般曲线偏离恢复慢时,减小Ti,而曲线波动周期长时,再增大Ki。

3)微分时间常数Td是加速过程的有力调节,在加速过渡过程,应增加Td,Td不宜过小,也不宜太大,Td一般选Ti的四分之一为最佳。

根据以上调节的步骤及调节的方法及经验,经过反复的试验做后得到最终的P,I,D的参数为Kp=30,Ki=5,Kd=0.

3.硬件电路设计

水温控制系统的硬件电路主要包括:

主控电路、温度采集电路、温控电路和显示电路等,下面依次对各部分进行设计。

3.1主控电路

主控电路采用STC89C52单片机作为系统控制器,结合数字PID算法完成对温度测量信号的接收、处理,控制加热器和制冷片,使水温控制达到设计要求。

主控电路包括STC89C52最小系统和键盘电路两部分,STC89C52最小系统在上一章中已介绍,这里不再赘述。

本设计键盘采用RF-X1开发板上的6个独立按键中的4个,各按键经上拉电阻分别接到单片机的P3.2、P3.3、P3.4、P3.5口上,起到确认、选择、上调和下调的作用,每按上调或下调键一次,设定温度值加1或减1。

电路图如图所示。

3.2温度采集电路

本系统采用DS18B20单总线可编程温度传感器来实现温度的采集和转换,温度以9~12位数字量读出,可以直接与单片机进行连接,无需外部器件和电源,大大简化了电路的复杂度。

DS18B20应用广泛,测温范围为-55~+125oC,温度数字量转换快,性能可以满足题目的设计要求。

DS18B20的测温电路如图所示。

3.3温度控制电路

温度控制电路采用加热器和制冷片对1L水实现加热和降温,具体电路如图12-5所示。

当实测温度高于设定温度时,单片机P0.2脚输出低电平,光耦管导通输出高电平,进入LM393管脚比较整形,滤除高次谐波,输出高电平,进入Q3和Q4组成的推挽电路,Q3导通Q4截止,输出低电平,晶闸管导通,驱动制冷片降温。

当实测温度低于设定温度时,P0.3脚输出低电平,驱动加热器对水温进行加热,工作原理与降温驱动相同。

 

3.4显示电路

显示电路采用LCD12864液晶模块显示系统的设定温度和实测温度。

LCD12864液晶共有20个引脚,管脚名称及功能如表12-1所示。

本系统选用单片机P1口作为数据输出端与LCD12864的数据端(DB0~DB7)相连,进行水温数据传输;P20接串并行模式方式位RS;P21接并行的读写方式位R/W;P22接并行使能端口E;P23接并/串行接口选择位PSB;P24接复位端口RST。

具体电路图如图所示。

 

 

4.软件设计

系统的软件设计应用C语言,采用模块化对单片机进行编程实现各项功能。

主要包括:

PID控制程序、按键子程序、温度采集子程序、温度比较子程序和液晶显示程序。

4.1主程序设计

系统上电初始化后,首先进行按键扫描,若有按键按下,则读取按键值,更新设定温度。

将实测温度与设定温度进行比较,若实测温度与设定温度差值大于2ºC,则对水进行全速加热或降温;若实测温度与设定温度差值小于2ºC,则调用PID子程序,对水温进行微调,达到设计要求。

系统主程序流程图如图所示.

 

附录:

PID控制程序

PID控制就是按设定值与测量值之间偏差的比例、偏差的积累和偏差变化的趋势进行控制。

它根据采样时刻的偏差值计算输出控制量的增量,调节控制信号的导通时间来控制加热电路和冷却电路的工作。

当采样周期相当短时,可以用求和代替积分,用差商代替微分。

PID控制子程序如下:

/******************************PID算法**********************************/

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);//微分项

}

/************************************************************************/

按键子程序

本系统采用四个按键,完成温度的设定。

当选择键K1每按下一次,K1num加1,根据K1num值选择对温度值的百位(预留)、十位、个位进行数值调节。

每按一次按键K2,对应位数值加1,每按一次按键K1,对应位数值减1,并将设定温度值写到液晶显示器的相应位置。

按键子程序如下:

/*************************按键子程序***********************************/

voidsheding()

{

if(k1==0)

{

delay1(10);

if(k1==0)//按键K1按下

while(!

k1);//按键K1抬起

write_com(0x0f);write_com(0x94);

k1num++;

switch(k1num)

{

case1:

write_com(0x0f);write_com(0x94);//液晶显示位置,十位

break;

case2:

write_com(0x95);//液晶显示位置,个位

break;

case3:

write_com(0x96);//液晶显示位置,小数位

break;

case4:

k1num=0;write_com(0x0c);//清零

break;

}

}

if(k1num!

=0)//返回

{

//温度值加处理:

if(k2==0)//按键K2按下

{

delay1(10);

if(k2==0)

{

while(!

k2);

switch(k1num)

{

case1:

shi++;if(shi==10)shi=0;a=shi;//十位加1,到10清零

write_com(0x94);write_date(table[shi]);write_com(0x94);

break;

case2:

ge++;if(ge==10)ge=0;b=ge;//个位加1,到10清零

write_com(0x95);;write_date(table[ge]);write_com(0x95);

break;

case3:

xs++;if(xs==10)xs=0;c=xs;//小数位加1,到10清零

write_com(0x96);write_date('.');write_date(table[xs]);write_com(0x96);//在液晶对应位置画点

break;

}

}

}

//温度值减处理:

if(k3==0)

{

delay1(10);

if(k3==0)

{

while(!

k3);

switch(k1num)

{

case1:

shi--;if(shi==-1)shi=9;a=shi;

write_com(0x94);write_date(table[shi]);write_com(0x94);

break;

case2:

ge--;if(ge==-1)ge=9;b=ge;

write_com(0x95);write_date(table[ge]);write_com(0x95);

break;

case3:

xs--;if(xs==-1)xs=9;c=xs;

write_com(0x96);write_date('.');write_date(table[xs]);write_com(0x96);

break;

}

}

}

}

}

/***************************************************************************/

DS18B20温度采集子程序

系统采用DS18B20对1L水的温度进行采集。

首先根据DS18B20的工作时序对其进行初始化,并对DS18B20内部寄存器读写操作进行定义。

系统工作时,单片机读取DS18B20内部寄存器的二进制数值,将其转化为十进制的真实温度值。

DS18B20温度采集子程序如下:

/*******************DS18B20温度采集子程序************************/

voidinit_DS18B20()//初始化

{

ucharx=0;

DS18B20=1;//DQ复位

delay(8);//稍做延时

DS18B20=0;//单片机将DQ拉低

delay(80);//精确延时大于480us

DS18B20=1;//拉高总线

delay(14);

x=DS18B20;//稍做延时后如果x=0则初始化成功x=1则初始化失败

delay(20);

}

ucharread_onechar()//读一个字节

{

uchari=0;

uchardate=0;

for(i=8;i>0;i--)

{

DS18B20=0;

date>>=1;//寄存器右移

DS18B20=1;

if(DS18B20)

date|=0x80;

delay(4);

}

return(date);

}

voidwrite_onechar(uchardate)//写一个字节

{

uchari=0;

for(i=8;i>0;i--)

{

DS18B20=0;

DS18B20=date&0x01;

delay(5);

DS18B20=1;

date>>=1;

}

}

uintread_temp()//读取温度

{uchara=0;

ucharb=0;

uintt=0;

floattt=0;

init_DS18B20();

write_onechar(0xcc);//跳过读序号列号的操作

write_onechar(0x44);//启动温度转换

init_DS18B20();

write_onechar(0xcc);//跳过读序号列号的操作

write_onechar(0xbe);//读取温度寄存器

a=read_onechar();//连续读两个字节数据//读低8位

b=read_onechar();//读高8位

t=b;

t<<=8;

t=t|a;//两字节合成一个整型变量。

tt=t*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回数据的最低位代表的是0.0625度

//temper12=tt*10;

t=tt*10+0.5;//放大10倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作。

return(t);

}

voidmanage_DS18B20()

{

uintnum;

num=read_temp();

shi=num/100;

delay(5);

ge=num%100/10;

delay(5);

xs=num%10;

delay(5);

temper=shi*10+ge+0.1*xs;}

/**************************************************************************/

温度比较子程序

系统将DS18B20采集到的实际测量温度值与键盘设定值进行比较,根据比较结果对水温进行调节。

若设置温度大于实际温度,并且温差在2度以上,则驱动加热器对水温进行全速加热;当温差在0.8到2度之间时,则停止加热,开始降温;当温差小于0.8度时,则启用PID计算,控制温差逐渐趋近设定值,最终达到稳态。

若设置温度小于实际温度,系统驱动制冷片开始全速降温。

当实际温度下降到低于设定温度时,则马上开启PID计算,控制温差逐渐趋近设定值,最终达到稳态。

/************************温度比较处理子程序****************************/

voidcompare_temper()

{

unsignedchari;

if(set_temper>temper)//是否设置的温度大于实际温度

{

if(set_temper-temper>2)//设置的温度比实际的温度是否是大于2度

{

high_time=100;//如果是,则全速加热

low_time=0;

}

else//如果是在0.8到2度范围,则开始降温

{

if(set_temper-temper>0.8)

{

high_time=0;

low_time=100;

}

else//如果温差小于0.8度,运行PID计算

{

for(i=0;i<10;i++)

{

s=read_temp();

rin=s;//ReadInput

rout=PIDCalc(&spid,rin);//PerformPIDInteration

}

if(high_time<=100)

{

high_time=(unsignedchar)(rout/1000);

}

else

{

high_time=100;

low_time=(100-high_time);

}

}

}

}

elseif(set_temper<=temper)//是否设置的温度小于实际温度

{

if(set_temper-temper<0)

{

high_time=0;

low_time=100;//全速降温

}

else//实际温度大于设定温度,马上开启PID计算

{

for(i=0;i<10;i++)

{

s=read_temp();

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);

}

}

}

}

/*************************************************************************/

液晶显示程序

液晶显示器用于显示水温的实际温度和设定温度。

首先对LCD12864进行初始化,并读取控制器当前状态,判断是否准备好(空闲)。

然后向液晶模块写入指令代码,进行显示准备,将要水温以十六进制代码的形式送入液晶显示缓冲区,最后利用读显示数据指令控制液晶模块在相应位置显示水温数据。

液晶显示程序如下:

/***************************LCD12864初始化*******************************/

voidinit_lcd()

{

//lcd_psb=1;

write_com(0x34);//扩充指令集

delay1

(2);

write_com(0x30);//基本指令集

delay1

(2);

write_com(0x02);//显示归位

delay1

(2);

write_com(0x01);//清屏显示

delay1

(2);

write_com(0x0c);//显示状态开关

delay1

(2);

write_com(0x06);//显示光标移动设置

delay1

(2);

}

/**********************************写数据*********************************/

voidwrite_date(uchardate)

{

read_busy();

lcd_rs=1;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1