PID控制算法
PID控制器是一個結構簡單並且成熟穩定的控制器,在工業上應用廣泛。包括比例(Proportion)、積分(Integral)、微分(Differential)三個控制元素,三者是對系統偏差不同處理方式。
比例控制 P
比例控制是基礎,將反饋值和期望值的差值和一個參數KP進行相乘,表示這一個控制周期對誤差的矯正力度,類似火車進入火車站時候的油門量。此參數過小會導致恢復力度不足以克制干擾變大的趨勢,比例參數過大會導致超調並且系統發散。
微分控制 D
微分控制是為了彌補系統矯正過程中慣性對系統穩定性的影響,根據當前的誤差變化曲線的求微分得到斜率,也就是表達一個控制周期內誤差變化量(本次誤差減上次誤差),此值乘以一個參數KD進入到系統補償,起到一個阻尼力的作用,系統誤差變化越大此阻尼作用越明顯,類似火車進站時為防止速度過快超出而踩剎車產生阻力或者單擺擺動時受到的空氣阻力,若沒有阻力單擺將永遠擺動下去,視為超調。
積分控制 I
積分控制是一個將誤差進行積分然后將積分值乘以一個參數KI進入系統補償的控制步驟,在系統誤差比較小的時候的誤差叫做靜差,我們前面所做的補償作用也會比較小,無法消除靜差,將誤差進行累加補償便可提升矯正效果,提升控制的精准度,類似司機最后停站位置不夠精准,再進行微調。積分控制是一把雙刃劍,誤差的積分在誤差較大的時候是一個比較大的數值,過強的補償對系統調節反而會造成干擾,因此需注意針對積分控制的優化措施積分分離和積分限幅:誤差大使停止積分作用、誤差小時開啟,對積分效果進行限幅。
位置式和增量式
PID有位置式和增量式之分,位置式PID是根據上述理論三個環節控制處理的疊加。
增量式pid是根據位置式pid公式進行轉換得出的,增量式pid只需要三次反饋和期望值的偏差,得出的是相對於上次控制量需變化的控制量。
由此可以得出增量式PID可以規避誤差累積帶來的干擾。由於增量式得出控制變化量,所以要和前面的結果不停累加,這樣某一次故障控制產生雜波可以有比較小的影。而缺點是沒有積分作用,存在穩態誤差,控制精度和靈敏度不如直接控制執行機構的位置式PID,根據被控對象的特征選擇兩種PID進行控制。因為無人機對高速響應和精度的要求,這里使用位置式PID。
PID算法的C語言實現
這里推薦 《PID控制算法的C語言實現》里面除了詳細的概念講解、基本的C語言實現,還有積分分離、限幅等重要操作。
pid三種調節並不一定都同時使用,根據各自作用進行選擇,下面貼出筆者使用的可控制選項的位置式pid控制的C語言函數
void position_PID(pid_t *PID,float target,float measure,uint8_t mode)
{
switch(mode)
{
case P: { PID->Ki=0;PID->Kd=0;break; }
case PD:{ PID->Ki=0;break; }
case PI:{ PID->Kd=0;break; }
default:break;
}
PID->err_now = target - measure;
PID->integral += PID->err_last;
if(PID->err_now > PID->threshold || PID->err_now < -PID->threshold )
{
PID->remove_flag = 0;
PID->integral = 0;
}
else
{
PID->remove_flag = 1;
}
PID->pwm_out = PID->Kp * PID->err_now;
PID->pwm_out += PID->Kd * (PID->err_now-PID->err_last);
PID->pwm_out += PID->Ki * PID->integral*PID->remove_flag;
PID->err_last =PID->err_now;
}
注:
- 偏差有正負之分
- 積分的限幅、分離、清零處理很重要,積分這種調節方式風險較大,如果處理不當,偏差的累計造成的誤差將壓垮系統。積分分離可用積分計算時乘以標志位的方式,偏差大時標志位置0關閉積分調節
- 微分調節效果和控制周期關系很大
- 串級pid的實現需要注意外環和內環的銜接關系,控制器的輸出作為輸入的時候可進行限幅及歸一化(映射成下一環期望允許的范圍)等數據處理,已達到更准確的控制效果
- 多環控制器調參建議先調整內環再調整外環
- 伺服系統(伺服電機或舵機)內部自帶控制器