图13 PID封装后参数界面
对整个系统进行PID调节后,系统综合性能提高。 5.2 组态王系统仿真如下:
图14 原系统仿真结果
不加算法控制的反应近似视为上图反应过程线是一个升温过程,后温度达到反应开始的阶段,化学反应剧烈放热,炉内温度迅速升高,过高导致反应骤停,冷调节阀的作用使得温度下降,反应再次开始,放热再升温再制冷,不断循环,形成不停地震荡。
利用PID 调节之后的响应曲线,系统性能改善,与仿真一致,见图15
图15 PID调节结果
5.3 组态王运行界面如下
图16 调节前系统运行结果
炉温升温过程中热调节阀作用,炉内温度实时显示
图17 PID调节结果
接近稳定后,冷调节阀工作,由于化学反应是放热反应,冷调节阀使得炉内温度达到平衡,热调节阀可以不工作。
实际温度控制系统中输出驱动电路控制器将其PID运算的结果转化为不同占空比的
脉冲信号输出,该信号作用于执行机构还需要经过驱动电路。利用PWM(脉冲宽度调制)原理
利用单片机定时器1中断生成PWM波,占空比通过按键可调
图18 PWM波形
参考文献
[1]三诸静.模糊控制理论与系统原理仁[M].北京:机械工业出版社,2005. [2]刘学君.反应釜温度控制系统的研究[D].河北:燕山大学,2004.
[3]张辉,闰广平.即聚合釜的自动控制[J].古林化工学院学报,2004,21:50-52. [4]鞠丽叶.自适应预测控制在炉温控制的应用[J].青岛科技大学学报,2008,25(1):83-87. [5]丑王伟.广义预测控制理论及其应用[M].北京:科学出版社,1998. [6]张涛.反应釜温度控制系统的研究[D].山东:青岛大学,2009.
附录
附录一:C语言程序 #include < reg51.h > #include < intrins.h > sbit DQ=P1^2;
#define uchar unsigned char #define uint unsigned int sbit lcdrs = P1^0 ; sbit lcden = P1^1 ; sbit beer=P3^1; sbit ledr=P3^2; sbit ledg=P1^4; sbit jiare=P1^3; sbit jiashui=P3^0;
uchar num,temp;uint
tvalue,key,dengyu,newtep,new=40; uint temper,temper1,zhiwen,en,a; uchar code table[ ] = %uchar code table1[ ] =
{'0','1','2','3','4','5','6','7','8','9','-'} ; uchar code table2[ ] = \void delay(uint z) { uint x,y; for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay_18B20(unsigned int i)//延时1微秒 {
while(i--); }
void ds1820rst() { unsigned char x=0;
DQ = 1; //DQ复位 delay_18B20(4); //延时 DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us DQ = 1; //拉高 delay_18B20(40); }
uchar ds1820rd()//读数据 { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--)
{ DQ = 0; //给脉冲信号 dat>>=1;
DQ = 1; //给脉冲信号 if(DQ) dat|=0x80; delay_18B20(10); }
return(dat); }
void ds1820wr(uchar wdata)//写数据 {unsigned char i=0;
for (i=8; i>0; i--) { DQ = 0;
DQ = wdata&0x01; delay_18B20(10); DQ = 1; wdata>>=1; } }
int read_temp()//读取温度值并转换 {uchar a,b; uint tvalue;//温度值 ds1820rst();
ds1820wr(0xcc);//跳过读序列号 ds1820wr(0x44);//启动温度转换 ds1820rst();
ds1820wr(0xcc);//跳过读序列号 ds1820wr(0xbe);//读取温度 a=ds1820rd(); b=ds1820rd(); tvalue=b; tvalue<<=8; tvalue=tvalue|a;
tvalue=tvalue*(0.625);//温度值扩大10倍,精确到1位小数 return(tvalue); }
void cewen() {
delay(1);
temper=read_temp();delay(1);
temper1=temper/10;
}
//********以下部分为键盘扫描及计算器实现功能区域********// void swith()
{ temp=P2; //将P3口当前的状态复
制给临时变量temp temp=temp&0xf0; //temp与0xf0进行与运算,通过与运算的结果判断出相应的行数有没有被按下 if(temp!=0xf0)
{delay(10); //延时去抖操作 temp=P2; temp=temp&0xf0;//重新读取P3口在进行一次操作,判断按键是否真的被按下 if(temp!=0xf0) { temp=P2;
switch(temp)
{ //以下部分表示16个按键各自被按下时执行相应的赋值操作 case 0xee: key=1;en=1;break; case 0xde: key=2;en=1;break;
case 0xbe: key=3;en=1;break;
case 0x7e: zhiwen=1;break; //表示第一种运算,“加”运算 case 0xed: key=4;en=1;break; case 0xdd: key=5;en=1;break;
case 0xbd: key=6;en=1;break;
case 0x7d: dengyu=1;break;//表示第二种运算,“减”运算 case 0xeb: key=7;en=1;break; case 0xdb: key=8;en=1;break;
case 0xbb: key=9;en=1;break;