Pid抗积分饱和程序

PID概念

PID(比例-积分-微分)算法是一种广泛应用在控制工程中的反馈控制算法,主要用于调节系统的输出以达到期望的目标值。PID算法的核心是通过计算并结合三个基本控制动作:比例、积分和微分,来调整系统的输入。

比例(P):比例控制是根据当前的误差(目标值与实际值的差)直接产生控制动作。比例控制能快速响应误差,但不能消除稳态误差。

积分(I):积分控制是根据误差的积累(即误差时间积分)产生控制动作。积分控制可以消除稳态误差,但如果不对积分部分进行限制,可能会导致控制器输出饱和,引发积分饱和问题。

微分(D):微分控制是根据误差的变化率(即误差的时间导数)产生控制动作。微分控制可以预测未来的误差变化趋势,有助于减少系统的超调和振荡。

什么是积分饱和

误差累积过大,导致控制器输出最大值,在误差开始变小,甚至误差值方向(正负)变换后,因为之前的累积值过大,控制器仍然保持最大值输出一段时间才开始变化。

clip_image002[4]

从图中我们不难发现,这里有三个过程;

过程①:因为这个过程存在较大幅度变化的误差,因此积分器累积了较大的值,从图中可以看到,积分器的面积比较大(阴影部分);

过程②:此时积分已经饱和,产生了较大的过冲,并且在较长的一段时间内,一直处于过冲的状态;

过程③:积分脱离饱和状态,产生了积极的调节作用,消除静差,系统输出达到设定值;

clip_image004[4]为了解决积分饱和问题,人们引入了抗积分饱和的PID算法。其思路是在计算U(k)的时候,先判断上一时刻的控制量U(k-1)是否已经超出限制范围。若U(k-1)>Umax,则只累积负误差,若U(k-1)<Umin,则只累积正误差。从而避免控制量长时间停在饱和区。

流程图如下:

clip_image006[4]

1、 位置式PID的实现

位置式PID计算公式

clip_image008[6]

定义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实现公式:

clip_image008[7]

clip_image010[4]

clip_image012[4]

上式中:

· 比例项: 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算法各有自己的优缺点,因此我们在应用之中应该结合实际情况,来选择具体的,最合适的控制方法。

© 版权声明
THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发