手把手教你看懂並理解Arduino PID控制庫——調參改變

引子

本文將分析《手把手教你看懂並理解Arduino PID控制庫》中第三個問題:PID控制參數突變對系統的影響。算法

問題定義

在PID控制實際的應用過程當中,可能會存在須要忽然改變PID調諧參數Kp、Ki、Kd的情形,那麼若是忽然改變調諧參數,會有什麼影響呢?首先先看一張圖:ui

若是在系統運行的過程當中,對調諧參數進行較大的改變,那麼Output會產生一個突變,有點略微像「坑」。下圖給出了一個改變PID參數對輸出影響的量化分析:spa

上述現象描述了在系統進入穩態後,忽然改變PID參數致使的變化,起主要引發輸出較大變化的因子爲I參數,因爲進入穩態P參數相乘因子E變化不大,D參數一樣不大,可是I參數相乘因子是關於時間的積分(能夠想象若是一開始被控量與設定值相距較遠,而積分表示的是帶方向的面積和,因此必然存在一個方向會有較大面積,見下圖),因此,會引發較大的變化。.net

解決方案

先看一組算式,又要感謝偉大的數學家了。code

第一個等式在KI是常數的時候沒問題,不是常數的時候須要評估,儘管不徹底成立,但若是在穩態時E很是小,那麼,也是能夠接受。這彷佛和經典的PID等式不同。換個角度,經典的PID控制I項,也僅僅是爲了消除靜態偏差而肯定的,若是在這個大前提下,換一種方式消除靜態偏差也是能夠的,僅僅是犧牲了」力度」。blog

代碼

/*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;
   }
}

變量Iterm用於完成上述算法。get

結果

圖示數學

量化結果io

從圖表中能夠看出,儘管PID參數發生了較大的改變,但輸出仍然變得連續。在上述過程當中,犧牲了系統的響應的「靈敏度」增長了控制的穩定性,系統的靈敏度每每能夠經過增長計算頻率來改善,大幅提升採樣頻率能夠起到較快的更新積分項的做用。ast

目前這種作法在溫度控制中,有較好的控制效果。

NOTE:若有不足之處請告知。^.^

下一章將介紹若是在系統運行過程當中,設定值忽然改變對系統的影響

NEXT

PS:轉載請註明出處:歐陽天華

相關文章
相關標籤/搜索