【技術】Arduino PID自整定庫

  最近看到了Brett Beauregard發表的有關PID的系列文章,感受對於理解PID算法頗有幫助,因而將系列文章翻譯過來!在自我提升的過程當中,也但願對同道中人有所幫助。做者Brett Beauregard的原文網址:http://brettbeauregard.com/blog/2012/01/arduino-pid-autotune-library/算法

 

  最後,我發佈了一個Autotune庫來補充Arduino PID庫。當我發佈當前版本的PID庫時,我發佈了一系列異常普遍的帖子,讓人們對裏面發生的事情更易理解。工具

  雖然沒有那麼深刻,但這是這個帖子的目標。我將解釋 Autotune 庫想要完成的任務,以及它是如何處理其業務的。ui

1、起因spa

  幾年來,我一直想擁有一個自動整定庫,但因爲我與僱主的協議,我沒法寫一個。可是!當我找到由William Spinelli編寫的AutotunerPID工具箱時,我已經準備好了;個人公司對我移植和擴展示有的開源項目沒有任何問題。翻譯

  我將代碼從 matlab 轉換過來,對峯值識別代碼進行了一些調整,並將其從標準形式 (Kc、Ti、Td) 切換到理想形式 (Kp、Ki、Kd)。除此以外,全部的功勞都歸斯皮內利先生全部。blog

2、理論get

  PID 控制器的最佳整定參數 (Kp、Ki、Kd) 將取決於該控制器的驅動的是什麼。烤箱最好的整定參數與低溫烹飪器具最好的整定參數是不一樣的。原理

  自整定器試圖找出控制器驅動的內容的性質,而後從中進行調整參數。有多種方法能夠作到這一點,但大多數方法都涉及到以某種方式更改 PID 輸出,而後觀察輸入的響應方式。擴展

  庫中使用的方法稱爲中繼方法。下面是它的工做原理:循環

 

  從穩態開始(輸入和輸出都是穩態),輸出沿一個方向跨必定距離D階躍,當輸入越過觸發線時,輸出沿另外一個方向跨距離D階躍。

  經過分析峯值的距離以及峯值相對於輸出變化的大小,Autotuner 能夠分辨出一種類型的過程和另外一種類型的過程之間的區別。所以,不一樣的系統將得到自定義調優參數:

 

3、實施狀況

  這在理論上效果很好,但現實世界的數據並非很合做。輸入信號一般是嘈雜的,這會致使兩個主要問題。

3.1、問題 #1什麼時候步進?

  因爲噪聲信號是起伏的,當輸入信號通過觸發線時,觸發線極可能會被交叉幾回。這可能會致使輸出中輕微的顫振,若是嚴重的話,可能會徹底破壞:

 

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

 

3.2、問題 #2:峯值識別

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

 

  每個噪聲信號都是一個方向的改變。爲了處理這個問題,我添加了一個「回溯時間」參數。這是一個糟糕的名字。若是你能想出更好的辦法,請告訴我。

  不管如何,用戶定義了某個窗口,好比10秒。而後,庫將當前點與最後十秒的數據進行比較。若是它是最小值或最大值,則會將其標記爲可能的峯值。

  當標記的點從最大值切換到最小值時,反之亦然,之前標記的點被確認爲峯值。

 

  另外一種解釋回溯時間的方法是,若是一個點是一個回溯將來或過去中最大 (或最小) 的值,則該點將被標識爲峯值。就像我說的:可怕的名字。

4、你也應該知道..

  執行的循環數將在3到10之間變化。該算法一直等到最後3個最大值彼此都在5%之內。這是爲了確保咱們已經達到了穩定的振盪而且沒有外部奇異現象發生。這讓我想到……

  我不是Autotune的超級粉絲。我常常說,並且仍然相信,一個受過中等訓練的人會很容易打敗自動整定器。若是不清楚算法的話,不少地方會很容易出錯。話雖如此,但 Autotune 是幫助新手進入競技場的寶貴工具。

歡迎關注:

相關文章
相關標籤/搜索