1.位置式PID
typedef struct { float Kp; //比例系數Proportional float Ki; //積分系數Integral float Kd; //微分系數Derivative float Ek; //當前誤差 float Ek1; //前一次誤差 e(k-1) float Ek2; //再前一次誤差 e(k-2) float LocSum; //累計積分位置 }PID_LocTypeDef; /************************************************ 函數名稱 : PID_Loc 功 能 : PID位置(Location)計算 參 數 : SetValue ------ 設置值(期望值) ActualValue --- 實際值(反饋值) PID ----------- PID數據結構 返 回 值 : PIDLoc -------- PID位置 作 者 : strongerHuang *************************************************/ float PID_Loc(float SetValue, float ActualValue, PID_LocTypeDef *PID) { float PIDLoc; //位置 PID->Ek = SetValue - ActualValue; PID->LocSum += PID->Ek; //累計誤差 PIDLoc = PID->Kp * PID->Ek + (PID->Ki * PID->LocSum) + PID->Kd * (PID->Ek1 - PID->Ek); PID->Ek1 = PID->Ek; return PIDLoc; }
2.增量式PID
typedef struct { float Kp; //比例系數Proportional float Ki; //積分系數Integral float Kd; //微分系數Derivative float Ek; //當前誤差 float Ek1; //前一次誤差 e(k-1) float Ek2; //再前一次誤差 e(k-2) }PID_IncTypeDef; /************************************************ 函數名稱 : PID_Inc 功 能 : PID增量(Increment)計算 參 數 : SetValue ------ 設置值(期望值) ActualValue --- 實際值(反饋值) PID ----------- PID數據結構 返 回 值 : PIDInc -------- 本次PID增量(+/-) 作 者 : strongerHuang *************************************************/ float PID_Inc(float SetValue, float ActualValue, PID_IncTypeDef *PID) { float PIDInc; //增量 PID->Ek = SetValue - ActualValue; PIDInc = (PID->Kp * PID->Ek) - (PID->Ki * PID->Ek1) + (PID->Kd * PID->Ek2); PID->Ek2 = PID->Ek1; PID->Ek1 = PID->Ek; return PIDInc; }
兩者的區別:
(1)位置式PID控制的輸出與整個過去的狀態有關,用到了誤差的累加值;而增量式PID的輸出只與當前拍和前兩拍的誤差有關,因此位置式PID控制的累積誤差相對更大;
(2)增量式PID控制輸出的是控制量增量,並無積分作用,因此該方法適用於執行機構帶積分部件的對象,如步進電機等,而位置式PID適用於執行機構不帶積分部件的對象,如電液伺服閥。
(3)由於增量式PID輸出的是控制量增量,如果計算機出現故障,誤動作影響較小,而執行機構本身有記憶功能,可仍保持原位,不會嚴重影響系統的工作,而位置式的輸出直接對應對象的輸出,因此對系統影響較大。