PID概念
PID(比例-积分-微分)算法是一种广泛应用在控制工程中的反馈控制算法,主要用于调节系统的输出以达到期望的目标值。PID算法的核心是通过计算并结合三个基本控制动作:比例、积分和微分,来调整系统的输入。
比例(P):比例控制是根据当前的误差(目标值与实际值的差)直接产生控制动作。比例控制能快速响应误差,但不能消除稳态误差。
积分(I):积分控制是根据误差的积累(即误差时间积分)产生控制动作。积分控制可以消除稳态误差,但如果不对积分部分进行限制,可能会导致控制器输出饱和,引发积分饱和问题。
微分(D):微分控制是根据误差的变化率(即误差的时间导数)产生控制动作。微分控制可以预测未来的误差变化趋势,有助于减少系统的超调和振荡。
什么是积分饱和
误差累积过大,导致控制器输出最大值,在误差开始变小,甚至误差值方向(正负)变换后,因为之前的累积值过大,控制器仍然保持最大值输出一段时间才开始变化。
从图中我们不难发现,这里有三个过程;
过程①:因为这个过程存在较大幅度变化的误差,因此积分器累积了较大的值,从图中可以看到,积分器的面积比较大(阴影部分);
过程②:此时积分已经饱和,产生了较大的过冲,并且在较长的一段时间内,一直处于过冲的状态;
过程③:积分脱离饱和状态,产生了积极的调节作用,消除静差,系统输出达到设定值;
为了解决积分饱和问题,人们引入了抗积分饱和的PID算法。其思路是在计算U(k)的时候,先判断上一时刻的控制量U(k-1)是否已经超出限制范围。若U(k-1)>Umax,则只累积负误差,若U(k-1)<Umin,则只累积正误差。从而避免控制量长时间停在饱和区。
流程图如下:
1、 位置式PID的实现
位置式PID计算公式
定义PID结构
typedef struct
{
s16 Err;
s16 LastErr;
s16 Kp;
s16 Ki;
s16 Kd;
s16 Ref; //参考值
s16 Meas;//实际测量值
s16 Integral;//积分累加值
s16 OutMax;
s16 OutMin;
s16 Out;
} PID;
Kp, Ki, Kd, OutMax, OutMin根据实际项目定义。
void PidRegulation(PID *p)
{
p->Err=p->Ref-p->Meas;
if(p->Out>p->OutMax)
{
if(p->Err<0)
{
p->Integral+=p->Err;
}
}
else if(p->Out<p->OutMin)
{
if(p->Err>=0)
{
p->Integral+=p->Err;
}
}
else
{
p->Integral+=p->Err;
}
p->Out=p->Kp*p->Err+p->Ki*p->Integral+p->Kd*(p->Err-p->LastErr);
p->LastErr=p->Err;
}
2、 增量式PID实现
增量式PID实现公式:
上式中:
· 比例项: e(k)-e(k-1) 这次误差 – 上次误差
· 积分项: e(k) 这次误差
· 微分项: e(k) – 2e(k-1)+e(k-2) 这次误差 – 2*上次误差 + 上上次误差
typedef struct
{
s16 Err;//e(k)
s16 LastErr;//前一拍误差 e(k-1)
s16 PreErr;//前两拍误差e(k-2)
s16 Kp;
s16 Ki;
s16 Kd;
s16 Ref; //参考值
s16 Meas;//实际测量值
s16 Integral;//积分累加值
s16 Inc;//计算的增量
s16 OutMax;
s16 OutMin;
s16 Out;
} PIDInc;
Kp, Ki, Kd, OutMax, OutMin根据实际项目定义。
void PidRegulationInc(PIDInc *p)
{
s16 perror,ierror,derror;
p->Err=p->Ref-p->Meas;
perror=p->Err-p->LastErr;
ierror=0;
derror=p->Err-2*p->LastErr+p->PreErr;
if(p->Out>p->OutMax)
{
if(p->Err<0)
{
ierror=p->Err;
}
}
else if(p->Out<p->OutMin)
{
if(p->Err>=0)
{
ierror=p->Err;
}
}
else
{
ierror=p->Err;
}
p->Inc=p->Kp*perror+p->Ki*ierror+p->Kd*derror;
p->PreErr=p->LastErr;
p->LastErr=p->Err;
p->Out+=p->Inc;
}
位置式与增量式优缺点
1、位置式PID算法结构改变灵活,算法简单,鲁棒性好,可靠性高。 但是每次输出都与控制偏差e过去整个变化过程有关,这样容易产生较大的累积偏差,特别是当计算机发生故障时,由于调节器是全量输出,控制变量y可能会发生大幅振荡,给生产带来严重危害。而如果采用增量式PID算法,由于计算机只输出控制变量的增量Δy发生故障时只影响本次增量的大小,故影响较小。
2、系统从手动切换到自动时,位置式PID算法需要将调节器的输出置为初始值,这样才可能实现无冲击切换,而增量式PID算法易于实现手动自动的无冲击切换。
位置式PID算法要求计算累加和,故运算量大。而增量式PID算法不需要计算累加和,故运算量小。
3、位置式PID算法中,由于偏差公式中有对偏差的累积计算,所以,容易产生积分饱和现象,造成系统失控。而在增量式PID算法中,由于差分公式中不存在有对偏差的累加计算,所以,不会产生积分失控现象,避免了系统的超调和振荡现象的发生。但增量式PID算法有产生比例和微分失控现象的可能,使系统的动态性能变坏。
综上所述,位置式与增量式PID算法各有自己的优缺点,因此我们在应用之中应该结合实际情况,来选择具体的,最合适的控制方法。