日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

改进初学者的PID-手自动切换

發布時間:2024/7/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 改进初学者的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-手自动切换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。