本文將分析《手把手教你看懂並理解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:若有不足之處請告知。^.^
下一章將介紹若是在系統運行過程當中,設定值忽然改變對系統的影響
PS:轉載請註明出處:歐陽天華