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