本系列旨在以我本身寫的PID lib爲例,講一下PID的幾點基本優化,PID的基本原理網上有不少資料,所以本系列將不會涉及PID的基本實現原理,在這裏特別推薦Matlab tech talk的PID教程:https://ww2.mathworks.cn/videos/series/understanding-pid-control.html。html
因爲筆者大一在讀,尚未學習自動控制原理等課程,所以本系列將不會從自控原理角度展開,相反的,本系列將試圖從「直覺」展開,經過直觀的描述讓你們從直覺上感覺並理解PID的一些包括微分先行、積分分離等基礎的優化。算法
因爲筆者水平有限,文中不免存在一些不足和錯誤之處,誠請各位批評指正。ide
個人PID庫與PID基本優化(一)中講解了代碼結構與代碼使用,算法有關內容於該篇開始學習
積分項的做用在絕大多數狀況下是消除靜差,爲了更精準的消除靜差,咱們須要提升積分項的計算精度。在通常的PID算法中,咱們經過矩形面積來近似計算積分,在微積分中咱們瞭解到,當 \(\Delta t\) 趨近於無窮小時,這些矩形面積的累加就會無限逼近曲線與座標軸圍成的面積。優化
爲了達到更精準的控制,咱們通常能夠經過提升控制頻率來實現,但在某些狀況下受制於控制設備算力,咱們沒法以很高的頻率來運行咱們的算法。所以咱們能夠用梯形代替矩形,以此得到更高的積分精度,這種方式在控制頻率越低的場合提升精度的效果越好。spa
static void f_Trapezoid_Intergral(PID_TypeDef *pid) { pid->ITerm = pid->Ki * ((pid->Err + pid->Last_Err) / 2); }
在常規PID中,微分項是微分系數乘偏差的微分,而偏差的微分又能夠化成目標信號的微分減去輸入(測量值)的微分,即:code
當目標信號瞬間發生變化時,其微分會變得很是很是大,這會致使微分項的值也在瞬間變得巨大。這樣異常的微分項添加至控制算法中,會致使PID的輸出出現咱們不但願看到的峯值,這樣的峯值可能會影響系統的穩定性,甚至對執行器或者系統其餘部分形成損壞,咱們稱這種現象爲微分衝擊(Derivative Kick)。htm
以下圖所示,微分衝擊會使被控對象發生瞬間的抖動,經過觀察PID輸出與微分項輸出,咱們能夠直觀感覺到微分衝擊的威力:對象
將圖像2放大來看,在階躍信號剛產生時,微分項會給整個輸出帶來巨大的尖峯:blog
經過公式咱們能夠看到,是目標信號的微分引入的異常數值,所以咱們只須要扔掉目標信號的微分,只保留輸入(測量值)的微分(注意不要漏掉符號):
通過對微分項的一點點調整,咱們能夠看到,如今的控制曲線變得更加平滑,PID的輸出也不會出現異常的峯值:
static void f_Derivative_On_Measurement(PID_TypeDef *pid) { pid->Dout = pid->Kd * (pid->Last_Measure - pid->Measure); }