基于炉温的pid控制系统
1、【选定题目】:
2、【任务要求】:
对工业上的连续槽反应器温度控制系统进行定性建模,充分考虑过程控制当中的大延迟环节与主要干扰源,在理论上设计适用于该控制系统的控制器,并利用matlab的simulink进行建模与控制系统仿真,要求做到系统的阶跃相应超调量不超过 5%,对于大幅度长时间的干扰调节时间不能超过系统延迟时间的两倍,尽可能消弱调节过程中的震荡过程。利用STCC51单片机实现系统的控制环节,编写相对应的C程序,并设计系统的传感器模块和执行器块,并通过Protues进行硬件部分的仿真。最终提交控制器模型与参数、Simulink仿真结果、单片机的程序与硬件部分的设计。
3、【系统总体方案】: 3.1、系统简介与建模
续槽反应器中,物料自顶部加入,经反应后从底部排出产品,反应产生的热量有冷却夹套当中的冷却水带走。为了保证产品品质,反应器内的温度必须得到精确控制,该控制系统通过控制冷却水的流量控制反应器温度。
各模块建模:调节阀模块:相当于一阶惯性滞后模块;夹套模块:是一个纯滞后模块;槽壁模块:是一个纯滞后模块;反应槽模块:由于反应槽内含有大量溶液,热容积比较大,可以视为时间常数较大的一阶惯性模块。
干扰源分析:该系统主要的干扰源分为两部分,一是来源于执行器与冷凝水的干扰,主要作用于调节阀模块。一是来源于反应物质与溶液的干扰,作用于反应槽模块。
延迟环节分析:该系统主要的延迟环节有两个,一是调节阀模块的延迟,此环节延迟时间较短;一是夹套与槽壁模块的延迟,此为大延迟环节。
3.2、控制算法与控制系统框图设计
由于数字PID的位置算法的积分项是一个累加器,会占用大量的存储单元,故拟采用数字PID的增量式算法。为了减少系统的超调量,使用积分分离法抑制几分饱和,同时使用不完全微分的PID算式来抑制高频噪声。PID算式如下:
u(k)KP[e(k)e(k1)]KIe(k)[uD(k)uD(k1)]
Tf1uD(k1)KPTD[e(k)e(k1)] TfTTfT
uD(k)且当|e(k)|过大时,令KI=0。
考虑到由入口处冷却水温度变化带入的扰动,需要经过夹套内的冷却水、夹
套与反应器槽壁、反应器内的物料这三个容积才会影响到反应器内的温度,故增加一个通过夹套内冷却水水温修正冷却水流量的副回路闭环控制系统,形成双闭环串级控制系统。
同时,由于本系统中包含一个大延迟环节,故通过一个理想的史密斯预估补偿器来补偿控制过程的动态特性。控制系统框图如下:
3.3、其它控制参数确定
A/D和D/A位数均为8位,采用平均值滤波法,以0.1s为一个周期,每个周期采5次样,取其算术平均值,作为该周期的采样值。
4、【控制系统仿真】:
使用matlab的simulink对系统进行建模,并进行控制系统的仿真,整定控制参数。 4.1、系统建模
第一个传递函数和第一个延迟环节代表调节阀模块,延迟时间为1,第二个延迟环节代表夹套与槽壁,延迟时间为5,第二个传递函数代表反应槽模块,时间常数较大。第一个干扰源是来自于执行器与冷凝水的干扰,第二个干扰源是来自于反应物质与溶液的干扰。
4.2、PID控制器的设计
Kp、Ki、Kd分别设定PID的三个参数,使用积分分离法抑制几分饱和,同时使用不完全微分的PID算式来抑制高频噪声,Constant用来设定积分门限。Max1和Max2用来设定输出的控制参数的最大值与最小值,是不需要整定的,用来保证控制参数不会超出执行器输入信号的范围。
4.3、整定副回路的PID参数
4.4、整定带噪声的副回路的PID参数
4.5、整定整个系统的PID参数
4.6、整定带噪声的整个系统的PID参数
4.7、控制效果对比
无副回路的控制系统
无史密斯预估补偿的控制系统
4.8、整定后的参数
主控制器:Kp=3.2、Ki=1.2、Kd=0、积分门限:6 副控制器:Kp=2、Ki=1.2、Kd=0.1、积分门限:3
5、【硬件模块设计】: 5.1、执行器设计
执行器采用电动调节阀,型号是VB3200型电动二通阀,规格使用DN50,该规格的流量系数为40m³/h,可以通过0~10V的直流电压来控制阀门开度,等百分比结构特性。需要24V直流电驱动电机,还自带温度传感器和反馈回路,不过本次设计暂不考虑,使用开环控制电动调节阀开度。
5.2、测量单元选型(温度传感器)
采用Pt100铂热电阻,使用电桥法测量,输出放大12倍,当温度从0~100℃
变化时,测量单元的输出电压在0~4.85V之间变化。
5.3、基本CPU电路设计
采用STCC51单片机进行控制,P0和P1管脚接两个温度测量电路的输入值(采用ADC0809进行模数转换),通过P2管脚输出控制量,通过DAC0832转换成模拟量后放大两倍控制电动调节阀。
5.4、硬件系统整体设计
6、【软件系统设计】: 6.1、系统初始化
设置定时器0和定时器1,定时器0用于提供采样信号与A/D转换开始信号,定时时间为10ms,定时器1用于提供ADC0809的时钟信号,定时时间为10uS,使用频率较高的40MHz的晶振。程序如下:
#include float ek1,ek2,uk2; //用来储存两个控制系统前一个时刻的ek和uk float xdata input[50]={0}; //用来储存史密斯预估补偿器当中的值,由于会占用大量的data空间,所以存储进xdata当中 int k=0; //用来确定需要调用input[]当中的哪个值 float smszero=0; //用来存储史密斯预估器当中惯性环节上一个时刻输出地值 void main(void) //主程序 { TMOD=0x21; //T0生产采样频率,处于工作方式1;T1生成ADC0809的时钟信号,处于工作方式2。 TH0=0x7D; TL0=0xCB; //定时时间为10mS TL1=0xDF; //定时器1的定时时间10us EA=1; ET0=1; ET1=1; TR0=1; TR1=1; //开定时器中断0和1,开始计时 P3_7=1; //确定ADC0809的start的起始信号为正 ek1=0; ek2=0; uk2=0; while(1); } void TIME1(void) interrupt 3 { P3_6=~P3_6; //通过P3.6发送频率为50kHz的时钟信号 } 6.2、检测模块 使用定时器0中断,每10ms改变一次P3.7管脚的电平,下降沿ADC0809进行模数转换,上升沿单片机内部对P0、P1管脚进行数据采集,采集五次数据后进行平均值滤波,并进行控制算法计算。程序如下: void TIME0(void) interrupt 1 { ET0=0; TH0=0x7D; TL0=0xCB; P3_7=~P3_7; //通过P3.7输出控制ADC0809的start if(P3_7==1) //采集温度数据 { input1=input1+P0; input2=input2+P1; j++; } if(j==5) { j=0; input1=input1/5; //平均值滤波 input2=input2/5; PID(); //调入PID控制函数 } ET0=1; } 6.3、控制模块 使用增量型PID算法,添加积分分离模块,并将微分模块改为不完全微分模块,Tf取1s,采样时间T取0.1s。软件实现串级控制系统。程序如下: void PID(void) //PID函数 { float ki1,ki2; //定义两个控制系统的Ki float input_1,input_2,out_1,out_2,uk_2; input_1=input1; input_2=input2; input1=0; input2=0; input_1=(input_1*5)/0xff; input_1=(input_1*100)/4.85; input_2=(input_2*5)/0xff; input_2=(input_2*100)/4.85; //换算成温度 input_1=80-(input_1); //换算成主控制器的输入 input_2=40-(input_2); //换算成副控制器的反馈输入 input_1=sms(input_1,input_2); //调用史密斯预估器补偿 if(input_1>6) //积分分离 ki1=0; else ki1=0.12; out_1=3.2*(input_1-ek1)+ki1*input_1; //主控制器 out1=out1+out_1; ek1=input_1; if(out1>80) out1=80; else if(out1<-10) out1=-10; input_2=(out1*0.5)-input_2; if(input_2>3) //积分分离 ki2=0; else ki2=0.12; uk_2=(uk2/1.1)+((input_2-ek2)/11); //不完全微分 uk2=uk_2; out_2=3.2*(input_2-ek2)+ki2*input_2+uk_2; //主控制器 out2=out2+out_2; ek2=input_2; if(out2>40) out2=40; else if(out2<-5) out2=-5; output(); //输出 } 6.4、史密斯预估补偿器的实现 史密斯预估补偿器通过软件实现,需要用到一个包含50个变量的数组储存史密斯预估器的中间量,这样进行运算是就可以调用到5秒钟前的数值进行预估补偿。程序如下: float sms(float control,float smsone) //史密斯预估器 { k++; if(k==50) k=0; smsone=(2*smsone+0.5*smszero)/1.5; smszero=smsone; control=control+smsone-input[k]; input[k]=smsone; return(control); } 6.5、输出模块 通过P2进行控制量输出。程序如下: void output(void) //输出函数 { float outing; unsigned char outing2; outing=out2; outing=(outing+10)/5; outing2=outing*51.2; P2=outing2; //利用P2管脚输出 } 6.6、编程中的问题与解决方案 由于程序中涉及到大量的运算,并且要生成50kHz的始终,故晶振选用频率较高的40MHz。 由于定义了许多浮点型全局变量,所以会占用大量的空间,导致DATA空间不足,因为C51单片机的DATA只有128Byte。为了解决这个问题,把最占用空间的浮点型数组一到XDATA当中。编译结果如下: Program Size: data=75.0 xdata=200 code=2707 7、【仿真报告】: 受Protues程序的,仿真程序运行的速度很慢,而且不能完成仿真整个系统,不过可以看到当两个传感器的温度发生变化时,控制量会有所反应,向正确的方向调节系统。 该直流电压表代表执行器,控制量由1V~10V变化,调节调节阀的开度。之所以设定控制量不能低于1V的原因是因为,当调节阀接近于闭合时,冷凝水几乎不流动,整个系统成为一个静态的热交换系统,之前建立的模型不再适用,反应槽的温度很容易超出控制。彻底关闭调节阀的动作需要人工干预,不设定在控制系统当中。 8、【结论及心得体会】: 通过计算机控制理论、过程控制和经典控制理论方面的知识,我们可以设计能解决大延迟环节与干扰的过程控制系统,并且利用目前学到的编程知识与硬件知识,可以设计相应的控制系统的物理实现。 在控制理论方面,我此次所使用的串级控制系统是一种比较简单的控制方式,用于解决距离控制器比较近的干扰源对控制系统的干扰。对于只有一个比较大的干扰源系统,前馈-反馈控制是另一种比较完善的解决方案。而对于大延迟环节,使用史密斯预估补偿器是一种比较经典的解决方案,我此次所使用的是最理想的史密斯预估补偿器,除此之外还有几种更接近实际的改进型史密斯预估补偿器。而对于一些拥有多被控量,且被控量之间有比值关系的控制系统,使用比值控制系统是一种较好的解决方案。此外,在本例中,反应槽的温度与冷却水的温度之间本来就是相互影响的,而冷却水的温度也会小幅影响到冷却水流速,而对于相互影响更加明显的系统,可以研究其相对增益,并使用解耦控制系统。此外,目前解决实际工程当中,还有大量的先进控制系统,比如推理控制、预测控制、间歇过程控制和整厂控制等,而诸如神经网络控制、模糊控制等先进的控制理论也营运而生,为更加复杂的系统提供控制方面的解决方案。 在控制器数字化方面,利用计算机控制系统学到的知识,可以应用增量式PID算法来把控制参数加载到数字系统当中(本次设计使用的是C51单片机)。而一旦进行数字化处理,对控制效果影响最大的就是采样率和分辨率。此外,数字化的系统也容易受到毛刺的干扰,平均值滤波是一种最容易的解决方案,添加滤波器和设置非灵敏区也都是比较常用的解决方案。此外,数字控制系统当中, 也会受处理器的硬件能力影响,包括存储空间与处理速度,这也是需要考虑的方面。 最后,在实际工程当中,许多控制理论都要面临挑战,先进的控制系统需要考虑大量的参数,现代控制理论为多输入多输出控制系统提供了相应的算法。且工程中的许多环节无法准确建模,并且会有许多非线性环节和随机过程,诸如史密斯预估补偿器这样需要能够准确建模才能够使用的控制系统就会很难应用。真正工程中的控制系统往往是需要多学科交织共同完成的,需要对现场设备进行测试与建模,需要控制理论设计,需要机械结构设计,需要算法优化,需要硬件和软件设计,还需要安全性方面的检测与评估等,而我们此次所完成的计算机控制系统课程设计,不过是对实际工程的一个很小规模的仿真而已。 9、【参考资料】: 《过程控制系统》,黄德先、王京春、金以慧编著,清华大学出版社。 《计算机控制系统》,高金源、夏洁编著,清华大学出版社。 《检测原理》,施文康、余晓芬主编,机械工业出版社。 《单片机原理与应用》,戴胜华、蒋大明主编,北京交通大学出版社。 《数字电子技术基础》,侯建军主编,高等教育出版社。 《自动控制原理》,蒋大明、戴胜华主编,北京交通大学出版社。 10、【完整程序】: #include float ek1,ek2,uk2; //用来储存两个控制系统前一个时刻的ek和uk float xdata input[50]={0}; //用来储存史密斯预估补偿器当中的值,由于会占用大量的data空间,所以存储进xdata当中 int k=0; //用来确定需要调用input[]当中的哪个值 float smszero=0; //用来存储史密斯预估器当中惯性环节上一个时刻输出地值 void main(void) //主程序 { TMOD=0x21; //T0生产采样频率,处于工作方式1;T1生成ADC0809的时钟信号,处于工作方式2。 TH0=0x7D; TL0=0xCB; //定时时间为10mS TL1=0xDF; //定时器1的定时时间10us EA=1; ET0=1; ET1=1; TR0=1; TR1=1; //开定时器中断0和1,开始计时 P3_7=1; //确定ADC0809的start的起始信号为正 ek1=0; ek2=0; uk2=0; while(1); } void TIME1(void) interrupt 3 { P3_6=~P3_6; //通过P3.6发送频率为50kHz的时钟信号 } void TIME0(void) interrupt 1 { ET0=0; TH0=0x7D; TL0=0xCB; P3_7=~P3_7; //通过P3.7输出控制ADC0809的start if(P3_7==1) //采集温度数据 { input1=input1+P0; input2=input2+P1; j++; } if(j==5) { j=0; input1=input1/5; //平均值滤波 input2=input2/5; PID(); //调入PID控制函数 } ET0=1; } void PID(void) //PID函数 { float ki1,ki2; //定义两个控制系统的Ki float input_1,input_2,out_1,out_2,uk_2; input_1=input1; input_2=input2; input1=0; input2=0; input_1=(input_1*5)/0xff; input_1=(input_1*100)/4.85; input_2=(input_2*5)/0xff; input_2=(input_2*100)/4.85; //换算成温度 input_1=80-(input_1); //换算成主控制器的输入 input_2=40-(input_2); //换算成副控制器的反馈输入 input_1=sms(input_1,input_2); //调用史密斯预估器补偿 if(input_1>6) //积分分离 ki1=0; else ki1=0.12; out_1=3.2*(input_1-ek1)+ki1*input_1; //主控制器 out1=out1+out_1; ek1=input_1; if(out1>80) out1=80; else if(out1<-10) out1=-10; input_2=(out1*0.5)-input_2; if(input_2>3) //积分分离 ki2=0; else ki2=0.12; uk_2=(uk2/1.1)+((input_2-ek2)/11); //不完全微分 uk2=uk_2; out_2=3.2*(input_2-ek2)+ki2*input_2+uk_2; //主控制器 out2=out2+out_2; ek2=input_2; if(out2>40) out2=40; else if(out2<-5) out2=-5; output(); //输出 } float sms(float control,float smsone) //史密斯预估器 { k++; if(k==50) k=0; smsone=(2*smsone+0.5*smszero)/1.5; smszero=smsone; control=control+smsone-input[k]; input[k]=smsone; return(control); } void output(void) //输出函数 { float outing; unsigned char outing2; outing=out2; outing=(outing+10)/5; outing2=outing*51.2; P2=outing2; } //利用P2管脚输出 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- haog.cn 版权所有 赣ICP备2024042798号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务