溫度控制與PID算法
溫度控制與PID算法j較為復(fù)雜,下面結(jié)合實(shí)際淺顯易懂的闡述一下PID控制理論,將溫度控制及PID算法作一個(gè)簡(jiǎn)單的描述。
1.溫度控制的框圖
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg 這是一個(gè)典型的閉環(huán)控制系統(tǒng),用于控制加熱溫區(qū)的溫度(PV)保持在恒定的溫度設(shè)定值(SV)。系統(tǒng)通過(guò)溫度采集單元反饋回來(lái)的實(shí)時(shí)溫度信號(hào)(PV)獲取偏差值(EV),偏差值經(jīng)過(guò)PID調(diào)節(jié)器運(yùn)算輸出,控制發(fā)熱管的發(fā)熱功率,以克服偏差,促使偏差趨近于零。例如,當(dāng)某一時(shí)刻爐內(nèi)過(guò)PCB板較多,帶走的熱量較多時(shí),即導(dǎo)致溫區(qū)溫度下降,這時(shí),通過(guò)反饋的調(diào)節(jié)作用,將使溫度迅速回升。其調(diào)節(jié)過(guò)程如下:
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 溫度控制的功率輸出采用脈寬調(diào)制的方法。固態(tài)繼電器SSR的輸出端為脈寬可調(diào)的電壓UOUT 。 當(dāng)SSR的觸發(fā)角觸發(fā)時(shí),電源電壓UAN通過(guò)SSR的輸出端加到發(fā)熱管的兩端;當(dāng)SSR的觸發(fā)角沒(méi)有觸發(fā)信號(hào)時(shí),SSR關(guān)斷。因此,發(fā)熱管兩端的平均電壓為
Ud=(t/T)* UAN=K* UAN
其中K= t/T,為一個(gè)周期T中,SSR觸發(fā)導(dǎo)通的比率,稱為負(fù)載電壓系數(shù)或是占空比,K的變化率在0-1之間。一般是周期T固定不便,調(diào)節(jié)t, 當(dāng)t在0-T的范圍內(nèi)變化時(shí),發(fā)熱管的電壓即在0-UAN之間變化,這種調(diào)節(jié)方法稱為定頻調(diào)寬法。下面將要描述的PID調(diào)節(jié)器的算式在這里的實(shí)質(zhì)即是運(yùn)算求出一個(gè)實(shí)時(shí)變化的,能夠保證加熱溫區(qū)在外界干擾的情況下仍能保持溫度在一個(gè)較小的范圍內(nèi)變化的合理的負(fù)載電壓系數(shù)K。
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpg
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
2.溫度控制的兩個(gè)階段
溫度控制系統(tǒng)是一個(gè)慣性較大的系統(tǒng),也就是說(shuō),當(dāng)給溫區(qū)開(kāi)始加熱之后,并不能立即觀察得到溫區(qū)溫度的明顯上升;同樣的,當(dāng)關(guān)閉加熱之后,溫區(qū)的溫度仍然有一定程度的上升。另外,熱電偶對(duì)溫度的檢測(cè),與實(shí)際的溫區(qū)溫度相比較,也存在一定的滯后效應(yīng)。
這給溫度的控制帶來(lái)了困難。因此,如果在溫度檢測(cè)值(PV)到達(dá)設(shè)定值時(shí)才關(guān)斷輸出,可能因溫度的滯后效應(yīng)而長(zhǎng)時(shí)間超出設(shè)定值,需要較長(zhǎng)時(shí)間才能回到設(shè)定值;如果在溫度檢測(cè)值(PV)未到設(shè)定值時(shí)即關(guān)斷輸出,則可能因關(guān)斷較早而導(dǎo)致溫度難以達(dá)到設(shè)定值。為了合理地處理系統(tǒng)響應(yīng)速度(即加熱速度)與系統(tǒng)穩(wěn)定性之間地矛盾,我們把溫度控制分為兩個(gè)階段。
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image010.jpg
(1) PID調(diào)節(jié)前階段
在這個(gè)階段,因?yàn)闇貐^(qū)的溫度距離設(shè)定值還很遠(yuǎn),為了加快加熱速度,SSR與發(fā)熱管處于滿負(fù)荷輸出狀態(tài),只有當(dāng)溫度上升速度超過(guò)控制參數(shù)“加速速率”,SSR才關(guān)閉輸出。“加速速率”描述的是溫度在單位時(shí)間的跨度,反映的是溫度升降的快慢,如上圖所示。用“加速速率”限制溫升過(guò)快,是為了降低溫度進(jìn)入PID調(diào)節(jié)區(qū)的慣性,避免首次到達(dá)溫度設(shè)定值(SV)時(shí)超調(diào)過(guò)大。
在這個(gè)階段,要么占空比K=0, SSR關(guān)閉;要么占空比K=100%, SSR全速輸出。PID調(diào)節(jié)器不起作用,僅由“加速速率”控制溫升快慢。
(2) PID調(diào)節(jié)階段
在這個(gè)階段,PID調(diào)節(jié)器調(diào)節(jié)輸出,根據(jù)偏差值計(jì)算占空比(0-100%),保證偏差(EV)趨近于零,即使系統(tǒng)受到外部干擾時(shí),也能使系統(tǒng)回到平衡狀態(tài)。
3. PID算法
PID控制的原理是基于下面的算式:輸出M(t)是比例項(xiàng),積分項(xiàng)和微分項(xiàng)的函數(shù)。
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image012.jpg 其中:
M(t) PID回路的輸出,是時(shí)間的函數(shù)
Kc PID回路的比例增益
e PID回路的偏差(設(shè)定值(SV)與過(guò)程變量(PV)之差)
Minitial PID回路的靜態(tài)輸出值
為了能讓數(shù)字計(jì)算機(jī)處理這個(gè)算式,連續(xù)算式必須離散化為周期采樣偏差算式,才能用來(lái)計(jì)算輸出值。數(shù)字計(jì)算機(jī)處理的算式如下:
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image014.jpg 從這個(gè)公式可以看出,積分項(xiàng)是從第一個(gè)采樣周期到當(dāng)前采樣周期所有誤差 項(xiàng)的函數(shù),微分項(xiàng)是當(dāng)前采樣和前一次采樣的函數(shù),比例項(xiàng)僅是當(dāng)前采樣的函數(shù)。在數(shù)字計(jì)算機(jī)中,不保存所有的誤差項(xiàng),其實(shí)也不必要。由于計(jì)算機(jī)從第一次采樣開(kāi)始,每有一個(gè)過(guò)程采樣值必須計(jì)算一次輸出值,只需要保存前一次過(guò)程值(PVn-1)和積分項(xiàng)前值。利用計(jì)算機(jī)處理的重復(fù)性,可以將以上算式變換為:
file:///C:/Users/18120/AppData/Local/Temp/msohtmlclip1/01/clip_image016.jpg 其中:
Mn 在第n 采樣時(shí)刻,PID回路的輸出計(jì)算值
SV PID 回路設(shè)定值
PVn 在第n 采樣時(shí)刻的過(guò)程變量值
PVn-1 在第n-1 采樣時(shí)刻的過(guò)程變量值
MX 積分前項(xiàng)值
Mintial PID回路的靜態(tài)輸出值
Kc PID回路的比例增益
KI 積分項(xiàng)的比例常數(shù) KI=Kc * Ts / Ti
Ts是離散化時(shí)的采樣時(shí)間間隔 Ti是積分時(shí)間參數(shù);
KD 微分項(xiàng)的比例常數(shù) KD=Kc * Td / Ts
Ts是離散化時(shí)的采樣時(shí)間間隔 Td是微分時(shí)間參數(shù);
從上面PID的算式,可以分析三個(gè)基本參數(shù)Kc, KI, KD在實(shí)際控制中的作用:
(1) 比例調(diào)節(jié)作用:比例項(xiàng)按比例反應(yīng)系統(tǒng)的偏差,系統(tǒng)一旦出現(xiàn)了偏差,比例調(diào)節(jié)立即產(chǎn)生調(diào)節(jié)作用用以減少偏差。比例作用大,可以加快調(diào)節(jié),減少偏差。但是過(guò)大的比例調(diào)節(jié),使系統(tǒng)的穩(wěn)定性下降,甚至造成系統(tǒng)的不穩(wěn)定。
(2) 積分調(diào)節(jié)作用:積分項(xiàng)消除系統(tǒng)的穩(wěn)態(tài)誤差,提高無(wú)差度。只要有偏差,積分就進(jìn)行,直到無(wú)偏差時(shí),積分運(yùn)算才停止,積分調(diào)節(jié)項(xiàng)輸出一常數(shù)值。積分作用的強(qiáng)弱取決于積分時(shí)間常數(shù)Ti,Ti越小,積分作用越強(qiáng)。積分控制可提高系統(tǒng)的無(wú)差度,但積分項(xiàng)輸出響應(yīng)緩慢,使得系統(tǒng)調(diào)節(jié)時(shí)間增長(zhǎng)。
(3) 微分調(diào)節(jié)作用:微分項(xiàng)反映系統(tǒng)過(guò)程變量的變化率((PVn-1-PVn)/ Ts),具有預(yù)見(jiàn)性,能預(yù)見(jiàn)變化的趨勢(shì),因此,能產(chǎn)生超前的調(diào)節(jié)作用,在偏差還沒(méi)有形成之前,已被微分調(diào)節(jié)作用消除。因此,可以改善系統(tǒng)的動(dòng)態(tài)性能。在微分時(shí)間參數(shù)Td選擇合適的情況下,可以減少超調(diào),減少調(diào)節(jié)時(shí)間。微分調(diào)節(jié)對(duì)干擾有放大效果,過(guò)強(qiáng)的微分調(diào)節(jié),對(duì)系統(tǒng)抗干擾不利。此外,微分項(xiàng)反映的是過(guò)程變量的變化率,而當(dāng)過(guò)程變量沒(méi)有變化時(shí),微分調(diào)節(jié)輸出為零。微分調(diào)節(jié)不能單獨(dú)使用,需要與另外兩種調(diào)節(jié)規(guī)律相結(jié)合,組成PD或PID調(diào)節(jié)器。
以上面的推導(dǎo),C程序如下
/*
pid算法C源程序,還有實(shí)現(xiàn)pid自動(dòng)調(diào)整。51用于控制溫度26-100攝氏度。
TIME:2011-07-29 20:15:07
*/
#include <stdlib.h>
#include "global_varible.h"
/****************************************************************************
* 模塊名: PID
* 描述: PID調(diào)節(jié)子程序
* 采用PID-PD算法。在偏差絕對(duì)值大于△e時(shí),用PD算法,以改善動(dòng)態(tài)品質(zhì)。
* 當(dāng)偏差絕對(duì)值小于△e時(shí),用PID算法,提高穩(wěn)定精度。
*PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
*============================================================================
* 入口: 無(wú)
* 出口: 無(wú)
* 改變: PID_T_Run=加熱時(shí)間控制
*****************************************************************************/
void PID_Math(void)
{
signedlong ee1; //偏差一階
//signedlong ee2; //偏差二階
signedlong d_out; //積分輸出
if(!Flag_PID_T_OK)
return;
Flag_PID_T_OK= 0;
Temp_Set= 3700; //溫度控制設(shè)定值37.00度
PID_e0 = Temp_Set - Temp_Now; //本次偏差
ee1 = PID_e0 - PID_e1; //計(jì)算一階偏差
//ee2= PID_e0-2*PID_e1+PID_e2; //計(jì)算二階偏差
//一階偏差的限制范圍
if(ee1> 500) ee1 = 500;
if(ee1< -500) ee1 = -500;
PID_e_SUM+= PID_e0; //偏差之和
//積分最多累計(jì)的溫差
if(PID_e_SUM> 200) PID_e_SUM = 200;
if(PID_e_SUM< -200) PID_e_SUM = -200;
PID_Out= PID_kp * PID_e0 + PID_kd * ee1; //計(jì)算PID比例和微分輸出
if(abs(PID_e0)< 200) //如果溫度相差小于1.5度則計(jì)入PID積分輸出
{
if(abs(PID_e0)> 100){ //如果溫度相差大于1度時(shí)積分累計(jì)限制
if(PID_e_SUM> 100) PID_e_SUM = 100;
if(PID_e_SUM< -100) PID_e_SUM = -100;
}
d_out= PID_ki * PID_e_SUM; //積分輸出
if(PID_e0< -5){ //當(dāng)前溫度高于設(shè)定溫度0.5度時(shí)積分累計(jì)限制
if(PID_e_SUM> 150) PID_e_SUM = 150;
if(PID_e_SUM> 0) d_out >>= 1; //當(dāng)前溫度高于設(shè)定溫度0.5度時(shí)削弱積分正輸出
}
PID_Out+= d_out; //PID比例,積分和微分輸出
}
else
PID_e_SUM=0;
PID_Out/= 100; //恢復(fù)被PID_Out系數(shù)放大的倍數(shù)
if(PID_Out> 200) PID_Out=200;
if(PID_Out<0) PID_Out=0;
if(PID_e0> 300) PID_Out=200; //當(dāng)前溫度比設(shè)定溫度低3度則全速加熱
if(PID_e0< -20) PID_Out=0; //當(dāng)前溫度高于設(shè)定溫度0.2度則關(guān)閉加熱
Hot_T_Run= PID_Out; //加熱時(shí)間控制輸出
// PID_e2= PID_e1; //保存上次偏差
PID_e1= PID_e0; //保存當(dāng)前偏差
}
|