荟萃馆

位置:首页 > 计算机 > C语言

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

C语言1.17W

导语:C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的.机器码以及不需要任何运行环境支持便能运行的编程语言。下面我们来看看PID算法的C语言实现:抗积分饱和的PID优化,希望对大家有所帮助。

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

积分饱和通俗讲就是系统在一个偏差方向上的饱和,比如一个系统设定了输出不会超过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!");

peed = 0;

alSpeed = 0;

= 0;

_Last = 0;

= 0.2;

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

= 0.2;

age = 0;

gral = 0;

= 400; //正饱和值为400

= -200; //负饱和值为-200

printf("PID_Init end!");

}

float PID_Cal(float Speed)

{

unsigned char index;

peed = Speed;

= peed - alSpeed;

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

{

if(abs()>200)

{

index = 0;

}

else

{

index = 1;

if(<0)

{

gral += ; //正饱和只积分负偏差

}

}

}

else if(alSpeed {

if(abs()>200)

{

index = 0;

}

else

{

index = 1;

if(>0)

{

gral += ; //负饱和只积分正偏差

}

}

}

else

{

if(abs()>200) //

{

index = 0;

}

else

{

index = 1;

gral += ;

}

}

age = * +index**gral + *( - _Last);

_Last = ;

alSpeed = age*1.0;

return alSpeed;

}

int main(void)

{

int count = 0 ;

printf("SYSTEM BEGIN!");

PID_Init();

while(count<1000)

{

float speed = PID_Cal(200.0);

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

count++;

}

return 0;

}