上一節(jié)我們知道了什么是位式控制,這節(jié)就正式進(jìn)入PID的學(xué)習(xí)。 簡單畫了一個系統(tǒng)的控制流程圖: 
系統(tǒng)說明:
假設(shè)該系統(tǒng)是一個溫控系統(tǒng),用戶可設(shè)定目標(biāo)值Sv,單片機(jī)檢測了用戶輸入的值之后,通過PID算法進(jìn)行計算,得出一個值去輸出PWM,PWM去控制加熱絲的電源,加熱絲就是被控對象。加熱絲旁邊有個溫度傳感器,可以實時監(jiān)測加熱絲的溫度,并反饋給單片機(jī)一個當(dāng)前的溫度值Pv。之后單片機(jī)將Sv和Pv進(jìn)行PID運(yùn)算,根據(jù)計算結(jié)果再次改變PWM的值,就這樣以此循環(huán)下去。
第一個時間點采樣值為X1,第二個時間點采樣值為X2,以此類推第k-1個采樣點采樣值為Xk-1,第k個采樣點采樣值為Xk。那么將從第一個時間點采樣的值到第k個采樣值排成一個序列如下:
X1 、 X2 、 X3 、、、 Xk-2 、 Xk-1 、Xk P 比例P,大家都知道是比例運(yùn)算。比例運(yùn)算是根據(jù)當(dāng)前傳感器采集的值Pv和用戶設(shè)定的目標(biāo)值Sv進(jìn)行比較之后,做一個比例輸出,假設(shè)當(dāng)前誤差Ek = Sv - Xk,那么在單獨(dú)使用P運(yùn)算時,會輸出:
07.png (897 Bytes, 下載次數(shù): 40)
下載附件
2021-9-28 13:55 上傳
這就會產(chǎn)生三種運(yùn)算結(jié)果:
1.
當(dāng)Ek > 0; => 系統(tǒng)沒有達(dá)到目標(biāo)值 => 差值為正,當(dāng)差值較大時,也就是當(dāng)前測量值和目標(biāo)值相差甚遠(yuǎn)的時候,這就會使得OUTp的值變大,OUTp的值是控制PWM的占空比的。OUTp的值越大,占空比越大,平均電壓值越高,加熱絲加熱越快,使得當(dāng)前值以最快的速度接近目標(biāo)值,當(dāng)差值較小時則相反;
2.
當(dāng)Ek = 0; => 系統(tǒng)已經(jīng)達(dá)到目標(biāo)值 => 差值為0,也就是當(dāng)前測量值和目標(biāo)值相差為0的時候,這就會使得OUTp的值為0,OUTp的值是控制PWM的占空比的。OUTp的值為0,占空比為0,平均電壓值越也就為0,加熱絲不在進(jìn)行加熱,此時加熱絲已經(jīng)不受控制,不受控制就容易受外界影響而改變溫度;
3.
當(dāng)Ek < 0; => 系統(tǒng)超過目標(biāo)值 => 差值為負(fù),也就是當(dāng)前測量值已經(jīng)超過目標(biāo)值,PWM不可能輸出負(fù)的,因此只能不在輸出PWM,加熱絲也會處于不受控的狀態(tài)。 從運(yùn)算結(jié)果可得出以下幾個結(jié)論:
1.只有當(dāng)系統(tǒng)存在誤差了,我才控制你,如果沒有誤差我就不控制了,也就是說單獨(dú)的P運(yùn)算是個一直有誤差的運(yùn)算,也就是靜態(tài)誤差
2.當(dāng)前值和目標(biāo)值相差越大,我輸出就越大,相差越小,我輸出就小,也就是說P可以加快被控對象達(dá)到目標(biāo)設(shè)定值
3.P運(yùn)算只和當(dāng)前值作比較,也就說P控制的是當(dāng)前的狀態(tài) 以上就是P的特點。 優(yōu)化:
在沒有誤差的情況下為了還能控制被控對象,往往會在后面加一個常量OUT0:
f8d43f90334b90894efd6efb46be18f6.png (1.24 KB, 下載次數(shù): 41)
下載附件
2021-9-28 13:58 上傳
也就是說當(dāng)沒有誤差時,K*Ek=0,但我最后的輸出OUTp = OUT0,還能控制被控對象,但是OUT0該設(shè)置多少就要看實際情況了,只能說有改善,但是很雞肋。如果環(huán)境變化很大,OUT0形同虛設(shè)。 I 積分將每個采樣時間點的值和目標(biāo)設(shè)定值做一個差值,就能得出每次采樣的誤差值。第一個采樣時間點的差值E1 = Sv - X1,第二個時間點的差值E2 = Sv - X2,以此循環(huán),第k-1個時間點的差值Ek-1 = Sv - Xk-1,第k個時間點的差值Ek = Sv - Xk,排成序列如下: E1 、 E2 、 E3 、、、 Ek-2 、 Ek-1 、Ek 那么我們來看看將這些歷史誤差加到一起會有什么結(jié)論 Sk = E1 + E2 + E3 +++ Ek-2 + Ek-1 + Ek Sk的值也會產(chǎn)生三種運(yùn)算結(jié)果:
1.
當(dāng)Sk > 0; => 所有正數(shù)的和的絕對值比所有負(fù)數(shù)的和的絕對值要大 => 從E1到Ek這么多數(shù)中,為正的個數(shù)多于為負(fù)的個數(shù) => 也就是說在歷史采樣k次中,大多數(shù)是采樣到系統(tǒng)沒有達(dá)到目標(biāo)值的。因為Ek >
0說明Sv > Xk , 說明系統(tǒng)沒有達(dá)到目標(biāo)值
2.
當(dāng)Sk = 0; => 所有正數(shù)的和的絕對值等于所有負(fù)數(shù)的和的絕對值 => 從E1到Ek這么多數(shù)中,為正的個數(shù)等于為負(fù)的個數(shù) => 也就是說在歷史采樣k次中,剛好沒有達(dá)到目標(biāo)值的次數(shù)和達(dá)到目標(biāo)值的次數(shù)相等
3.
當(dāng)Sk < 0; => 所有正數(shù)的和的絕對值比所有負(fù)數(shù)的和的絕對值要小 => 從E1到Ek這么多數(shù)中,為正的個數(shù)少于為負(fù)的個數(shù) => 也就是說在歷史采樣k次中,大多數(shù)是采樣到系統(tǒng)都達(dá)到目標(biāo)值的。因為Ek <
0說明Sv < Xk , 說明系統(tǒng)達(dá)到目標(biāo)值 現(xiàn)在我們想讓這個Sk單獨(dú)加到我們的運(yùn)算當(dāng)中,并且做一定的放大,這里說的是放大,其實是根據(jù)系數(shù)大不大于1而定的。那么我們可以得出一個公式:
09.png (1.1 KB, 下載次數(shù): 31)
下載附件
2021-9-28 14:01 上傳
那么我們來想想,I運(yùn)算會不會有不受控的時候。答案是肯定有的。當(dāng)Sk等于0時,系統(tǒng)是不受控制的,也就說在K次的采樣結(jié)果中,達(dá)到設(shè)定目標(biāo)的次數(shù)等于沒有達(dá)到目標(biāo)的次數(shù)時,系統(tǒng)是不受控制的。 從運(yùn)算結(jié)果可得出以下幾個結(jié)論: 1.只有當(dāng)系統(tǒng)存在歷史誤差了,注意是歷史誤差,我才控制你,如果沒有歷史誤差我就不控制了,也就是說單獨(dú)的I運(yùn)算也是一個有誤差的運(yùn)算
2.I運(yùn)算參考的是歷史數(shù)據(jù),是對系統(tǒng)歷史狀態(tài)做出一個整體評估,當(dāng)歷史狀態(tài)大多數(shù)都沒達(dá)到設(shè)定值時我就輸出一個大一點的信號,讓系統(tǒng)在之后的運(yùn)行中打到目標(biāo)值,當(dāng)歷史狀態(tài)大多數(shù)都達(dá)到設(shè)定值的時候則相反。 以上就是I的特點,和P有點類似只不過一個是將當(dāng)前值作為參考,一個是將過去值最為參考。 優(yōu)化:
在沒有歷史誤差的情況下為了還能控制被控對象,往往會在后面加一個常量OUT0,雖然用處不大:
11.png (1.24 KB, 下載次數(shù): 32)
下載附件
2021-9-28 14:02 上傳
D 微分我們將積分中在k次采樣的誤差值Ek和k-1次采樣的誤差值Ek-1做差值會得到什么結(jié)論呢?
10.png (1.14 KB, 下載次數(shù): 51)
下載附件
2021-9-28 14:02 上傳
首先我們要理解Dk的含義: Dk是這次采樣的誤差和上次采樣的誤差的差值,假如采樣時間很小,我們是不是可以把Dk看做是誤差的斜率,也就是Dk的值反映了單位時間內(nèi)誤差的變化快慢。Dk越大,說明誤差變化率越大,Dk越小,則誤差的變化率越小。 再舉個例子:
S = VT ( 路程=速度*時間) 我們又知道路程的倒數(shù)是速度,導(dǎo)數(shù)可以理解為變化率,也就是變化的快慢。在一段時間內(nèi)走了一段路,那么在任意時刻路程的導(dǎo)數(shù)就表示該單位時間內(nèi)走過的路程,也就是速度了。 再看看上面說的Dk,假設(shè)采樣時間很短,Dk是不是就可以理解為在單位時間內(nèi)誤差從Ek-1變成了Ek,相當(dāng)于路程在單位時間內(nèi)從S1變成了S2,那么S2-S1是單位時間內(nèi)走的路程,在對單位時間求導(dǎo)是不是就是速度了,Ek- Ek-1是單位時間內(nèi)誤差的變化值,在對單位時間求導(dǎo)是不是就是誤差的變化率了。 在理解了Dk的含義之后我們就可以運(yùn)用I運(yùn)算了,同樣的給D一個比例,放大一定倍數(shù)進(jìn)行輸出:
1d6b46a1652edeea80758f79364b2734.png (1.14 KB, 下載次數(shù): 28)
下載附件
2021-9-28 14:04 上傳
由于OUTd和Dk只是倍數(shù)關(guān)系,因此只看Dk的變化就能知道OUTd的變化,:
1.
當(dāng)Dk > 0; => 這次的誤差值比上一次的誤差值大 => 說明本次相比上次更加遠(yuǎn)離目標(biāo)值了 => 偏差越來越大
2.
當(dāng)Dk = 0; => 這次的誤差值等于上一次的誤差值 => 說明本次相比上次誤差沒有變化 => 偏差不變
3.
當(dāng)Dk < 0; => 這次的誤差值小于上一次的誤差值 => 說明本次相比上次更加接近目標(biāo)值了 => 偏差越來越小 由于變化率本身反映的就是一種趨勢,什么是趨勢?趨勢就是根據(jù)當(dāng)前的環(huán)境去預(yù)測以后會發(fā)生的事情。因此D微分運(yùn)算最大的一個作用就是通過誤差的變化率去預(yù)判在下一個采樣時刻系統(tǒng)會有什么樣的變化,這樣就能提前做出相應(yīng)的動作,而不是等待溫度達(dá)到目標(biāo)值再去關(guān)閉PWM 從運(yùn)算結(jié)果可得出以下幾個結(jié)論:
1.當(dāng)誤差的變化率為0時,系統(tǒng)會不受控制
2.不能單獨(dú)存在,為什么這樣說呢。因為微分是看誤差的變化率而不是誤差本身。
舉個例子,比如下圖,目標(biāo)值假設(shè)為100

