1. 程式人生 > 其它 >關於PID的一些筆記

關於PID的一些筆記

PID​的​基本​理念​是​讀​取​感測器的值,​根據​計算​比例、​積分、​微分​響應​得出​期望​的​​輸出,​將​三​個​值​相加​計算​輸出。

1、控制系統

閉環系統如圖。以溫度控制距離,設定溫度100度,這時感測器採到溫度80度,經過控制演算法後的輸出將控制外設開啟加熱,整個系統的溫度將會上升。採到溫度高於設定溫度同理。這樣就形成了一個閉環的控制系統。

2、PID術語

比例​響應
​ 比例​模​塊​取決​於​設定​值​和​過程​變數​之間​的​差​值。​稱為“誤差”。比例​增益決定​了​輸出​響應​對​誤差​訊號​的​比例。例如,​誤差​為​10,​比例​增益​為​5​時,​比例​響應​為​50。​一般​而言,​提高​比例​增益​會​增加​控制​系統​響應​的​速度。但是​如果​比例​增益​太大,​過程​變數​會​有​振盪。如果​繼續​增加Kc

,​系統​振盪​會​越來越​大,​以至於​超出​控制,​使得​系統​變得​不​穩定。

積分​響應
​ 積分​模​塊​將​一段​時間​內的​誤差​相加。 即使是​一個​很小​的​誤差,​也​會​讓​積分​響應​緩慢​增加。積分​響應​會​根據​時間​持續​增加,​除非​誤差​為​0。​積分​響應​的​目的​在於​將​穩定​狀態​的​誤差​保持​在​0。穩定​狀態​誤差​是​過程​變數​和​設定​值​之間​的​差​值。當​積分​操作​滿足​了​控制器​的​條件,​而​控制器​還​未​將​誤差​保持​在​0​時,​會​產生​積分​飽和​的​結果。

微分​響應
​ 微分​模​塊​在​過程​變數​迅速​增大​時​停止​輸出。微分​響應​與​過程​變數​變化​的​速度​之間​成​比例​關係。增加微分​時間​(Td

)會​使​控制​系統​對​誤差​的​反應​更加​劇烈,​會​增加​整個​控制​系統​的​響應​時間。大​多數​實用​控制​系統​使用​非常​小​的​微分​時間​(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。