關於pid各種整理例程基於stm32,位置式,增量式等
struct
t_pid2
pid2;
void
pid2_init()
float
pid2_realize
(float speed)
所謂的積分飽和現象是指如果系統存在乙個方向的偏差,pid 控制器的輸出由於積分作用的不斷累加而加大,從而導致執行機構達到極限位置,若控制器輸出 u(k)繼續增大,執行器開度不可能再增大,此時計算機輸出控制量超出了正常執行範圍而進入飽和區。一旦系統出現反向偏差,u(k)逐漸從飽和區退出。進入飽和區越深則退出飽和區時間越長。在這段時間裡,執行機構仍然停留在極限位置而不隨偏差反向而立即做出相應的改變,這時系統就像失控一樣,造成控制效能惡化,這種現象稱為積分飽和現象或積分失控現象。
防止積分飽和的方法之一就是抗積分飽和法,該方法的思路是在計算 u(k)時,首先判斷上一時刻的控制量 u(k-1)是否已經超出了極限範圍: 如果u(k-1)>umax,則只累加負偏差; 如果 u(k-1)
如上圖,很明顯有三個過衝:
過程①:因為這個過程存在較大幅度變化的誤差,因此積分器累積了較大的值,從圖中可以看到,積分器的面積比較大(陰影部分)ek為正;
過程②:此時積分已經飽和,產生了較大的過衝,並且在較長的一段時間內,一直處於過衝的狀態,ek為負;
過程③:積分脫離飽和狀態,產生了積極的調節作用,消除靜差,系統輸出達到設定值 ek為正;
處理過程:
/*定義結構體和公用體*/
typedef
struct
pid;
void
pidregulation
(pid *vpid,
float processvalue)
}elseif
(vpid->resultminimum)
}else
increment=vpid->proportiongain*perror+vpid->integralgain*ierror+vpid->derivativegain*derror;
//增量計算
vpid->preerror=vpid->lasterror;
//存放偏差用於下次運算
vpid->lasterror=thiserror;
vpid->result+=increment;
}
#
define
default_speed-5
// mm/s 預設目標值
#define
default_proportion
0.11f
// kp係數
#define
default_integral
0.12f
// ki係數
#define
default_derivative
0.03f
// kd係數
/** * 函式功能: pid結構體初始化
* 輸入引數: 無
* 返 回 值: 無
* 說 明: 初始化pid引數
*/void
init_pidstruct()
/** * 函式功能:增量式pid速度環計算
* 輸入引數:nextpoint 由編碼器得到的速度值
* targetval 目標值
* 返 回 值:經過pid運算得到的增量值
* 說 明:增量式 pid 速度環控制設計,計算得到的結果仍然是速度值
*/float
incpidcalc
(__io float nextpoint,__io float targetval)
//臨時變數,期望值
struct
t_pid
pid;
void
pid_init()
float
pid_realize
(float speed)
積分分離的概念,其基本思路是 當被控量與設定值偏差較大時,取消積分作用; 當被控量接近給定值時,引入積分控制,以消除靜差,提高精度。
struct
t_pid3
pid3;
void
pid3_init()
float
pid3_realize
(float speed)
else
pid3.voltage3=pid3.kp3*pid3.err3+index*pid3.ki3*pid3.integral3+pid3.kd3*
(pid3.err3-pid3.err_last3)
; pid3.err_last3=pid3.err3;
pid3.actualspeed3=pid3.voltage3*
1.0;
return pid3.actualspeed3;
}
struct
t_pid4
pid4;
void
pid4_init()
float
pid4_realize
(float speed)
else}}
else
if(pid4.actualspeed4
else}}
else
else
} pid4.voltage4=pid4.kp4*pid4.err4+index*pid4.ki4*pid4.integral4+pid4.kd4*
(pid4.err4-pid4.err_last4)
;// pid4.voltage4=pid4.kp4*pid4.err4+index*pid4.ki4*pid4.integral4/2+pid4.kd4*(pid4.err4-pid4.err_last4);
pid4.err_last4=pid4.err4;
pid4.actualspeed4=pid4.voltage4*
1.0;
return pid4.actualspeed4;
}
struct
t_pid5
pid5;
void
pid5_init()
float
pid5_realize
(float speed)
elseif(
abs(pid5.err5)
<
180)
else
pid5.voltage5=pid5.kp5*pid5.err5+index*pid5.ki5*pid5.integral5+pid5.kd5*
(pid5.err5-pid5.err_last5)
; pid5.err_last5=pid5.err5;
pid5.actualspeed5=pid5.voltage5*
1.0;
return pid5.actualspeed5;
}
總結:從上面公式可以發現,對照pid控制演算法(一),其實就分位置式與增量式至於實現過衝,其實是一樣的,只不過合併同類項不同而已。 pid演算法 pid控制原理
pid控制原理和特點 工程實際中,應用最為廣泛調節器控制規律為比例 積分 微分控制,簡稱pid控制,又稱pid調節。pid控制器問世至今已有近70年歷史,它以其結構簡單 穩定性好 工作可靠 調整方便而成為工業控制主要技術之一。當被控物件結構和引數不能完全掌握,或不到精確數學模型時,控制理論其它技術難...
模糊PID控制演算法
在pid控制演算法的c 語言實現中,文章已經對模糊pid的實質做了乙個簡要說明。基本概念和思路進行一下說明,相信有c 語言基礎的朋友可以通過這些介紹性的文字自行實現。這篇文章主要說明一下模糊演算法的含義和原理。實際上模糊演算法屬於智慧型演算法,智慧型演算法也可以叫非模型演算法,也就是說,當我們對於系...
PID演算法控制簡單理解
1 傳統的位式控制演算法 使用者期望值sv 設定值 經控制演算法輸出乙個輸出訊號out,輸出訊號載入到執行部件上 像mos管等 對控制物件進行控制 步進電機 加熱器等 控制物件的當前值 pv 如速度通過感測器反饋給控制演算法與sv相比較。特點 1 位式演算法輸出的控制訊號只有兩種狀態 h 或者 l ...