PID算法的C語言實現:抗積分飽和的PID優化

來源:文萃谷 9.8K

導語: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;

}

熱門標籤