大家好,我是ST。
在講解PID算法之前,在此拋出一個問題,如何通過算法控制加熱器使水溫穩(wěn)定在50攝氏度?
一、傳統(tǒng)的位式控制算法(非PID算法)
(1)算法邏輯:用戶設(shè)置目標(biāo)溫度Sv為50,傳感器檢測控制對象即水的溫度Pv
①當(dāng)Pv ②當(dāng)Pv==SV時,表示實(shí)際溫度等于目標(biāo)溫度,不輸出
③當(dāng)Pv>Sv時,表示實(shí)際溫度高于目標(biāo)溫度,輸出低電平OUT=L,讓執(zhí)行元件即加熱器不工作,即0功率輸出
(2)代碼實(shí)現(xiàn):
#define Sv 50 void func(unsigned int Pv) { if(Pv
(1)缺點(diǎn)
①控制算法過于簡單,單純對設(shè)定值和輸出值進(jìn)行比較,一旦發(fā)現(xiàn)低于設(shè)定值,就輸出高,否則就輸出低
②要么處于全功率下,要么處于0功率下工作
③會導(dǎo)致溫度總是在設(shè)定值上下波動如下圖所示,因?yàn)榭刂茖ο缶哂幸欢ǖ膽T性,即加熱時水的溫度不會立即上升,不加熱時水的溫度不會立即下降
二、PID閉環(huán)控制
PID閉環(huán)即比例-積分-微分控制,即通過對偏差進(jìn)行比例-積分-微分控制,使得當(dāng)前值趨于目標(biāo)值的過程。一般來說,比例P控制是必須的,所以衍生出很多組合的PID控制,如PD、PI、PID。離散PID公示為:
其中,e(k):為k時刻的偏差,u(k):為輸出的控制量(對于加熱器來說是PWM)
(1)比例控制(P)
Sv為用戶設(shè)置目標(biāo)值,Pv為控制對象即水的當(dāng)前溫度值
Ek為目標(biāo)溫度與當(dāng)前溫度的偏差:Ek=Sv-Pv
①當(dāng)Ek<0時,表示當(dāng)前溫度未達(dá)標(biāo)
②當(dāng)Ek==0時,表示當(dāng)前溫度正好達(dá)標(biāo)
③當(dāng)Ek>0時,表示當(dāng)前溫度已超標(biāo)
比例控制算法公式:PWM=Kp*Ek
Kp參數(shù)的解釋:Kp可以理解為一個衰減器或者放大器,主要是用來調(diào)整偏差值,調(diào)整其增益或者說是放大倍數(shù)
比例控制的作用:
調(diào)節(jié)到達(dá)目標(biāo)值的時間,增大Kp會增加相應(yīng)速度,但可能會造成超調(diào),有靜態(tài)誤差
(2)積分控制(I)
Ek為歷史上某一時刻的偏差,Sk為歷史偏差之和:Sk=E1+E2+E3+...+EN ①當(dāng)Sk<0時,表示歷史上大部分時間溫度未達(dá)標(biāo)(現(xiàn)在是否達(dá)標(biāo)不知道) ②當(dāng)Sk==0時,表示歷史上溫度總體上是好的(現(xiàn)在溫度是否達(dá)標(biāo)不管) ③當(dāng)Sk>0時,表示歷史上大部分時間溫度超標(biāo)(現(xiàn)在溫度是否超標(biāo)不知道)
積分控制公式:
PWM=Ki*Sk Ki參數(shù)的解釋:Ki可以理解為一個衰減器或者放大器,主要是用來調(diào)整Sk,調(diào)整其增益或者說是放大倍數(shù)
比例控制的作用:
如果我們把加熱器放到一個非常冷的地方對水進(jìn)行加熱,加熱目標(biāo)值是50攝氏度在比例控制下,水溫度慢慢升高,直到升高到45攝氏度,發(fā)現(xiàn)天氣太冷,水散熱的速度正好等于比例控制下的加熱速度。所以水溫永遠(yuǎn)停留在45攝氏度,永遠(yuǎn)到不了50攝氏度。如果加上積分控制,只要沒有達(dá)到50攝氏度,就會存在偏差,這時候?qū)ζ畈粩喾e分(累加),輸出的PWM就會增大,即增大的加熱器的功率,使水溫能達(dá)到50攝氏度。所以比例控制的作用是,減少靜態(tài)情況下的誤差,但容易造成震蕩
(3)微分控制(D)
E(k)為當(dāng)前偏差值,E(k-1)為上一次偏差值 Dk為最近兩次偏差相減,表示最近兩個時間點(diǎn)偏差的變化:Dk=E(k)-E(k-1) ①當(dāng)Dk<0時,表示偏差有增大的趨勢 ②當(dāng)Dk==0時,表示偏差穩(wěn)定,輸出為0 ③當(dāng)Dk>0時,表示偏差有減小的趨勢
微分控制公式:
PWM=Kd*Dk Kd參數(shù)的解釋:Kd可以理解為一個衰減器或者放大器,主要是用來調(diào)整Dk,調(diào)整其增益或者說是放大倍數(shù)
微分控制的作用:
只要物理量存在變化,微分控制就會起作用,讓物理量的變化速度趨于0,增大Kd參數(shù)能夠抑制震蕩,盡快穩(wěn)定,但有可能造成調(diào)節(jié)周期過長
(4)PID算法控制代碼實(shí)現(xiàn)
int PID(int Sv,int Pv) { /* Sv:用戶設(shè)定的目標(biāo)值 ** Pv:傳感器檢測到的當(dāng)前值 ** Ek:目標(biāo)值與當(dāng)前值的偏差值 ** last_Ek:上一次的Ek值 ** Sk:偏差值Ek的積分值 ** PWM:輸出的PWM值 */ static int Ek,last_Ek,Sk; static float PWM; Ek=Sv-Pv; Sk+=Ek; /*積分限幅,Sk_max和Sk_min根據(jù)情況自己給定*/ if(Sk>Sk_max) Sk=Sk_max; if(SkPWM_max) PWM=PWM_max; if(PWM
當(dāng)Ek、Ki和Kp參數(shù)參數(shù)調(diào)節(jié)的比較好時,溫度能及時達(dá)到目標(biāo)溫度并且很平穩(wěn)如圖所示:
三、PID控制參數(shù)整定的方法
PID控制的調(diào)節(jié)經(jīng)驗(yàn)可以總結(jié)為:先只使用 P 控制,增大 P 系數(shù)直到系統(tǒng)振蕩,然后加入微分控制增大阻尼,消除振蕩之后再根據(jù)系統(tǒng)對響應(yīng)和靜差等具體要求,調(diào)節(jié) P 和 I 參數(shù)。
例子:我們需要調(diào)節(jié)目標(biāo)值為 10390,當(dāng)前值為 10000
①先設(shè)置Kd和Ki的參數(shù)值為0,然后把Kp參數(shù)從0逐漸增大,直到出現(xiàn)震蕩
當(dāng)Kp=62,Ki=0,Kd=0時,響應(yīng)曲線如下:
②保持Kp=62,Ki=0不變,Kd從0逐漸增大,當(dāng)Kd=188時,響應(yīng)曲線如下:
當(dāng)加入微分控制的時候,可以看到,系統(tǒng)的振蕩得到了抑制,但是系統(tǒng)的響應(yīng)變慢了。因?yàn)槲⒎挚刂葡喈?dāng)于一個阻尼力,引入微分控制相當(dāng)于增大系統(tǒng)的阻尼。這個時候需要結(jié)合 KP 和 KI 進(jìn)行進(jìn)一步的優(yōu)化。在實(shí)際生產(chǎn)中,需要對不同項(xiàng)目進(jìn)行評估,比如一個系統(tǒng)對快速性要求不高,但對穩(wěn)定性和準(zhǔn)確性的要求很高,那么就需要嚴(yán)格控制超調(diào)量和靜差。
總結(jié):PID控制算法是經(jīng)典控制方法中,現(xiàn)實(shí)生活中使用非常廣泛,掌握其中的原理非常重要。
審核編輯:湯梓紅
-
PID
+關(guān)注
關(guān)注
35文章
1473瀏覽量
85700 -
控制算法
+關(guān)注
關(guān)注
4文章
166瀏覽量
21757
原文標(biāo)題:PID控制算法基本原理
文章出處:【微信號:嵌入式開發(fā)愛好者,微信公眾號:嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論