【轉】增量式PID控制算法


(轉載 出處blog.ednchina.com/tengjingshu )blog.ednchina.com/tengjingshu/211739/message.aspx#

當執行機構需要的不是控制量的絕對值,而是控制量的增量(例如去驅動步進電動機)時,需要用PID的“增量算法”。

 

      增量式PID控制算法可以通過(2-4)式推導出。由(2-4)可以得到控制器的第k-1個采樣時刻的輸出值為:

(2-5)

將(2-4)與(2-5)相減並整理,就可以得到增量式PID控制算法公式為:

 

(2-6)

其中

 

         由(2-6)可以看出,如果計算機控制系統采用恆定的采樣周期T,一旦確定A、B、C,只要使用前后三次測量的偏差值,就可以由(2-6)求出控制量。

增量式PID控制算法與位置式PID算法(2-4)相比,計算量小得多,因此在實際中得到廣泛的應用。

位置式PID控制算法也可以通過增量式控制算法推出遞推計算公式:

 

(2-7)

(2-7)就是目前在計算機控制中廣泛應用的數字遞推PID控制算法。

 

增量式PID控制算法C51程序

/*==================================================================================================== PID Function The PID (比例、積分、微分) function is used in mainly control applications. PIDCalc performs one iteration of the PID algorithm. While the PID function works, main is just a dummy program showing a typical usage. =====================================================================================================*/

typedef struct PID

{

int SetPoint; //設定目標 Desired Value

long SumError; //誤差累計

double Proportion; //比例常數 Proportional Const

double Integral; //積分常數 Integral Const

double Derivative; //微分常數 Derivative Const

int LastError; //Error[-1]

int PrevError; //Error[-2]

} PID;

 

 

static PID sPID;

static PID *sptr = &sPID;

/*==================================================================================================== Initialize PID Structure PID參數初始化 =====================================================================================================*/

void IncPIDInit(void)

{

sptr->SumError = 0;

sptr->LastError = 0; //Error[-1]

sptr->PrevError = 0; //Error[-2]

sptr->Proportion = 0; //比例常數 Proportional Const

sptr->Integral = 0; //積分常數Integral Const

sptr->Derivative = 0; //微分常數 Derivative Const

sptr->SetPoint = 0;

}

 

/*==================================================================================================== 增量式PID計算部分 =====================================================================================================*/

int IncPIDCalc(int NextPoint)

{

register int iError, iIncpid; //當前誤差

iError = sptr->SetPoint - NextPoint; //增量計算

iIncpid = sptr->Proportion * iError //E[k]項

- sptr->Integral * sptr->LastError //E[k-1]項

+ sptr->Derivative * sptr->PrevError; //E[k-2]項

//存儲誤差,用於下次計算

sptr->PrevError = sptr->LastError;

sptr->LastError = iError;

//返回增量值

return(iIncpid);

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM