改进初学者的PID-手自动切换
最近看到了Brett Beauregard發表的有關PID的系列文章,感覺對于理解PID算法很有幫助,于是將系列文章翻譯過來!在自我提高的過程中,也希望對同道中人有所幫助。作者Brett Beauregard的原文網址:http://brettbeauregard.com/blog/2011/04/improving-the-beginner’s-pid-onoff/
?
1、問題所在
有一個 PID 控制器雖然是很好的,但你并不是什么時候都需要它。
假設在程序中的某個時刻,您希望將輸出強制為某個值 (例如 0),您當然可以在調用例程中執行此操作:
void loop() {Compute();Output=0; }這樣,無論 PID 輸出是什么,您只需覆蓋其值。然而,這在實踐中是一個可怕的想法。PID 會變得非?;靵y:“我一直發送輸出,但是什么都沒有發生!到底發生了什么事? !我再發送一下。”因此,當您停止覆蓋輸出并切換回 PID 時,您可能會立即得到一個巨大的輸出值改變。
2、解決方案
解決這個問題的辦法是有辦法關閉和打開 PID。這些狀態的常用術語是 "手動" (我將手動調整輸出值) 和 "自動" (PID 將自動調整輸出)。讓我們看看這是如何在代碼中完成的。
3、代碼
/*working variables*/ unsigned long lastTime; double Input,Output,Setpoint; double ITerm,lastInput; double kp,ki,kd; int SampleTime = 1000; //1 sec double outMin,outMax; bool inAuto = false; #define MANUAL 0 #define AUTOMATIC 1 void Compute() {if(!inAuto) return;unsigned long now = millis();int timeChange = (now - lastTime);if(timeChange>=SampleTime){/*Compute all the working error variables*/double error = Setpoint - Input;ITerm+= (ki * error);if(ITerm> outMax) ITerm= outMax;else if(ITerm< outMin) ITerm= outMin;double dInput = (Input - lastInput);/*Compute PID Output*/Output = kp * error + ITerm- kd * dInput;if(Output > outMax) Output = outMax;else if(Output < outMin) Output = outMin;/*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;} } void SetOutputLimits(double Min,double Max) {if(Min > Max) return;outMin = Min;outMax = Max;if(Output > outMax) Output = outMax;else if(Output < outMin) Output = outMin;if(ITerm> outMax) ITerm= outMax;else if(ITerm< outMin) ITerm= outMin; } void SetMode(int Mode) {inAuto = (Mode == AUTOMATIC); }一個相當簡單的解決方案。如果您不在自動模式下,請立即離開計算函數,而不調整 "輸出" 或任何內部變量。
4、最終結果
的確,您可以通過不象例程那樣調用計算來實現類似的效果,但此解決方案保持PID所包含的工作原理,這是我們所需要的。通過保持事物的內部過程,我們可以跟蹤處于哪種模式中,更重要的是,當我們改變模式時,它讓我們知道有哪些工作需要進行。這就引出了下一期.....。
歡迎關注:
總結
以上是生活随笔為你收集整理的改进初学者的PID-手自动切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一文带你读懂base64编码
- 下一篇: STM32F0使用LL库实现PWM输出