电子设计竞赛(4)-常用的两种PID算法
公眾號關注?“大魚機器人”
設為 “星標”,重磅干貨,第一時間送達!
1. 什么是PID
PID 控制器以各種形式使用超過了 1 世紀,廣泛應用在機械設備、氣動設備 和電子設備.在工業應用中PID及其衍生算法是應用最廣泛的算法之一,是當之無愧的萬能算法
PID 實指“比例 proportional”、“積分 integral”、“微分 derivative”,這三項構 成 PID 基本要素。每一項完成不同任務,對系統功能產生不同的影響。
它的結構簡單,參數易 于調整,是控制系統中經常采用的控制算法。
PID:比例單元(P)、積分單元(I)和微分單元(D)組成
▲ PID控制框圖
PID控制公式:
其中:u(t)為控制器輸出的控制量;(輸出)
e(t)為偏差信號,它等于給定量與輸出量之差;(輸入)
KP 為比例系數;(對應參數 P)
TI 為積分時間常數;(對應參數I)
TD 為微分時間常數。(對應參數 D)?
數字 PID 控制算法因時間離散化不同,通常分為位置式 PID 控制算法和增量式 PID 控制算法。??
2. 位置式 PID 算法?
? ? ? ? ? ? ? ? ? ??
e(k): 用戶設定的值(目標值) -? 控制對象的當前的狀態值?
比例P :? ? e(k)
積分I :? ?∑e(i)? ? ?誤差的累加(包括e(k))
微分D :? e(k) - e(k-1)? 這次誤差-上次誤差
也就是位置式PID是當前系統的實際位置,與你想要達到的預期位置的偏差,進行PID控制。
因為有誤差積分 ∑e(i),一直累加,也就是當前的輸出u(k)與過去的所有狀態都有關系,用到了誤差的累加值;(誤差e會有誤差累加),輸出的u(k)對應的是執行機構的實際位置,,一旦控制輸出出錯(控制對象的當前的狀態值出現問題 ),u(k)的大幅變化會引起系統的大幅變化
并且位置式PID在積分項達到飽和時,誤差仍然會在積分作用下繼續累積,一旦誤差開始反向變化,系統需要一定時間從飽和區退出,所以在u(k)達到最大和最小時,要停止積分作用,并且要有積分限幅和輸出限幅
所以在使用位置式PID時,一般我們直接使用PD控制
而位置式 PID 適用于執行機構不帶積分部件的對象,如舵機和平衡小車的直立和溫控系統的控制
根據公式結合代碼可以很好理解
//pwm=Kp*e(k)+Ki*∑e(k)+Kd[e(k)-e(k-1)] typedef struct PID { float kp; float ki; float kd; float ek; //當前誤差 float ek_1; //上一次誤差 float ek_sum; //誤差總和 float limit; //限幅 }PID; static PID pid; void PID_Init() {pid.kp = 0.1;pid.ki = 0.2;pid.kd = 0.3;pid.limit = 1000;pid.ek = 0;pid.ek_1 = 0;pid.ek_sum = 0; } // 位置式PID控制 float PID_Postion(int Encoder,int Target) { float pwm = 0;pid.ek = Target - Encoder; // 計算當前誤差pid.ek_sum += pid.ek; //求出偏差的積分pwm = pid.kp*pid.ek + pid.ki*pid.ek_sum + pid.kd*(pid.ek - pid.ek_1); //位置式PID控制器pid.ek_1 = pid.ek; //保存上一次偏差 if(pwm > pid.limit){pwm = pid.limit;} else if(pwm < -pid.limit){pwm = -pid.limit;} return pwm; }有不明所以然的朋友會問,在將PID用于電機控制時,我這個PID的輸入參數是編碼器的數值、目標位置,我的輸出PWM是個什么東西呢?
這個PWM可以是-1---+1的占空比,也可以是比較寄存器的數值,例如ARR是3000,PWM這個可以是1500,代表PWM占空比50%,那有的會問,例如我的encoder是1000,target是2000,那么pid.ek = 1000,按照pid.kp = 10計算,那么pid.kp*pid.ek = 10000,也就是說這個輸出pwm如果代表占空比-1--+1的話,遠遠大于它的范圍,那是不是這個計算或者公式有問題呢?
或者是不是pwm代表的意義不對呢?其實是沒有關系的,因為按照計算10000大于1,PWM=1,那么完全按照占空比1運行,等到encoder=target時,pwm=0,電機就不再運動了,到達了目標位置;
但是這里要提醒大家,encoder與target代表編碼器數值,二者的差值肯定是整數,乘以pid.kp=10之后,肯定大于1,所以PWM始終是100%占空比,這樣有可能時鐘無法找到目標位置,所以pid.kp=10這個參數設置就不合理,比如設置pid.kp=0.001,則encoder與target差值如果在1000以內,PWM就可能在-1--+1之間,這樣才能真正的起到調節作用,所以kp的值并不是大家隨意亂設,要根據控制量的實際情況、輸出值的實際意義,設定參數,脫離實際意義的盲目瞎設參數反而適得其反。
3. 增量式PID
比例P :? ?e(k)-e(k-1)? ?當前誤差 - 上次誤差
積分I :? ?e(i)? ? ?當前誤差? ?
微分D :? e(k) - 2e(k-1)+e(k-2)? ?當前誤差 - 2*上次誤差 + 上上次誤差
增量式PID根據公式可以很好地看出,一旦確定了 KP、TI ?、TD,只要使用前后三次測量值的偏差, 即可由公式求出控制增量。
而得出的控制量▲u(k)對應的是近幾次位置誤差的增量,而不是對應與實際位置的偏差,沒有誤差累加。
也就是說,增量式PID中不需要累加。控制增量Δu(k)的確定僅與最近3次的采樣值有關,容易通過加權處理獲得比較好的控制效果,并且在系統發生問題時,增量式不會嚴重影響系統的工作。
總結:
增量型 PID,是對位置型 PID 取增量,這時控制器輸出的是相鄰兩次采樣時刻所計算的位置值
之差,得到的結果是增量,即在上一次的控制量的基礎上需要增加(負值意味減少)控制量。
代碼實現效果如下:
//根據增量式離散PID公式 //pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)] //e(k)代表本次偏差 //e(k-1)代表上一次的偏差 以此類推 //e(k-2)代表上上次的偏差 //pwm代表增量輸出 typedef struct PID { float kp;float ki;float kd;float ek; //當前誤差float ek_1; //上一次誤差float ek_2; //上上一次誤差float limit; //限幅 }PID;static PID pid;void PID_Init() {pid.kp = 0.1;pid.ki = 0.2;pid.kd = 0.3;pid.limit = 1000;pid.ek = 0;pid.ek_1 = 0;pid.ek_2 = 0; }// 增量式PID控制 float PID_Increase(int Encoder,int Target) {float pwm = 0;pid.ek = Target - Encoder; // 計算當前誤差pid.ek_sum += pid.ek; //求出偏差的積分pwm = pid.kp*(pid.ek - pid.ek_1) + pid.ki*pid.ek + pid.kd*(pid.ek - 2*pid.ek_1 + pid.ek_2); //增量式PID控制器pid.ek_1 = pid.ek; //保存上一次偏差 pid.ek_2 = pid.ek_1; //保存上上一次的偏差if(pwm > pid.limit){pwm = pid.limit;}else if(pwm < -pid.limit){pwm = -pid.limit;}return pwm; }4. 增量式與位置式區別
1 增量式算法不需要做累加,控制量增量的確定僅與最近幾次偏差采樣值有關,計算誤差對控制 量計算的影響較小。而位置式算法要用到過去偏差的累加值,容易產生較大的累加誤差。?
2 增量式算法得出的是控制量的增量,例如在閥門控制中,只輸出閥門開度的變化部分,誤動作 影響小,必要時還可通過邏輯判斷限制或禁止本次輸出,不會嚴重影響系統的工作。而位置式的輸出直接對應對象的輸出,因此對系統影響較大。
3 增量式PID控制輸出的是控制量增量,并無積分作用,因此該方法適用于執行機構帶積分部件的對象,如步進電機等,而位置式PID適用于執行機構不帶積分部件的對象,如電液伺服閥。
4 在進行PID控制時,位置式PID需要有積分限幅和輸出限幅,而增量式PID只需輸出限幅
位置式PID優缺點:
優點:
①位置式PID是一種非遞推式算法,可直接控制執行機構(如平衡小車),u(k)的值和執行機構的實際位置(如小車當前角度)是一一對應的,因此在執行機構不帶積分部件的對象中可以很好應用
缺點:
①每次輸出均與過去的狀態有關,計算時要對e(k)進行累加,運算工作量大。
增量式PID優缺點:
優點:
①誤動作時影響小,必要時可用邏輯判斷的方法去掉出錯數據。
②手動/自動切換時沖擊小,便于實現無擾動切換。當計算機故障時,仍能保持原值。
③算式中不需要累加。控制增量Δu(k)的確定僅與最近3次的采樣值有關。
缺點:
①積分截斷效應大,有穩態誤差;
②溢出的影響大。有的被控對象用增量式則不太好;
5. 如何進行參數整定?
首先我們需要明確我們的控制目標,也就是滿足控制系統的 3 個要求:
穩定性
快速性
準確性
具體的評估指標有最大超調量、上升時間、靜差等。?
最大超調量是響應曲線的最大峰值與穩態值的差,是評估系統穩定性的一個重要指標;上升時間是指響應曲線從原始工作狀態出發,第一次到達輸出穩態值所需的時間,是評估系統快速性的一個重要指標;靜差是被控量的穩定值與給定值之差,一般用于衡量系統的準確性,具體可以參考前文的講解。?
在實踐生產工程中,不同的控制系統對控制器效果的要求不一樣。比如平衡車、倒立擺對系統的快速性要求很高,響應太慢會導致系統失控。智能家居里面的門窗自動開合系統,對快速性要求就不高,但是對穩定性和準確性的要求就很高,所以需要嚴格控制系統的超調量和靜差。所以 PID 參數在不同的控制系統中是不一樣的。只要我們理解了每個 PID 參數的作用,我們就可以應對工程中的各種項目的 PID 參數整定了。
?
一般而言,一個控制系統的控制難度,一般取決于系統的轉動慣量和對響應速度的要求等。轉動慣量越小、對響應速度要求越低,PID 參數就越不敏感。比如現在我們控制電機轉 90°,需要嚴格控制超調量、和靜差。但是對響應速度無要求。因為電機處于輕載的情況下,轉動慣量很小,這是一個很容易完成的工作。根據上面的理論分析和實踐,因為響應速度無要求,一般 P 應該給小一點,然后加大系統的阻尼防止超調,也就是 D 參數盡量大,另外因為 P 值較小,應該加入I 控制減小靜差。
原文鏈接:https://blog.csdn.net/u014453443/java/article/details/100573722
-END-
關于比賽的帖子,之前寫過很多篇:
「第一彈」電子設計大賽應該準備什么?
「第一篇」大學生電子設計競賽,等你來提問。
「第二篇」全國一等獎,經驗帖。
「第三篇」電賽,這些你必須知道的比賽細節,文末附上近十年電賽題目下載
「第四篇」電賽控制題可以準備一些什么?
「第五篇」全國電子設計競賽-電源題設計方案總結
「第六篇」對于電賽,我們應該看重什么?
電子設計競賽電源題(1)-電源題簡介
電子設計競賽電源題(2)-檢波與采樣
電子設計競賽(三)-SPWM與PID
也有一些大神的經驗貼,其實不乏國獎獲得者:
全國一等獎,他的學習之路。
從0開始,三個月,獲全國一等獎。
獎狀是怎么煉成的—我的電賽狂魔之旅
全國一等獎的獲得者,如今去當了人民教師。
也有一些關于比賽項目的文章:
參加智能車大賽還是電賽?在做電磁炮中我找到了答案
2019年電賽綜合測評題詳解
「權威發布」2019年電賽最全各類題目細節問題解答匯總
獎狀是怎么煉成的—我的電賽狂魔之旅
【大學生電子設計競賽分享經驗貼】風力循跡小車
去年還做過幾期猜題的文章,貌似有點接近了,今年還可以繼續給大家猜猜。
「猜題第一篇」2019年大學生電子設計競賽
「重磅猜題之第二篇」2019年大學生電子設計競賽
?最 后???若覺得文章不錯,轉發分享,也是我們繼續更新的動力。5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~長按識別圖中二維碼關注總結
以上是生活随笔為你收集整理的电子设计竞赛(4)-常用的两种PID算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迷你世界新型飞机怎么做 新型飞机制作方法
- 下一篇: 王者荣耀巅峰赛怎么玩 王者荣耀巅峰赛玩法