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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

改进初学者的PID-正反作用

發布時間:2024/7/23 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 改进初学者的PID-正反作用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近看到了Brett Beauregard發表的有關PID的系列文章,感覺對于理解PID算法很有幫助,于是將系列文章翻譯過來!在自我提高的過程中,也希望對同道中人有所幫助。作者Brett Beauregard的原文網址:http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-direction/

?

1、問題所在

將PID連接過程分為兩組:直接作用和反向作用。到目前為止,我所展示的所有例子都是直接行動。也就是說,輸出的增加會導致輸入的增加。對于反向作用過程,情況正好相反。例如,在冰箱中,冷卻水的增加會導致溫度下降。要使初學者 PID 使用反向過程,kp、ki 和 kp 的符號都必須為負數。

這本身不是問題,但用戶必須選擇正確的符號,并確保所有參數都具有相同的符號。

2、解決方案

為了讓這個過程簡單一點,我要求 kp、ki 和 kp 都是大于等于0的。如果用戶連接到反向進程,則使用SetControllerDirection函數指定反向進程。這可以確保所有參數都具有相同的符號,并使事情操作起來更直觀。

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#define DIRECT 0 #define REVERSE 1 int controllerDirection = DIRECT;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) {if (Kp<0 || Ki<0|| Kd<0) return;double SampleTimeInSec = ((double)SampleTime)/1000;kp = Kp;ki = Ki * SampleTimeInSec;kd = Kd / SampleTimeInSec;if(controllerDirection ==REVERSE){kp = (0 - kp);ki = (0 - ki);kd = (0 - kd);} }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) {bool newAuto = (Mode == AUTOMATIC);if(newAuto == !inAuto){ /*we just went from manual to auto*/Initialize();}inAuto = newAuto; }void Initialize() {lastInput = Input;ITerm = Output;if(ITerm > outMax) ITerm= outMax;else if(ITerm < outMin) ITerm= outMin; }void SetControllerDirection(int Direction) {controllerDirection = Direction; }

4PID 完成

差不多結束了。我們已經把“初學者的PID”變成了我目前知道的最健壯的控制器。對于那些正在尋找PID庫的詳細解釋的讀者,我希望您得到了您想要的。對于那些正在編寫自己的PID的人,我希望您能夠收集到一些想法,這些想法可以為您節省一些時間。

最后說明兩點:

  • 如果這個系列中的東西看起來不對,請告訴我。我可能錯過了什么,或者可能只需要在我的解釋中更清楚。無論哪種方式,我都想知道。
  • 這只是一個基本的PID。為了簡單起見,我有意省略了許多其他問題。在我的腦海中:前饋,重置平鋪,整數數學,不同的PID形式,使用速度而不是位置。如果有興趣讓我探討這些話題,請讓我知道。
  • 歡迎關注:

    總結

    以上是生活随笔為你收集整理的改进初学者的PID-正反作用的全部內容,希望文章能夠幫你解決所遇到的問題。

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