改善初學者的PID(一)---簡介

改善初學者的PID(一)—簡介

一、簡介

結合新的Arduino PID庫的發佈,我決定發佈此係列文章。 最後一個庫雖然可靠,但實際上並沒有任何代碼說明。 這次圍繞該計劃詳細解釋代碼爲何如此。 我希望這對兩類人有用:

  • 直接對Arduino PID庫中發生的事情感興趣的人將獲得詳細說明。

  • 任何編寫自己的PID算法的人都可以看看我的工作方式,並借用他們喜歡的任何東西。

這將是一個艱難的口號,但我認爲我發現了一種不太痛苦的方式來解釋我的代碼。 我將從所謂的“初學者的PID”開始。然後逐步進行改進,直到獲得具有高效,魯棒性的pid算法。

初學者的PID

這是每個人首先學習的PID公式:

在這裏插入圖片描述

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

在這裏插入圖片描述

/*working variables*/
unsigned long lastTime;
double Input, Output, Setpoint;
double errSum, lastErr;
double kp, ki, kd;
void Compute()
{
   /*How long since we last calculated*/
   unsigned long now = millis();
   double timeChange = (double)(now - lastTime);
  
   /*Compute all the working error variables*/
   double error = Setpoint - Input;
   errSum += (error * timeChange);
   double dErr = (error - lastErr) / timeChange;
  
   /*Compute PID Output*/
   Output = kp * error + ki * errSum + kd * dErr;
  
   /*Remember some variables for next time*/
   lastErr = error;
   lastTime = now;
}
  
void SetTunings(double Kp, double Ki, double Kd)
{
   kp = Kp;
   ki = Ki;
   kd = Kd;
}

Compute()被定期或不定期調用,並且效果很好。不過,本系列不是關於“效果很好”的內容。如果要將該代碼轉換爲與工業PID控制器類似的代碼,則必須解決一些問題:

  1. 採樣時間 - 如果定期對PID算法進行評估,則其效果最佳。如果算法知道此間隔,我們還可以簡化一些內部數學運算。
  2. 微分衝擊 - 這不是最大的問題,但是很容易解決,因此我們將這樣做。
  3. 動態調整參數 - 一種好的PID算法可以在不影響內部工作的情況下更改調整參數。
  4. 緩解積分飽和 - 我們將介紹什麼是緩解積分飽和,並實施具有附帶好處的解決方案。
  5. 開/關(自動/手動)- 在大多數應用中,有時需要關閉PID控制器並手動調節輸出,而不會干擾控制器。
  6. 初始化 - 控制器首次開啓時,我們希望進行”無擾動的傳輸“,也就是說,我們不希望輸出突然變爲某個新值。
  7. 控制方向 - 最後一個不是魯棒性本身名稱的更改,它旨在確保用戶輸入具有正確符號的調優參數。
  8. 新增 測量比例(Proportional on Measurement) - 添加這個特性使得它更加容易控制特定類型的過程。

測量比例(Proportional on Measurement)** - 添加這個特性使得它更加容易控制特定類型的過程。

解決所有問題後,我們將獲得一個可靠的PID算法。我們也會(並非偶然)擁有最新版本的Arduino PID 庫中使用的代碼。因此,無論你在嘗試編寫自己的算法,還是試圖瞭解PID庫正在發生的事情,希望對你有所幫助。讓我們開始吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章