- 相關(guān)推薦
PID算法的C語言實(shí)現(xiàn):抗積分飽和的PID優(yōu)化
導(dǎo)語:C語言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語言。下面我們來看看PID算法的C語言實(shí)現(xiàn):抗積分飽和的PID優(yōu)化,希望對(duì)大家有所幫助。
積分飽和通俗講就是系統(tǒng)在一個(gè)偏差方向上的飽和,比如一個(gè)系統(tǒng)設(shè)定了輸出不會(huì)超過100,但因?yàn)槌霈F(xiàn)一個(gè)方向上的偏差積分使得輸出超過了100,此時(shí)達(dá)到了飽和狀態(tài),如果繼續(xù)在這個(gè)方向上積分會(huì)導(dǎo)致PID控制超過100系統(tǒng)卻運(yùn)行在100,相當(dāng)于積分調(diào)節(jié)對(duì)系統(tǒng)輸出沒有作用,就出現(xiàn)失控的狀態(tài),這是系統(tǒng)不能接受的,而且飽和積分越深,退出飽和就越久。上面是在正向的飽和,負(fù)向的飽和類似!
為了解決這個(gè)問題,我們采用抗積分飽和算法,其思路就是:如果上一次的輸出控制量超過了飽和值,飽和值為正,則這一次只積分負(fù)的偏差,飽和值為負(fù),則這一次只積分正的偏差,從而避免系統(tǒng)長(zhǎng)期留在飽和區(qū)!
下面我以位置型+抗積分飽和+積分分離的PID控制算法C語言來觀察調(diào)節(jié)結(jié)果:
//位置型+抗積分飽和+積分分離 PID控制算法
struct _pid{
float SetSpeed;
float ActualSpeed;
float Err;
float Err_Last;
float Kp,Ki,Kd;
float Voltage;
float Integral;
float Umax; //最大正飽和上限值
float Umin; //最大負(fù)飽和下限值
}pid;
void PID_Init(void)
{
printf("PID_Init begin! ");
pid.SetSpeed = 0;
pid.ActualSpeed = 0;
pid.Err = 0;
pid.Err_Last = 0;
pid.Kp = 0.2;
pid.Ki = 0.1; //增大了積分環(huán)節(jié)的值
pid.Kd = 0.2;
pid.Voltage = 0;
pid.Integral = 0;
pid.Umax = 400; //正飽和值為400
pid.Umin = -200; //負(fù)飽和值為-200
printf("PID_Init end! ");
}
float PID_Cal(float Speed)
{
unsigned char index;
pid.SetSpeed = Speed;
pid.Err = pid.SetSpeed - pid.ActualSpeed;
if(pid.ActualSpeed>pid.Umax) //如果上一次輸出變量出現(xiàn)正向的飽和
{
if(abs(pid.Err)>200)
{
index = 0;
}
else
{
index = 1;
if(pid.Err<0)
{
pid.Integral += pid.Err; //正飽和只積分負(fù)偏差
}
}
}
else if(pid.ActualSpeed {
if(abs(pid.Err)>200)
{
index = 0;
}
else
{
index = 1;
if(pid.Err>0)
{
pid.Integral += pid.Err; //負(fù)飽和只積分正偏差
}
}
}
else
{
if(abs(pid.Err)>200) //
{
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! ");
PID_Init();
while(count<1000)
{
float speed = PID_Cal(200.0);
printf("-%d-%f-",count,speed);
count++;
}
return 0;
}
【PID算法的C語言實(shí)現(xiàn):抗積分飽和的PID優(yōu)化】相關(guān)文章:
C語言中實(shí)現(xiàn)KMP算法實(shí)例08-09
C語言實(shí)現(xiàn)歸并排序算法實(shí)例09-18
C語言程序的實(shí)現(xiàn)09-27
C語言的HashTable簡(jiǎn)單實(shí)現(xiàn)10-12
C語言中遞歸算法的剖析08-15
C語言冒泡排序算法實(shí)例06-15
關(guān)于字符串的組合算法問題的C語言實(shí)現(xiàn)攻略10-21