最近看到了Brett Beauregard發表的有關PID的系列文章,感覺對於理解PID算法很有幫助,於是將系列文章翻譯過來!在自我提高的過程中,也希望對同道中人有所幫助。作者Brett Beauregard的原文網址:http://brettbeauregard.com/blog/2012/01/arduino-pid-autotune-library/
最后,我發布了一個Autotune庫來補充Arduino PID庫。當我發布當前版本的PID庫時,我發布了一系列異常廣泛的帖子,讓人們對里面發生的事情更易理解。
雖然沒有那么深入,但這是這個帖子的目標。我將解釋 Autotune 庫想要完成的任務,以及它是如何處理其業務的。
1、原由
幾年來,我一直想擁有一個自動整定庫,但由於我與雇主的協議,我無法寫一個。但是!當我找到由William Spinelli編寫的AutotunerPID工具箱時,我已經准備好了;我的公司對我移植和擴展現有的開源項目沒有任何問題。
我將代碼從 matlab 轉換過來,對峰值識別代碼進行了一些調整,並將其從標准形式 (Kc、Ti、Td) 切換到理想形式 (Kp、Ki、Kd)。除此之外,所有的功勞都歸斯皮內利先生所有。
2、理論
PID 控制器的最佳整定參數 (Kp、Ki、Kd) 將取決於該控制器的驅動的是什么。烤箱最好的整定參數與低溫烹飪器具最好的整定參數是不同的。
自整定器試圖找出控制器驅動的內容的性質,然后從中進行調整參數。有多種方法可以做到這一點,但大多數方法都涉及到以某種方式更改 PID 輸出,然后觀察輸入的響應方式。
庫中使用的方法稱為中繼方法。下面是它的工作原理:
從穩態開始(輸入和輸出都是穩態),輸出沿一個方向跨一定距離D階躍,當輸入越過觸發線時,輸出沿另一個方向跨距離D階躍。
通過分析峰值的距離以及峰值相對於輸出變化的大小,Autotuner 可以分辨出一種類型的過程和另一種類型的過程之間的區別。因此,不同的系統將獲得自定義調優參數:
3、實施情況
這在理論上效果很好,但現實世界的數據並不是很合作。輸入信號通常是嘈雜的,這會導致兩個主要問題。
3.1、問題 #1:何時步進?
由於噪聲信號是起伏的,當輸入信號經過觸發線時,觸發線很可能會被交叉幾次。這可能會導致輸出中輕微的顫振,如果嚴重的話,可能會完全破壞:

我選擇回避此問題的方式是讓用戶指定噪聲帶。實際上,這將創建兩條觸發線。由於它們之間的距離等於噪音 (如果設置得當),由於信號抖動而發生多次交叉的可能性較小。

3.2、問題 #2:峰值識別
在模擬世界中,識別峰值很容易: 當輸入信號改變方向時,這是最小值或最大值 (取決於發生的更改)。但是,在嘈雜的世界中,此方法失敗:

每一個噪聲信號都是一個方向的改變。為了處理這個問題,我添加了一個“回溯時間”參數。這是一個糟糕的名字。如果你能想出更好的辦法,請告訴我。
無論如何,用戶定義了某個窗口,比如10秒。然后,庫將當前點與最后十秒的數據進行比較。如果它是最小值或最大值,則會將其標記為可能的峰值。
當標記的點從最大值切換到最小值時,反之亦然,以前標記的點被確認為峰值。
另一種解釋回溯時間的方法是,如果一個點是一個回溯未來或過去中最大 (或最小) 的值,則該點將被標識為峰值。就像我說的:可怕的名字。
4、你也應該知道..。
執行的循環數將在3到10之間變化。該算法一直等到最后3個最大值彼此都在5%以內。這是為了確保我們已經達到了穩定的振盪並且沒有外部奇異現象發生。這讓我想到……
我不是Autotune的超級粉絲。我經常說,而且仍然相信,一個受過中等訓練的人會很容易戰勝自動整定器。如果不清楚算法的話,很多地方會很容易出錯。話雖如此,但 Autotune 是幫助新手進入競技場的寶貴工具。
歡迎關注:

