温度控制的PID算法与C程序实现Word文档格式.docx
《温度控制的PID算法与C程序实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《温度控制的PID算法与C程序实现Word文档格式.docx(8页珍藏版)》请在冰点文库上搜索。
2.温度控制的两个阶段
温度控制系统是一个惯性较大的系统,也就是说,当给温区开始加热之后,并不能立即观察得到温区温度的明显上升;
同样的,当关闭加热之后,温区的温度仍然有一定程度的上升。
另外,热电偶对温度的检测,与实际的温区温度相比较,也存在一定的滞后效应。
这给温度的控制带来了困难。
因此,如果在温度检测值(PV)到达设定值时才关断输出,可能因温度的滞后效应而长时间超出设定值,需要较长时间才能回到设定值;
如果在温度检测值(PV)未到设定值时即关断输出,则可能因关断较早而导致温度难以达到设定值。
为了合理地处理系统响应速度(即加热速度)与系统稳定性之间地矛盾,我们把温度控制分为两个阶段。
(1)PID调节前阶段
在这个阶段,因为温区的温度距离设定值还很远,为了加快加热速度,SSR与发热管处于满负荷输出状态,只有当温度上升速度超过控制参数“加速速率”,SSR才关闭输出。
“加速速率”描述的是温度在单位时间的跨度,反映的是温度升降的快慢,如上图所示。
用“加速速率”限制温升过快,是为了降低温度进入PID调节区的惯性,避免首次到达温度设定值(SV)时超调过大。
在这个阶段,要么占空比K=0,SSR关闭;
要么占空比K=100%,SSR全速输出。
PID调节器不起作用,仅由“加速速率”控制温升快慢。
(2)PID调节阶段
在这个阶段,PID调节器调节输出,根据偏差值计算占空比(0-100%),保证偏差(EV)趋近于零,即使系统受到外部干扰时,也能使系统回到平衡状态。
3.PID算法
PID控制的原理是基于下面的算式:
输出M(t)是比例项,积分项和微分项的函数。
其中:
M(t)PID回路的输出,是时间的函数
KcPID回路的比例增益
ePID回路的偏差(设定值(SV)与过程变量(PV)之差)
MinitialPID回路的静态输出值
为了能让数字计算机处理这个算式,连续算式必须离散化为周期采样偏差算式,才能用来计算输出值。
数字计算机处理的算式如下:
从这个公式可以看出,积分项是从第一个采样周期到当前采样周期所有误差项的函数,微分项是当前采样和前一次采样的函数,比例项仅是当前采样的函数。
在数字计算机中,不保存所有的误差项,其实也不必要。
由于计算机从第一次采样开始,每有一个过程采样值必须计算一次输出值,只需要保存前一次过程值(PVn-1)和积分项前值。
利用计算机处理的重复性,可以将以上算式变换为:
Mn在第n采样时刻,PID回路的输出计算值
SVPID回路设定值
PVn在第n采样时刻的过程变量值
PVn-1在第n-1采样时刻的过程变量值
MX积分前项值
MintialPID回路的静态输出值
KcPID回路的比例增益
KI积分项的比例常数KI=Kc*Ts/Ti
Ts是离散化时的采样时间间隔Ti是积分时间参数;
KD微分项的比例常数KD=Kc*Td/Ts
Ts是离散化时的采样时间间隔Td是微分时间参数;
从上面PID的算式,可以分析三个基本参数Kc,KI,KD在实际控制中的作用:
(1)比例调节作用:
比例项按比例反应系统的偏差,系统一旦出现了偏差,比例调节立即产生调节作用用以减少偏差。
比例作用大,可以加快调节,减少偏差。
但是过大的比例调节,使系统的稳定性下降,甚至造成系统的不稳定。
(2)积分调节作用:
积分项消除系统的稳态误差,提高无差度。
只要有偏差,积分就进行,直到无偏差时,积分运算才停止,积分调节项输出一常数值。
积分作用的强弱取决于积分时间常数Ti,Ti越小,积分作用越强。
积分控制可提高系统的无差度,但积分项输出响应缓慢,使得系统调节时间增长。
(3)微分调节作用:
微分项反映系统过程变量的变化率((PVn-1-PVn)/Ts),具有预见性,能预见变化的趋势,因此,能产生超前的调节作用,在偏差还没有形成之前,已被微分调节作用消除。
因此,可以改善系统的动态性能。
在微分时间参数Td选择合适的情况下,可以减少超调,减少调节时间。
微分调节对干扰有放大效果,过强的微分调节,对系统抗干扰不利。
此外,微分项反映的是过程变量的变化率,而当过程变量没有变化时,微分调节输出为零。
微分调节不能单独使用,需要与另外两种调节规律相结合,组成PD或PID调节器。
以上面的推导,C程序如下
/*
pid算法C源程序,还有实现pid自动调整。
51用于控制温度26-100摄氏度。
TIME:
2011-07-2920:
15:
07
*/
#include<
stdlib.h>
#include"
global_varible.h"
/****************************************************************************
*模块名:
PID
*描述:
PID调节子程序
*采用PID-PD算法。
在偏差绝对值大于△e时,用PD算法,以改善动态品质。
*当偏差绝对值小于△e时,用PID算法,提高稳定精度。
*PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e
(1)]+kd*[e(t)-e(t-1)]
*============================================================================
*入口:
无
*出口:
*改变:
PID_T_Run=加热时间控制
*****************************************************************************/
voidPID_Math(void)
{
signedlongee1;
//偏差一阶
//signedlongee2;
//偏差二阶
signedlongd_out;
//积分输出
if(!
Flag_PID_T_OK)
return;
Flag_PID_T_OK=0;
Temp_Set=3700;
//温度控制设定值37.00度
PID_e0=Temp_Set-Temp_Now;
//本次偏差
ee1=PID_e0-PID_e1;
//计算一阶偏差
//ee2=PID_e0-2*PID_e1+PID_e2;
//计算二阶偏差
//一阶偏差的限制范围
if(ee1>
500)ee1=500;
if(ee1<
-500)ee1=-500;
PID_e_SUM+=PID_e0;
//偏差之和
//积分最多累计的温差
if(PID_e_SUM>
200)PID_e_SUM=200;
if(PID_e_SUM<
-200)PID_e_SUM=-200;
PID_Out=PID_kp*PID_e0+PID_kd*ee1;
//计算PID比例和微分输出
if(abs(PID_e0)<
200)//如果温度相差小于1.5度则计入PID积分输出
{
if(abs(PID_e0)>
100){//如果温度相差大于1度时积分累计限制
if(PID_e_SUM>
100)PID_e_SUM=100;
if(PID_e_SUM<
-100)PID_e_SUM=-100;
}
d_out=PID_ki*PID_e_SUM;
//积分输出
if(PID_e0<
-5){//当前温度高于设定温度0.5度时积分累计限制
150)PID_e_SUM=150;
0)d_out>
>
=1;
//当前温度高于设定温度0.5度时削弱积分正输出
PID_Out+=d_out;
//PID比例,积分和微分输出
}
else
PID_e_SUM=0;
PID_Out/=100;
//恢复被PID_Out系数放大的倍数
if(PID_Out>
200)PID_Out=200;
if(PID_Out<
0)PID_Out=0;
if(PID_e0>
300)PID_Out=200;
//当前温度比设定温度低3度则全速加热
if(PID_e0<
-20)PID_Out=0;
//当前温度高于设定温度0.2度则关闭加热
Hot_T_Run=PID_Out;
//加热时间控制输出
//PID_e2=PID_e1;
//保存上次偏差
PID_e1=PID_e0;
//保存当前偏差
}