注意:任何算法使用程序表示,都得將算法離散化,以下的算法公式及代碼都是將連續函數離散化后的表示結果。
問題一:位置式pid與增量式pid差別?
位置式PID將誤差累加,增量式PID與當前及前兩派誤差有關。
問題二:位置式PID計算公式是什么?

問題三:增量式PID計算公式是什么?
由問題二的位置式的PID計算公式可知,u(k)和u(k-1)的計算公式。將二者做差,即得到增量式PID的計算公式。

問題四:位置式PID實現C語言代碼?
typedef struct{
float kp,ki,kd;
float ek,ek1,ek2; //ek1 是 ek 的前一次誤差
float eSUM;
}PID;
結構體PID的初始化:
PID pid = {10.0,10.0,0.0,0.0,0.0,0.0};
float PID_Loc(float SetValue, float ActualValue, PID *pid){
float PIDLoc;
pid->ek = SetValue - ActualValue;
pid->eSum += pid->ek; //累計誤差
PIDLoc = (pid->kp*pid-ek)
+ (pid->ki*pid->eSUM)
+ [pid->kd*(pid->ek1 - pid->ek)]
pid->ek1 = pid->ek;
return PIDLoc;
}
問題五:增量式PID的實現代碼?該pid計算結果如何使用?
//PID結構體的定義見問題四,
float PID_Inc(float SetValue, float ActualValue, PID *pid){
float PIDInc;
pid->ek = SetValue - ActualValue;
PIDInc = [pid->kp * (pid->ek - pid->ek1)]
+ (pid->ki * pid->ek)
+ [pid->kd * (pid->ek - 2*pid->ek1 + pid->ek2)];
//注意:可以將公式化簡,這是一種思維,不要簡單的將下面化簡的kp,ki,kd。理解為書上的PID。這里是提了公因式的
PIDInc = (pid->kp * pid->ek)
- (pid->ki * pid->ek1)
+ (pid->kd * pid->ek2)
pid->ek2 = pid->ek1;
pid->ek1 = pid->ek;
return PIDInc;
} //由於計算結果是屬於增量,那么計算后,該PIDInc需要疊加到原PWM的占空比上面,具體是加還是減看具體情況。
問題六:為什么在使用增量式PID的時候,反饋的調節現象是正反饋?
增量式的pid,在實際的應用上,需要根據具體的情況判斷是加還是減,弄錯了就成為了正反饋。
問題七:實際應用中,PID三個參數該如何確定?
先調P值,P從小往大了調,調到臨界振盪,取臨界振盪的70%
再調I值,I值從大往小了調,調到消除穩定誤差。
D值,視情況來調。默認為零。
參考文獻:
[1] 何俊龍,杜封.微縮智能車路徑跟蹤的增量式PID控制[J].天津職業技術師范大學學報.2018,28(2):5-9

