數字PID控制算法

增量式PID控制算法

量式PID控制算法算法

2009-07-18 10:33

 

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

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

 


     增量式PID控制算法能夠經過(2-4)式推導出。由(2-4)能夠獲得控制器的第k-1個採樣時刻的輸出值爲:blog

(2-5)

將(2-4)與(2-5)相減並整理,就能夠獲得增量式PID控制算法公式爲:it

 

(2-6)

其中io

 

        由(2-6)能夠看出,若是計算機控制系統採用恆定的採樣週期T,一旦肯定A、B、C,只要使用先後三次測量的誤差值,就能夠由(2-6)求出控制量。ast

增量式PID控制算法與位置式PID算法(2-4)相比,計算量小得多,所以在實際中獲得普遍的應用。function

位置式PID控制算法也能夠經過增量式控制算法推出遞推計算公式:form

 

(2-7)

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

 

增量式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);

}

相關文章
相關標籤/搜索