4次采樣,每次采樣的偏差值都在變化,而偏差的變化率卻一直是2,也就是說Dk=2,微分有輸出。那么假設(shè)溫度就這樣很有規(guī)律的往上加呢,那是不是當(dāng)溫度到達(dá)了100度,微分還會有輸出,因為微分可不管你是多少度,只要Ek-Ek-1不等于0我就一直輸出。那如果沒有P和I的加入,只有微分是不是就會一直加熱。因此微分不能單獨(dú)存在。 3.還有一點很重要,就是微分輸出具有超前預(yù)判的功能
這一點也很好理解,剛才已經(jīng)說過Dk是誤差的變化率,變化率反映的是一種趨勢,那么當(dāng)Dk > 0時,Dk越大,OUTd就越大,也就是說Dk越遠(yuǎn)離目標(biāo)值,我輸出就越大,輸出越大加熱越快,加熱越快就會讓你越接近目標(biāo)值,也就是說你上一次里目標(biāo)越遠(yuǎn),我就在下一次輸出越大,讓你離目標(biāo)值越近,這就是D微分運(yùn)算的預(yù)判特點。 總結(jié)上面所講的都是在離散型的系統(tǒng)中才能實現(xiàn)的。就像我們的單片機(jī)定時采樣一樣,他不可能無時無刻的去采樣傳感器的值,只能定時去采樣,但如果這個采樣時間很短呢,是不是就可以無限接近連續(xù)型系統(tǒng)了。 P與當(dāng)前誤差有關(guān),當(dāng)前誤差大我就輸出大,誤差小輸出小,主要是根據(jù)系統(tǒng)當(dāng)前的狀態(tài)做出響應(yīng);I與系統(tǒng)的累積誤差有關(guān),系統(tǒng)過去的總體表現(xiàn)影響現(xiàn)在的輸出;D與系統(tǒng)上一時刻的誤差變化率有關(guān),根據(jù)上一時刻的變化率判斷系統(tǒng)下一個采樣時刻可能會發(fā)生的變化。 P可以提高系統(tǒng)響應(yīng)時間,I可以消除靜態(tài)誤差,D可以預(yù)判系統(tǒng)的變化。
|