關於PID的一些筆記
PID的基本理念是讀取感測器的值,根據計算比例、積分、微分響應得出期望的輸出,將三個值相加計算輸出。
1、控制系統
閉環系統如圖。以溫度控制距離,設定溫度100度,這時感測器採到溫度80度,經過控制演算法後的輸出將控制外設開啟加熱,整個系統的溫度將會上升。採到溫度高於設定溫度同理。這樣就形成了一個閉環的控制系統。
2、PID術語
比例響應
比例模塊取決於設定值和過程變數之間的差值。稱為“誤差”。比例增益決定了輸出響應對誤差訊號的比例。例如,誤差為10,比例增益為5時,比例響應為50。一般而言,提高比例增益會增加控制系統響應的速度。但是如果比例增益太大,過程變數會有振盪。如果繼續增加Kc
積分響應
積分模塊將一段時間內的誤差相加。 即使是一個很小的誤差,也會讓積分響應緩慢增加。積分響應會根據時間持續增加,除非誤差為0。積分響應的目的在於將穩定狀態的誤差保持在0。穩定狀態誤差是過程變數和設定值之間的差值。當積分操作滿足了控制器的條件,而控制器還未將誤差保持在0時,會產生積分飽和的結果。
微分響應
微分模塊在過程變數迅速增大時停止輸出。微分響應與過程變數變化的速度之間成比例關係。增加微分時間(Td
再配個圖就是
3、程式實現
增量式PID的計算公式是下面這個:
演算法的關鍵部分如下:
void PID_Handle(struct _PID *pp) { int err1,err2; int Pout, Iout, Dout;int pidOutTemp; int Out; pp->En = pp->setTemp - pp->currTemp; err1 = pp->En - pp->En_1; err2 = pp->En - 2 * pp->En_1 + pp->En_2; Pout = pp->Kp * err1; //比例 Iout = pp->Ti * pp->En; //積分 Dout = pp->Td * err2; //微分 pidOutTemp = Pout + Iout + Dout; Out = pp->Dout + pidOutTemp; if (Out > MAX_TIME) { Out = MAX_TIME; } else if (Out < MIN_TIME) { Out = MIN_TIME; } pp->Dout = Out; pp->En_2 = pp->En_1; pp->En_1 = pp->En; }
對結構體的定義如下:
struct _PID { int currTemp; //當前溫度 int setTemp; //設定溫度 int En; //當前誤差 int En_1; //上次誤差 int En_2; //上上次誤差 int Kp; int Ti; int Td; int Dout; };
都用了整型是為了計算更加快速,在輸入之前,有對實際採集溫度進行1位小數的保留。其他的想到了再編輯吧,準備再去試試位置式的PID。