温度控制的PID算法与C程序实现.docx
《温度控制的PID算法与C程序实现.docx》由会员分享,可在线阅读,更多相关《温度控制的PID算法与C程序实现.docx(8页珍藏版)》请在冰豆网上搜索。
![温度控制的PID算法与C程序实现.docx](https://file1.bdocx.com/fileroot1/2023-2/6/acdb03d2-b75c-4b1f-b5e3-df8e5013ebb0/acdb03d2-b75c-4b1f-b5e3-df8e5013ebb01.gif)
温度控制的PID算法与C程序实现
温度控制与PID算法
温度控制与PID算法j较为复杂,下面结合实际浅显易懂的阐述一下PID控制理论,将温度控制及PID算法作一个简单的描述。
1.温度控制的框图
这是一个典型的闭环控制系统,用于控制加热温区的温度(PV)保持在恒定的温度设定值(SV)。
系统通过温度采集单元反馈回来的实时温度信号(PV)获取偏差值(EV),偏差值经过PID调节器运算输出,控制发热管的发热功率,以克服偏差,促使偏差趋近于零。
例如,当某一时刻炉内过PCB板较多,带走的热量较多时,即导致温区温度下降,这时,通过反馈的调节作用,将使温度迅速回升。
其调节过程如下:
温度控制的功率输出采用脉宽调制的方法。
固态继电器SSR的输出端为脉宽可调的电压UOUT。
当SSR的触发角触发时,电源电压UAN通过SSR的输出端加到发热管的两端;当SSR的触发角没有触发信号时,SSR关断。
因此,发热管两端的平均电压为
Ud=(t/T)*UAN=K*UAN
其中K=t/T,为一个周期T中,SSR触发导通的比率,称为负载电压系数或是占空比,K的变化率在0-1之间。
一般是周期T固定不便,调节t,当t在0-T的范围内变化时,发热管的电压即在0-UAN之间变化,这种调节方法称为定频调宽法。
下面将要描述的PID调节器的算式在这里的实质即是运算求出一个实时变化的,能够保证加热温区在外界干扰的情况下仍能保持温度在一个较小的范围内变化的合理的负载电压系数K。
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
#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度时积分累计限制
if(PID_e_SUM>150)PID_e_SUM=150;
if(PID_e_SUM>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;//保存当前偏差
}