這個是pid公式:
u(k+1) = u(k) + ( kp*e(k) - ki*e(k-1) + kd*e(k-2) )
對你的系統而言,u(k)就是當前占空比。我這裡先假定你的占空比對應定時器暫存器設定範圍是 0-65535.同時假定定時器設定為0的時候,
占空比輸出為0%,全部是低電平,完全不加熱。65535的時候,占空比輸出100%,全速加熱。
e(k)是當前溫度和設定溫度的誤差值
e(k-1)是上次計算時的誤差值
e(k-2)是上上次計算時的誤差值
由於kp,ki,kd三個係數現在都不知道。需要整定,有自動整定,也有手動整定。我們先採取手動整定的方案。
我們現在可以知道溫度相差40℃,顯然,需要比較快速的加熱。水溫在正常系統使用的時候,顯然是0-100℃的。
而你們這裡需要目標溫度是 30-60℃,故最大加熱的差值可以認為是 60-0 = 60。(假定不是冰,是水開始加熱)。
我們可以認為,在需要最大加熱差值的時候,僅用比例控制應當是開啟全速加熱。所以我們可以得到乙個kp的估計值。
kp = 65535/60 = 1000左右。 這個意思是最大溫差對應最快加熱速度。
然後,假設 ki = 800,kd = 300;
注意,係數需要根據實際情況來整定,此為假設。
好,現在假定設定需要溫度是 60℃,而當前溫度是 20℃。那麼可以知道
第一次u(k) = 0 ---最開始是沒有占空比輸出的。所以是占空比是0
e(k) = 60-20 = 40 ---第一次的誤差
e(k-1) = 0 ---還沒有上次,所以初始化為0
e(k-2) = 0 ---還沒有上上次,所以初始化為0
由於kp假定是1000,所以
u(k+1) = 40*1000 = 40000
所以,現在就可以按照占空比 40000來加熱了。
由於熱系統是乙個緩慢變化的系統,所以,加熱需要一段時間才可以看到效果,假設採用固定間隔時間來設計。這裡取5秒。
5秒過後,假定溫度上公升了5℃,當前溫度為25℃。
則計算第二次占空比過程。
第二次u(k) = 40000
e(k) = 60-25 = 35
e(k-1) = 40
e(k-2) = 0
u(k+1) = 40000 + 35*1000 - 40*800 + 0 = 43000 (加熱加速了)
又過了5秒,假定溫度上公升了6℃。當前溫度為29℃
第三次u(k) = 43000
e(k) = 60-31 = 29
e(k-1) = 35
e(k-2) = 40
u(k+1) = 43000 + 29*1000 - 35*800 + 40*300 = 56000 (2個週期以後還未達到指定溫度,加熱繼續加速)
繼續計算第四次,第五次,第n次即可。
顯然,要一直到出現超調,才會出現加熱速度放慢甚至不加熱。
若不允許超調,則需要增加一些門限控制。那就不在標準的pid討論範圍以內了。
以上是演算法部分。
以下來討論整定部分。
看係數是否合理,需要通過實驗觀察。
關於係數的整定,有一些工程的方法。你可以對自己的系統來摸索摸索。
整定的時候,先用整定比例係數。先不給積分,微分係數賦值,然後看加熱速度有多快。這個快慢就主要看的是幾個整定週期達到目標溫度。
先不考慮超調的問題。
所以,你需要先對整個系統做實驗,先看全速加熱需要多久才可以把溫度由 0℃ 加熱到 60℃。
全速加熱把溫度從0℃加熱到60℃所需要的時間設定為t,那麼我們的整定週期就可以根據t來設定了。假設整定週期為 t/10。
(事實上,整定週期還可以根據偏差值來做動態調整,顯然溫度越接近目標值,整定週期就需要越短,非標pid不在繼續深入,僅僅做乙個簡單提示)
然後以此來設定不同的kp比例係數,看kp設定為多少,可以接近 10個整定週期達到同等加熱速度,這樣得到的kp就是乙個比較合理的kp了。
然後再來看ki的整定,看ki設定成多少,可以讓超調大約在根號2左右,也就是說最大只有超調41%,這樣得到的ki就是比較合理的。
當然,如果系統溫度不允許超調41%,那就需要修改ki來實現了。
最後來整定kd,看kd設定成多少,可以讓最終穩定溫度和設定溫度的偏差達到要求,比如偏差在 0.5℃以內。
這個就看你的需求了。
故,你的**需要記錄整定的時候,pid演算法執行的次數,以及每次整定的時候所得到的溫度偏差。通過串列埠傳送出來做記錄。
根據這些記錄來選取合適的 kp,ki,kd。
以上介紹了關於pid演算法和整定的方案。總的思路應該是比較清晰的,實際應用的時候,需要根據自己的需求多做做修改。
4樓的公式u(k+1) = u(k) + ( kp*e(k) - ki*e(k-1) + kd*e(k-2) )有點問題,pid公式是u(k) = u(k-1) +整理一下是u(k) = u(k-1)+ae(k)-be(k-1)+ce(k-2),其中,a=kp+ki+kd ,b=kp+2kd,c=kd;大家發現和4樓的公式差不多,有木有。調整a,b,c值也就是調整kp,ki,kd值,但還是不要混為一談,畢竟kp,ki,kd通常都是分別代表比例項,積分項,微分項係數。後面整定的思路是根據kp,ki,kd的意義來整定的,而不是a,b,c,這也是不要混淆的原因。
我把pid的公式稍微解釋一下:
時域標準的pid公式為:
y(t) = kp * e(t) + ki * ∫(e(t))dt + kd*d(e(t))/dt
把上面的標準公式轉換為數字形式是,一般有兩種主要形式
(1) 獨立積分式,這種方法把積分器獨立出來,
i(t) = ki * ∫(e(t))dt
轉換為:
i(k) = i(k-1) + e(k)
最後把比例,積分,微分三個部分疊加在一起
y(k) = kp * e(k) + ki * i(k) + kd*(e(k) –e(k-1))
(2) 增量式:
對標準的pid公式微分後,可得:
dy = kp * de + ki*e + kd*dde
離散化後得:
dy(k) = y(k) – y(k-1) = kp * (e(k) – e(k-1) +ki*e(k) + kd* (e(k) -2*e(k-1) +e(k-2))
即: dy(k) = y(k) – y(k-1)= (kp + ki + kd) * e(k) +(-kp -2*kd)*e(k-1) + kd*e(k-2)
獨立積分式與增量式其實是乙個公式,各自表述,沒有本質的區別,我們可以從獨立積分式匯出增量式:
y(k) = kp * e(k) + ki * i(k) + kd*(e(k) –e(k-1))
y(k-1) = kp * e(k-1) + ki * i(k-1) + kd*(e(k-1) –e(k-2))
上述兩個公式相減可得:
dy(k) = y(k) – y(k-1) = (kp + ki + kd) * e(k) +(-kp -2*kd)*e(k-1) + kd*e(k-2)
從實際應用角度來看,獨立積分式略微更簡單些,因為沒有e(k-2)項。
PID演算法的電加熱爐溫度控制系統設計
來自 李洪任 引言電加熱爐是典型工業過程控制物件,其溫度控制具有公升溫單向性,大慣性,純滯後,時變性等特點,很難用數學方法建立精確的模型和確定引數。而pid控制因其成熟,容易實現,並具有可消除穩態誤差的優點,在大多數情況下可以滿足系統效能要求,但其效能取決於引數的整定情況。且快速性和超調量之間存在矛...
基於pid演算法直流電機系統設計與實現開題報告
開題報告 1.課題名稱 基於pid演算法直流電機系統設計與實現 2.總述 常用的控制電力系統直流電機有以下幾種 第一,最初的直流調速系統是採用恆定的直流電壓向電力系統直流電機電樞供電,通過改變電樞迴路中的電阻來實現調速。這種方法簡單易行裝置製造方便,低廉。但缺點是效率低 機械特性軟 不能在較寬範圍內...
PID控制方法在溫控系統中的應用
pid控制是迄今為止應用最為廣泛的一種控制演算法,其優點是原理簡單,通用性強並且使用方便,應用pid控制的關鍵技術是pid引數的設定和整定市控制系統得到滿意的品質,常用的引數整定方法有 衰減曲線法 臨界振盪法等。然而pid控制在純滯後系統中的應用有一定的侷限,對於時滯較大的系統,常規pid控制效果並...