改進初學者的PID-介紹


  最近看到了Brett Beauregard發表的有關PID的系列文章,感覺對於理解PID算法很有幫助,於是將系列文章翻譯過來!在自我提高的過程中,也希望對同道中人有所幫助。作者Brett Beauregard的原文網址:http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/

 

  結合新的Arduino PID庫的發布,我決定發布這一系列帖子。最后一個庫雖然穩定,但並沒有真正提供任何代碼解釋。這次計划的目的是詳細解釋為什么代碼是這樣的。我希望這對兩類人有用:

  • 直接對Arduino PID庫中發生的事情感興趣的人將得到詳細的解釋。
  • 任何編寫自己的PID算法的人都可以看看我是如何做的,並借鑒他們喜歡的東西。

  這將是一個艱難的過程,但我認為我找到了解釋我的代碼的一個不太痛苦的方法。我將從我稱之為“初學者的PID”開始。然后我將逐步改進它,直到我們留下一個高效,強大的pid算法。

初學者的PID

  這是每個人第一次學習它時接觸的PID方程式:

 

  這導致幾乎每個人都編寫以下PID控制器:

 1 /*working variables*/
 2 unsigned long lastTime;
 3 double Input,Output,Setpoint;
 4 double errSum,lastErr;
 5 double kp,ki,kd;
 6 void Compute()
 7 {
 8    /*How long since we last calculated*/
 9    unsigned long now = millis();
10    double timeChange = (double)(now - lastTime);
11  
12    /*Compute all the working error variables*/
13    double error = Setpoint - Input;
14    errSum += (error * timeChange);
15    double dErr = (error - lastErr) / timeChange;
16  
17    /*Compute PID Output*/
18    Output = kp * error + ki * errSum + kd * dErr;
19  
20    /*Remember some variables for next time*/
21    lastErr = error;
22    lastTime = now;
23 }
24  
25 void SetTunings(double Kp,double Ki,double Kd)
26 {
27    kp = Kp;
28    ki = Ki;
29    kd = Kd;
30 }

  Compute()被定期或不定期地調用,並且它運行良好。不過,這樣的PID並不是“非常好用”。如果我們要將此代碼轉換為與工業PID控制器相同的代碼,我們將不得不解決以下問題:

 

  1、采樣時間—如果以固定間隔評估PID算法,則該算法的運行效果最佳。如果算法知道這個間隔,我們也可以簡化一些內部的數學計算。

  2、微分沖擊—這雖然不是最重要的,但很容易處理,所以我們就先處理它。

  3、改變整定參數—一個好的PID算法是可以在不影響內部工作的情況下改變整定參數的算法。

  4、積分飽和—我們將討論積分飽和,並實現一個很好的解決方案。

  5、開/關(自動/手動)—在大多數應用中,有時需要關閉PID控制器並手動調節輸出,而不會影響控制器。

  6、初始化—當控制器第一次打開時,我們想要一個“無擾動切換”。也就是說,我們不希望輸出突然變成一些新值。

  7、正反作用—最后一種方法,並且不改變系統的魯棒性和名稱。它旨在確保用戶使用正確的符號輸入調整參數。

  8、新:測量的比例—添加此功能可以更輕松地控制某些類型的過程。

  一旦我們解決了所有這些問題,我們就會擁有一個可靠的PID算法。我們還將獲得Arduino PID庫最新版本中使用的代碼,這並非巧合。因此,無論您是嘗試編寫自己的算法,還是試圖了解PID庫中的內容,我希望這可以幫助您解決問題。讓我們開始吧。

  更新:在所有代碼示例中,我使用的是雙精度。在Arduino上,double與float相同(單精度。)真雙精度對於PID來說可能會成為累贅。如果您使用的語言確實是雙精度,我建議將所有雙精度更改為浮點數。

歡迎關注:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM