时间:2022-10-01 06:34:03
摘 要: 介绍温度控制中一种实际应用中效果良好的通用的PID温度算法,说明其原理、设计、流程、应用。
关键词: PID算法;温度控制;相对误差;控制值;分段积分
中图分类号:O231 文献标识码:A 文章编号:1671-7597(2013)0110057-02
0 引言
在仪器设备的制造中精准地控制温度经常成为制造成败的关键,从快速成型设备到小小的自动烹饪锅都离不开它,而PID(Proportional Integral Derivative)控制这种技术成熟、应用广泛的控制策略是在控温中经常会采用的策略。
最近有几个项目都要求实现PID的温度控制,本人尝试用VC做了一个PID温度算法的程序,在实际中得到了比较好的应用。
1 原理及设计
PID控温算法的原理简单的说是在一个闭环系统中根据测量到的温度与设定温度的差异来调节温度控制器,以求最后达到稳定的设定温度。
这其中分成三部分:测量温度,计算控制值,控制温度。
1.1 测量温度
温度的测量比较简单,一般在程序中通过端口读取所连接测温模块的数据就可以得到。当然实际测量的一般是电压之类的值不会是实际温度,但这个电压与温度的关系表一般厂家会提供,可以把那些具体数据拟合为适当的计算公式,这样就可以轻松的把电压转换为近似温度了。
1.2 计算控制值
这是最重要的部分。它通过测量到的实际温度值与设定要达到的温度值的偏差来计算。一般做法是直接用这个绝对误差值来计算,但考虑到这个绝对误差对控温的影响与实际设定温度有关,从通用性的角度,本人特意用相对误差代替了绝对误差,并为了计算方便加大了100倍,通俗的说就是改成了测量温度与设定温度的误差百分数。具体相对误差的计算如式1所示。
Error=(SetPoint-Curvalue)*100/SetPoint (1)
其中Error指相对误差,SetPoint指设定要达到的温度,Curvalue指当前测量得到的温度。
计算控制值的基本公式也是采用普通的增量式PID算法,如式2所示:
U(k)=kp*error(k)+kiΣeror(j)+kd(eror(k)-eror(k-1))
(2)
其中u(k)指要求的k时刻的控制值,error(k)指k时刻的相对误差,kp为比例系数,ki为积分系数,kd为微分系数。在采样周期一定的情况下式2中的ki、kd已经把采样周期的值计算在内了。
因为在整个PID控制的启动、结束或大幅度增减设定时,短时间内系统输出可能有很大的偏差,会造成PID运算的积分积累,引起系统较大的超调和振荡。特别在温度变化比较缓慢且带有纯滞后环节时,若采用单纯PID控制,当有较大扰动或大幅度改变给定值时,会产生较大的偏差,所以参考别人的做法对式3中的比例系数做了进一步调整,增加了一个分段积分的变化系数λ,最后公式定为:
u(k)=kp* error(k)+ λ*kiΣeror(j)+kd(eror(k)-eror(k-1)) (3)
而λ的取值是随着当前相对误差的绝对值的改变而改变的,基本上可以设计为一个分段函数。当相对误差的绝对值越大时,也就是测量值偏离设定值越大时希望让积分系数的影响越小,就把λ取小;相反,当相对对误差的绝对值越小时,就是测量值越靠近设定值时就希望让积分系数的影响越大,就把λ取大些,可以按式4设置λ。
1.3 控制温度
一般来说,控制温度是对温度控制器的电热元件之类如发热丝、加热棒进行控制。在简单的控制系统中只能控制加热或不加热两种状态。但如果只根据计算出的控制值与某个阀值的大小在一个周期内做加热或不加热两种的控制,一来使计算出的具体控制数值大部分失去了控制意义,不能发挥作用,二来更重要的是使温度控制器控温的惯性温度误差问题显得更加严重,不容易精确的稳定住温度。
由于控制温度是要控制加热的功率,而加热功率除了与加热器本身能力有关外,也与加热的时间有关,所以我们可以通过控制周期内加热时间的长短来控制加热器,如果把控制器的加热状态当成1,不加热状态当成0形成一个PWM的方波的话,那么也就是说可以用控制值控制这个PWM的占空比来控制加热功率。
基本的控制程序可以类似下面的代码来实现:
double minval=0;
int times=int(1000*m_SampleTimes);
if(controlval>minval){
unsigned int th;
unsigned int tl;
double bili;
double limit=100;
if(controlval>limit)
bili=1;
else
bili=controlval/limit;
th=(int)(times*bili);
tl=(int)(times*(1-bili));
Heating();//加热
Sleep(th);
StopHeating();//停止加热
Sleep(tl);
}else{
StopHeating();
Sleep(times);
}
其中minval是给的一个控制值需要加热的最小的阀值,m_SampleTimes指的是采样周期的时间,以秒为单位,controlval是第二部分计算出的控制值。至于另一个阀值limit选择100是考虑到现在的控制值是从相对误差百分数得到的。
图1 控温线程流程图
2 程序的实现
考虑到整个控温的过程,可以考虑另外增加两个单独的线程:一个负责与测温设备通讯,实时记录当前的温度;另外一个就负责整个控制温度的过程。而主程序负责开关控温、设置温度、界面等工作。图1给出其中控温线程的流程图。
其中线程被悬挂后,是通过主程序来唤醒的,唤醒后线程将接着悬挂点后面的程序继续执行。
3 算法的应用
PID算法在实际应用中还有很重要的一步是PID参数的测试确定。本人采用的方法基本是先用4:1衰减曲线法得到一个基础的比例、积分、微分参数,然后根据实际的温度变化曲线依从经验来调整3个参数。调整的原则基本是曲线爬升阶段过快或过慢以及曲线振荡频繁,调整比例参数;过冲调整微分参数;曲线波动周期长或回复慢调整积分参数。
这个算法已经成功应用在了人体疼痛检测系统和熔融沉积快速成型控制系统的温度控制程序中,其中后者需要开启3个不同温度控制器,都实现了准确的控温,基本能够保持在上下只偏差0.5度的范围,满足应用的需要。
参考文献:
[1]朱仲邃,分段积分的PID算法在温度控制系统中的应用[J].仪器仪表用户,2005(1):31-32.
作者简介:
徐文(1973-),女,湖南长沙人,硕士研究生,工程师,研究方向:数据库管理、图象处理、运动控制等,发表过6篇论文。