歡迎您光臨本站 登入註冊首頁

PID 溫度控制的實現

admin @ 2014-03-26 , reply:0

概述

PID簡介   PID(ProportionalIntegralDerivative)控制是控制工程中技術成熟、應用廣泛的一種控制策略,經過長期的工程實踐,已形成了一套完……

PID 簡介
    PID(Proportional Integral Derivative)控制是控制工程中技術成熟、應用廣泛的一種控制策略,經過長期的工程實踐,已形成了一套完整的控制方法和典型的結構。它不僅適用於數學模型已知的控制系統中,而且對於大多數數學模型難以確定的工業過程也可應用,在眾多工業過程式控制制中取得了滿意的應用效果。
    PID 工作基理:由於來自外界的各種擾動不斷產生,要想達到現場控制對象值保持恆定的目的,控制作用就必須不斷的進行。若擾動出現使得現場控制對象值(以下簡稱被控參數)發生變化,現場檢測元件就會將這種變化採集后經變送器送至PID 控制器的輸入端,並與其給定值(以下簡稱SP 值)進行比較得到偏差值(以下簡稱e 值),調節器按此偏差並以我們預先設定的整定參數控制規律發出控制信號,去改變調節器的開度,使調節器的開度增加或減少,從而使現場控制對象值發生改變,並趨向於給定值(SP 值),以達到控制目的 ,如圖 1 所示,其實PID 的實質就是對偏差(e 值)進行比例、積分、微分運算,根據運算結果控制執行部件的過程。
 
圖1 模擬PID 控制系統原理圖
    PID 控制器的控制規律可以描述為:
  (1)
    比例(P)控制能迅速反應誤差,從而減小穩態誤差。但是,比例控制不能消除穩態誤差。比例放大係數的加大,會引起系統的不穩定。積分(I)控制的作用是:只要系統有誤差存在,積分控制器就不斷地積累,輸出控制量,以消除誤差。因而,只要有足夠的時間,積分控制將能完全消除誤差,使系統誤差為零,從而消除穩態誤差。積分作用太強會使系統超調加大,甚至使系統出現振蕩。微分(D)控制可以減小超調量,克服振蕩,使系統的穩定性提高,同時加快系統的動態響應速度,減小調整時間,從而改善系統的動態性能。根據不同的被控對象的控制特性,又可以分為P、PI、PD、PID 等不同的控制模型。

數字PID 的實現
    在連續-時間控制系統(模擬PID 控制系統)中,PID 控制器應用得非常廣泛。其設計技術成熟,長期以來形成了典型的結構,參數整定方便,結構更改靈活,能滿足一般的控制要求。隨著計算機的快速發展,人們將計算機引入到PID 控制領域,也就出現了數字式PID 控制。
    由於計算機基於採樣控制理論,計算方法也不能沿襲傳統的模擬PID 控制演算法(如公式1 所示),所以必須將控制模型離散化,離散化的方法:以T 為採樣周期,k 為採樣序號,用求和的形式代替積分,用增量的形式(求差)代替微分,這樣可以將連續的PID 計算公式離散:
 (2)
式1 就可以離散為:
 (3)
或者:
 (4)
    這樣就可以讓計算機或者單片機通過採樣的方式實現PID 控制,具體的PID 控制又分為位置式PID 控制和增量式PID 控制,公式4 給出了控制量的全部大小,所以稱之為全量式或者位置式控制;如果計算機只對相鄰的兩次作計算,只考慮在前一次基礎上,計算機輸出量的大小變化,而不是全部輸出信息的計算,這種控制叫做增量式PID 控制演算法,其實質就是求Δμ的大小,而   Δμkkk-1 ;所以將式4 做自減變換有:
 (5)
其中
 

溫度控制PID 演算法設計
    本設計利用了上面所介紹的位置式PID 演算法,將溫度感測器採樣輸入作為當前輸入,然後與設定值進行相減得偏差ek,然後再對之進行PID 運算產生輸出結果fOut,然後讓fOut 控制定時器的時間進而控制加熱器。為了方便PID 運算,首先建立一個PID 的結構體數據類型,該數據類型用於保存PID 運算所需要的P、I、D 係數,以及設定值,歷史誤差的累加和等信息:

typedef struct PID
{
float SetPoint; // 設定目標 Desired Value
float Proportion; // 比例係數 Proportional Const
float Integral; // 積分係數 Integral Const
float Derivative; // 微分係數 Derivative Const
int LastError; // 上次偏差
int SumError; // 歷史誤差累計值
} PID;
PID stPID; // 定義一個stPID 變數

    下面是PID 運算的演算法程序,通過PID 運算返回fOut,fOut 的值決定是否加熱,加熱時間是多少。
PID 運算的C 實現代碼:

float PIDCalc( PID *pp, int NextPoint )
{
int dError,Error;
Error = pp->SetPoint*10 - NextPoint; // 偏差,設定值減去當前採樣值
pp->SumError += Error; // 積分,歷史偏差累加
dError = Error-pp->LastError; // 當前微分,偏差相減
pp->PrevError = pp->LastError; // 保存
pp->LastError = Error;
+ pp->Integral * pp->SumError // 積分項
- pp->Derivative * dError // 微分項
);
}

    在實際運算時,由於水具有很大的熱慣性,而且PID 運算中的I(積分項)具有非常明顯的延遲效應所以不能保留,我們必須把積分項去掉,相反D(微分項)則有很強的預見性,能夠加快反應速度,抑制超調量,所以積分作用應該適當加強才能達到較佳的控制效果,系統最終選擇PD 控制方案,下面C 代碼所示為PD 控制的實現過程:

float PIDCalc( PID *pp, int NextPoint )
{
int dError,Error;
Error = pp->SetPoint*10 - NextPoint; // 偏差,設定值減去當前採樣值
dError = Error-pp->LastError; // 當前微分,偏差相減
pp->PrevError = pp->LastError; // 保存
pp->LastError = Error;
return (pp->Proportion * Error // 比例項
- pp->Derivative * dError // 微分項
);
}

溫度控制實現
    通過溫度的PID 運算,產生結果fOut,該參數決定是否加熱,加熱時間是多長。該程序如下:

stPID.Proportion = 2; //設置PID 比例值
stPID.Integral = 0; //設置PID 積分值
stPID.Derivative = 5; //設置PID 微分值
fOut = PIDCalc ( &stPID,(int)(fT*10) ); //PID 計算
if(fOut<=0)
*P_IOA_Buffer &= 0xff7f; //溫度高於設定值,關閉加熱器
else
*P_IOA_Buffer |= 0x0080; //溫度低於設定值,打開加熱器

    加熱時間由主函數計算,由TimerB 中斷控制。主程序中通過PIDCalc 函數得到fOut 參數,如果該參數大於“0”,則開啟加熱器。IRQ2_TMB 中斷一直處於允許狀態,每進入一次IRQ2_TMB 中斷,fOut 參數減1,直到fOut = 0,停止加熱。如果PIDCalc 計算結果比較大說明離目標溫度相差較大,則加熱時間比較長,如果計算結果比較小,說明離目標溫度相差較小,加熱時間相對較短。


[admin via 研發互助社區 ] PID 溫度控制的實現已經有8085次圍觀

http://cocdig.com/docs/show-post-44640.html