欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PID算法的C语言实现六 抗积分饱和的PID优化

程序员文章站 2024-02-03 14:49:46
积分饱和通俗讲就是在一个偏差方向上的饱和,比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致pid控制超过1...

积分饱和通俗讲就是在一个偏差方向上的饱和,比如一个系统设定了输出不会超过100,但因为出现一个方向上的偏差积分使得输出超过了100,此时达到了饱和状态,如果继续在这个方向上积分会导致pid控制超过100系统却运行在100,相当于积分调节对系统输出没有作用,就出现失控的状态,这是系统不能接受的,而且饱和积分越深,退出饱和就越久。上面是在正向的饱和,负向的饱和类似!

为了解决这个问题,我们采用抗积分饱和算法,其思路就是:如果上一次的输出控制量超过了饱和值,饱和值为正,则这一次只积分负的偏差,饱和值为负,则这一次只积分正的偏差,从而避免系统长期留在饱和区!

下面我以 位置型+抗积分饱和+积分分离的pid控制算法c语言来观察调节结果:(相对应的代码可以参考以往的文章)

//位置型+抗积分饱和+积分分离 pid控制算法

struct _pid{

float setspeed;

float actualspeed;

float err;

float err_last;

float kp,ki,kd;

float voltage;

float integral;

float umax; //最大正饱和上限值

float umin; //最大负饱和下限值

}pid;

void pid_init(void)

{

printf("pid_init begin! \n");

pid.setspeed = 0;

pid.actualspeed = 0;

pid.err = 0;

pid.err_last = 0;

pid.kp = 0.2;

pid.ki = 0.1; //增大了积分环节的值

pid.kd = 0.2;

pid.voltage = 0;

pid.integral = 0;

pid.umax = 400; //正饱和值为400

pid.umin = -200; //负饱和值为-200

printf("pid_init end! \n");

}

float pid_cal(float speed)

{

unsigned char index;

pid.setspeed = speed;

pid.err = pid.setspeed - pid.actualspeed;

if(pid.actualspeed>pid.umax) //如果上一次输出变量出现正向的饱和

{

if(abs(pid.err)>200)

{

index = 0;

}

else

{

index = 1;

if(pid.err<0)

{

pid.integral += pid.err; //正饱和只积分负偏差

}

}

}

else if(pid.actualspeed {

if(abs(pid.err)>200)

{

index = 0;

}

else

{

index = 1;

if(pid.err>0)

{

pid.integral += pid.err; //负饱和只积分正偏差

}

}

}

else

{

if(abs(pid.err)>200) //积分分离的pid优化,可参考以往的文章

{

index = 0;

}

else

{

index = 1;

pid.integral += pid.err;

}

}

pid.voltage = pid.kp*pid.err +index*pid.ki*pid.integral + pid.kd*(pid.err - pid.err_last);

pid.err_last = pid.err;

pid.actualspeed = pid.voltage*1.0;

return pid.actualspeed;

}

int main(void)

{

int count = 0 ;

printf("system begin! \n");

pid_init();

while(count<1000)

{

float speed = pid_cal(200.0);

printf("-%d-%f-",count,speed);

count++;

}

return 0;

}

最后运行结果:

PID算法的C语言实现六 抗积分饱和的PID优化

我们发现,相对以往的算法,还算法大大提高了调节的速度和稳定!