积分限幅 链接到标题

注释
需要注意的是,前面我们也对out做过一个限幅,而对积分限幅相当于从更源头的地方限制了,目的是优化调节过程。

针对的情景 链接到标题

  • 遇到因卡住等积分项无法消除的误差,会使得积分项单调增大至深度饱和。
  • 且在卡住等故障消除后,PID会在短时间内过冲,直到退出深度饱和区。

改进 链接到标题

首先,对于增量式PID,在限幅out的时候已经顺手限幅了积分项,因此不会出现这个问题,因此需要调整的是位置式PID

if (Ki!=0)//用于防止Ki由0变为非0时,积分项突变,猛然调控。
{
    ErrorInt+=Error0;
}
else
{
    ErrorInt=0;
}

积分分离 链接到标题

也是对于定位控制

针对的情景 链接到标题

  • 前面说过,对于定位控制,只靠P其实已经很完美了,但是对于恒定的小误差无能为力,
  • 因此需要I来消除这个小误差,
  • 但是I太大的话又会出现超调与震荡
  • 因此我们可以让I在小误差的时候才发挥作用,在大误差时主要还是P来起作用

代码实现 链接到标题

有两种,

  • 一种是使用if直接判断是否积分,这种在没有积分时候积分项会被直接清零
  • 第二种是设置操作码c,通过控制操作码是零还是1,来影响out结果,即
Out=Kp*Error0+Ki*ErrorInt+Kd*(Error0-Error1);

下面演示第一种

if(fabs(Error0)<10)
{
    ErrorInt+=Error0;
}
else
{
    ErrorInt=0;
}

注意,需要加入#include<math.h>宏包,fabs是求绝对值的函数,在这个标准库里面

变速积分 链接到标题

相当于是积分分离的升级版,积分分离时函数是-u(t)的变速积分,在大于一个阈值的时候一刀切,而变速积分使用其他非奇异的非增函数,由两种

  • 线性
    • $x<A,y=1$
    • $A<x<B,y=\frac{B-A}{B+A}x$
    • $x>B,y=1$
  • 非线性:比如$y=\frac{1}{kx+1}$

方法也是有两种

  • 一种是直接在积分项上进行操作,(加快积分速度)
ErrorInt+=C*Error0;
  • 一种是在out上进行操作,(加强积分项强度)
Out=Kp*Error0+c*Ki*ErrorInt+Kd*(Error0-Error1);

下面在代码中演示非线性的加强积分强度,只需要两行代码:

float C=1/(1+fabs(Error0));//将c定义为局部变量
ErrorInt+=C*Error0;