改进初学者的PID-修改整定参数
最近看到了Brett Beauregard發(fā)表的有關(guān)PID的系列文章,感覺對于理解PID算法很有幫助,于是將系列文章翻譯過來!在自我提高的過程中,也希望對同道中人有所幫助。作者Brett Beauregard的原文網(wǎng)址:http://brettbeauregard.com/blog/2011/04/improving-the-beginner%E2%80%99s-pid-tuning-changes/
?
1、問題
對于任何可靠的PID算法,擁有在系統(tǒng)運(yùn)行時更改整定參數(shù)的能力都是必須的。
如果你試圖在系統(tǒng)運(yùn)行時改變整定參數(shù),在初學(xué)PID的人看來會顯得有點瘋狂。讓我們看看這是為什么?以下是初學(xué)者的 PID 在上述參數(shù)更改前后的狀態(tài):
因此,我們可以立即將這種差異歸咎于積分項(或“I項”)。只有當(dāng)參數(shù)發(fā)生變化時,它才會發(fā)生劇烈的變化。為什么會這樣?這與初學(xué)積分的人對積分的理解有關(guān):
這種解釋在 Ki 被改變之前都是可以正常工作的。然后,你突然把這個新的 Ki 乘以你積累的整個誤差總和。這不是我們想要的!我們只想影響事情后續(xù)的發(fā)展。
2、解決方案
有幾種方法可以處理這個問題。我在上一個庫中使用的方法是重新縮放偏差累計。Ki 翻了一倍?或者把偏差累計削減一半。這可以避免積分項撞擊,并且也能工作的很好。不過,這有點笨拙,我想出了更優(yōu)雅的東西。(我不可能是第一個想到這個問題,但我確實是一個人想到的。這算數(shù)!)
這個方案需要一個小的基本代數(shù) (還是微積分?)
我們不是讓 Ki 處在積分之外,而是把它帶到里面。看起來我們視乎什么都沒做,但我們會看到,在實踐中,這帶來了很大的變化。
現(xiàn)在,我們把誤差乘以那個時候的Ki。然后我們存儲它的和。當(dāng)Ki發(fā)生變化時,沒有任何變化,因為所有舊的Ki都已經(jīng)“存在銀行”了。我們得到一個平穩(wěn)的轉(zhuǎn)換,沒有額外的數(shù)學(xué)運(yùn)算。這可能會讓我成為一個極客,但我覺得這很性感。
3、代碼
/*working variables*/ unsigned long lastTime; double Input,Output,Setpoint; double ITerm,lastInput; double kp,ki,kd; int SampleTime = 1000;//1 sec void Compute() {unsigned long now = millis();int timeChange = (now - lastTime);if(timeChange>=SampleTime){/*Compute all the working error variables*/double error = Setpoint - Input;ITerm += (ki * error);double dInput = (Input - lastInput);/*Compute PID Output*/Output = kp * error + ITerm - kd * dInput;/*Remember some variables for next time*/lastInput = Input;lastTime = now;} }void SetTunings(double Kp,double Ki,double Kd) {double SampleTimeInSec = ((double)SampleTime)/1000;kp = Kp;ki = Ki * SampleTimeInSec;kd = Kd / SampleTimeInSec; }void SetSampleTime(int NewSampleTime) {if (NewSampleTime > 0){double ratio = (double)NewSampleTime/ (double)SampleTime;ki *= ratio;kd /= ratio;SampleTime = (unsigned long)NewSampleTime;} }因此,我們用復(fù)合積分項變量替換了 [第4行]偏差求和變量。它計算 Ki * 偏差,而不僅僅是偏差 [第15行]。此外,由于 Ki 現(xiàn)在被隱藏在積分項中,因此它將從主 PID 計算 [第19行] 中刪除。
4、結(jié)果
那么,這是如何解決問題的。在修改Ki之前,它重新計算了所有偏差的總和;我們看到的每一個偏差值。有了這段代碼,之前的偏差將保持不變,而新的Ki只會影響事情的進(jìn)展,這正是我們想要的。
譯注:對于本篇討論的修改整定參數(shù)對積分項的影響問題。采用位置式PID公式確實存在這一問題,作者的解決方式也很贊。因為這就是增量式PID積分項的默認(rèn)處理方式。所以如果采用增量式PID就不會存在這個問題了。
歡迎關(guān)注:
總結(jié)
以上是生活随笔為你收集整理的改进初学者的PID-修改整定参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蝗虫算法java代码_蝗虫搜索算法 蝗虫
- 下一篇: 基于STM32和W5500的Modbus