01、引入PID
電機控制
這樣是沒有反饋的,也就是說我們完全相信輸入的數字,且是理想化的模型,比如輸入占空比為50%的25Kz的PWM,車輪速度為1m/s,實際產品中會受到各種這樣的影響,比如地面阻力,風阻等等,同樣輸入占空比為50%的25Kz的PWM,車輪的速度並不是1m/s。
這時候我們就引入測量單元,也就是反饋系統。
這個時候,最常見的反饋就是:直接使用反饋值。簡單的例子,屬於數值X和輸出數值y的數學公式是:y=2x,這是這最見的關系。假設我們輸入7,測量結果是5,那么我們就直接將輸入修改為7+2*(7-5)=11。也就是我們一次直接調整到位。這樣調節過於簡單粗暴,因為我們直接將輸入修改為11,有可能輸出直接變成6,超過預期值了。這時候就自然而然的想到多次調節,每次只增加一點,然后測量速度,看一下是否達標。
這就是比例調節Kp。
02、比例調節
舉例說明,當前小車速度為0.2,目標速度是1。輸出y和輸入x的關系是y=1*x。比例系數Kp=0.5。隨着時間的增大,輸出和輸入關系如下。
直觀折線圖顯示如下
我們發現這太完美了,那么比例環節就能夠完美的解決問題了,可是等等,在下這個結論前,我們忽略一個特因素:噪聲誤差。
在很多系統中都是有噪聲的,這我們舉例小車中,噪聲誤差可能來自於電機的誤差,外部因素風阻等誤差,且是波動的。我們將問題簡化,假設外部因素恆定,外部因素是的小車實際輸出速度減去0.1。
還是上面的例子,當前小車速度為0.2,目標速度是1。輸出y和輸入x的關系是y=1*x。比例系數Kp=0.5,恆定的誤差為-0.1,隨着時間的增大,輸出和輸入關系如下。
直觀折線圖顯示如下
最終輸出穩定在0.8,因為我們初始值為0.2,到最后和目標差值是0.2,補償是0.1,誤差正好是-0.1,也就是說等於我們沒有補償。
如果我們需要速度達到1呢???辦法就是增大比例系數Kp。
誤差為0.8時
誤差為1.9時
誤差為2時,已經完全震盪
結論:比例控制引入了穩態誤差,且無法消除。比例常數增大可以減小穩態誤差,但如果太大則引起系統震盪,不穩定。
03、積分調節
為了消除穩態誤差,第二次加入積分,使用PI(比例積分控制),積分控制就是將歷史誤差全部加起來乘以積分常數。公式如下:
u(t) -------------輸出曲線,pid輸出值隨時間的變化曲線
Kp --------------比例系數
e(t)--------------偏差曲線,設定值與實際值的偏差隨時間的變化曲線
t-----------------時間
關於定積分,如果你上過高數,且沒有睡覺的話。
需要將數學公式離散化,才能用到計算機系統來。
①表示在時間點t,輸出的值
②表示在時間點t,輸出的誤差
③表示從時間0到t,累計誤差。
添加Ki參數之后的折線圖如下
結論:
只要存在偏差,積分就不停的累計,直到誤差為0,積分項不再累加,變成一個常數,可以抵消穩態誤差.
04、微分調節
引入積分可以消除穩態誤差,但會增加超調,且Ki增大,超調量也增大.
為了消除超調,我們引入微分作用
積分就是e(t)曲線的斜率。
將公式離散化為
ek是當前誤差,ek-1是上一次誤差,所以①就是誤差曲線的斜率。
關於PID公式還有其他寫法,本質是一樣的
離散化后是
u(t) -------------輸出曲線,pid輸出值隨時間的變化曲線
Kp --------------比例系數
e(t)------------- 偏差曲線,設定值與實際值的偏差隨時間的變化曲線
Ti--------------- 積分時間
Td--------------微分時間
T----------------調節周期
那么PID的參數如下
將前面的示例,加入微分項,Ki=0.3。
折線圖如下
結論:微分能夠減弱超調趨勢。
05、總結
PID調節示意圖如下
可以發現:
比例項是糾正偏差的主力,越遠離偏差絕對值就越大,快速把偏差糾正回來。
積分項和以往的狀態有關,面積的絕對值越大它的絕對值就越大,它的作用是消除累計偏差。
微分項跟斜率有關,比較難解釋,總的來說它的作用是:當目標靠近設定值時加速它靠近,當目標遠離設定值時阻止它遠離。因此微分可以增加系統穩定性,因為到達目的之后,離開會受到阻礙。
06、增量PID
上面我們講解的是位置PID,還有一種增量PID,輸出的不是目標值,而是與上次值的差值。直觀上將就是u(t)-u(t-1)。
那么u(t)-u(t-1)的公式是
位置型PID控制器的基本特點:
-
位置型PID控制的輸出與整個過去的狀態有關,用到了偏差的累加值,容易產生累積偏差。
-
位置型PID適用於執行機構不帶積分部件的對象。
-
位置型的輸出直接對應對象的輸出,對系統的影響比較大。
增量型PID控制器的基本特點:
-
增量型PID算法不需要做累加,控制量增量的確定僅與最近幾次偏差值有關,計算偏差的影響較小。
-
增量型PID算法得出的是控制量的增量,對系統的影響相對較小。
-
采用增量型PID算法易於實現手動到自動的無擾動切換。
07、代碼編程
位置PID
/******************************************************************* 位置式pid ********************************************************************/ double PID(double Actual,double SET) { static double E_sum,Error_last; //上一次誤差 double kp=20.767,ki=1.867,kd=115.55; double pid_out; double Error_now; //當前誤差 Error_now = SET-Actual; //當前誤差 // if(Error_now>-0.9&&Error_now<0.9) //防靜態誤差 // { // Error_now=0; // Error_last=0; // } E_sum += Error_now; //誤差累計 // if(E_sum>484)E_sum=484; //積分限幅度,防止積分飽和 // if(E_sum<-484)E_sum=-484; pid_out= kp * Error_now + ki * E_sum + kd * (Error_now-Error_last); //pid計算公式 Error_last=Error_now; // if(pid>900) pid=900; //輸出限幅 // if(pid<-900)pid=-900; return -pid_out; }
增量PID
error = target_speed - current_speed; P_error = error; I_error = error - left_motor.L_error; D_error = error - 2*left_motor.L_error + left_motor.LL_error; add = (s16)(KP * P_error + KI * I_error + KD * D_error); left_motor.ESC_output_PWM += add; left_motor.LL_error = left_motor.L_error; left_motor.L_error = error;
excel文件下載:
下載鏈接:https://pan.baidu.com/s/11FkopQg5iBeLSu_1j8YD1Q
提取碼:5ohs
點擊查看本文所在的專輯,STM32F207教程