改善初學者的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控制器類似的代碼,則必須解決一些問題:
- 採樣時間 - 如果定期對PID算法進行評估,則其效果最佳。如果算法知道此間隔,我們還可以簡化一些內部數學運算。
- 微分衝擊 - 這不是最大的問題,但是很容易解決,因此我們將這樣做。
- 動態調整參數 - 一種好的PID算法可以在不影響內部工作的情況下更改調整參數。
- 緩解積分飽和 - 我們將介紹什麼是緩解積分飽和,並實施具有附帶好處的解決方案。
- 開/關(自動/手動)- 在大多數應用中,有時需要關閉PID控制器並手動調節輸出,而不會干擾控制器。
- 初始化 - 控制器首次開啓時,我們希望進行”無擾動的傳輸“,也就是說,我們不希望輸出突然變爲某個新值。
- 控制方向 - 最後一個不是魯棒性本身名稱的更改,它旨在確保用戶輸入具有正確符號的調優參數。
- 新增 測量比例(Proportional on Measurement) - 添加這個特性使得它更加容易控制特定類型的過程。
測量比例(Proportional on Measurement)** - 添加這個特性使得它更加容易控制特定類型的過程。
解決所有問題後,我們將獲得一個可靠的PID算法。我們也會(並非偶然)擁有最新版本的Arduino PID 庫中使用的代碼。因此,無論你在嘗試編寫自己的算法,還是試圖瞭解PID庫正在發生的事情,希望對你有所幫助。讓我們開始吧。