PID庫與PID基本優化(二)

本系列旨在以我本身寫的PID lib爲例,講一下PID的幾點基本優化,PID的基本原理網上有不少資料,所以本系列將不會涉及PID的基本實現原理,在這裏特別推薦Matlab tech talk的PID教程:https://ww2.mathworks.cn/videos/series/understanding-pid-control.html。html

因爲筆者大一在讀,尚未學習自動控制原理等課程,所以本系列將不會從自控原理角度展開,相反的,本系列將試圖從「直覺」展開,經過直觀的描述讓你們從直覺上感覺並理解PID的一些包括微分先行、積分分離等基礎的優化。算法

因爲筆者水平有限,文中不免存在一些不足和錯誤之處,誠請各位批評指正。ide

個人PID庫與PID基本優化(一)中講解了代碼結構與代碼使用,算法有關內容於該篇開始學習

1 梯形積分

1.1 問題

積分項的做用在絕大多數狀況下是消除靜差,爲了更精準的消除靜差,咱們須要提升積分項的計算精度。在通常的PID算法中,咱們經過矩形面積來近似計算積分,在微積分中咱們瞭解到,當 \(\Delta t\) 趨近於無窮小時,這些矩形面積的累加就會無限逼近曲線與座標軸圍成的面積。優化

1.2 解決方案

爲了達到更精準的控制,咱們通常能夠經過提升控制頻率來實現,但在某些狀況下受制於控制設備算力,咱們沒法以很高的頻率來運行咱們的算法。所以咱們能夠用梯形代替矩形,以此得到更高的積分精度,這種方式在控制頻率越低的場合提升精度的效果越好。spa

1.3 代碼實現

static void f_Trapezoid_Intergral(PID_TypeDef *pid)
{
    pid->ITerm = pid->Ki * ((pid->Err + pid->Last_Err) / 2);
}

2 微分先行

2.1 問題

在常規PID中,微分項是微分系數乘偏差的微分,而偏差的微分又能夠化成目標信號的微分減去輸入(測量值)的微分,即:code

\[Dout = Kd *\frac{d \text { Err }}{d t}=Kd*(\frac{d \text { Target }}{d t}-\frac{d \text { Input }}{d t}) \]

當目標信號瞬間發生變化時,其微分會變得很是很是大,這會致使微分項的值也在瞬間變得巨大。這樣異常的微分項添加至控制算法中,會致使PID的輸出出現咱們不但願看到的峯值,這樣的峯值可能會影響系統的穩定性,甚至對執行器或者系統其餘部分形成損壞,咱們稱這種現象爲微分衝擊(Derivative Kick)。htm

以下圖所示,微分衝擊會使被控對象發生瞬間的抖動,經過觀察PID輸出與微分項輸出,咱們能夠直觀感覺到微分衝擊的威力:對象

將圖像2放大來看,在階躍信號剛產生時,微分項會給整個輸出帶來巨大的尖峯:blog

2.2 解決方案

經過公式咱們能夠看到,是目標信號的微分引入的異常數值,所以咱們只須要扔掉目標信號的微分,只保留輸入(測量值)的微分(注意不要漏掉符號):

\[Dout =-Kd*\frac{d \text { Input }}{d t} \]

通過對微分項的一點點調整,咱們能夠看到,如今的控制曲線變得更加平滑,PID的輸出也不會出現異常的峯值:

2.3 代碼實現

static void f_Derivative_On_Measurement(PID_TypeDef *pid)
{
    pid->Dout = pid->Kd * (pid->Last_Measure - pid->Measure);
}
相關文章
相關標籤/搜索