增量式PID控制C語言代碼
增量式PID控制公式:
上面△u(k)是控制量增量,“增量式PID”就是直接以這個增量進行控制。
至於參數的整定,根據響應的情況調,比如,響應慢了,我就增大kp,或者減小kd,超調大了,就減小kp或增大點kd,這個規律你可以看看PID三個參數的作用:)
////////////////////////////////////////////////////////////////
// 定義PID參數結構體
///////////////////////////////////////////////////////////////
typedef struct PID { //結構體定義
int SetPoint //設定值
int Proportion; // Proportion 比例係數
int Integral; // Integral 積分係數
int Derivative; // Derivative 微分係數
int LastError; // Error[-1] 前一拍誤差
int PreError; // Error[-2] 前兩拍誤差
} PID;
main()
{
PID vPID; //定義結構變數名
PIDInit ( &vPID ); //Initialize Structure
vPID.Proportion = 10; //Set PID Coefficients
vPID.Integral = 10; // Set PID Integral
vPID.Derivative = 10; // Set PID Derivative
vPID. SetPoint = //根據實際情況設定
while(1)
{
Verror=Measure(); //得到AD的輸出值
Error =vPID. SetPoint- Verror; //與設定值比較,得到誤差值
tempi=PIDCal(&vPID, Error;
laser.Value+=tempi; // Value與Num[2]為共同體,共同體名laser
LASERH=laser.Num[0];
LASERL=laser.Num[1];
}
}
///////////////////////////////////////////////////////////////////////
//Title:PID參數初始化
//Description: Proportion="0"
// Integral=0
// LastError=0
//Input: PID的P、I控制常數和之前的誤差量(PID *pp)
//Return:
//////////////////////////////////////////////////////////////////////
void PIDInit (PID *pp) //PID參數初始化,都置0
{
memset ( pp,0,sizeof(PID));
//memset()的函數, 它可以一位元組一位元組地把整個數組設定為一個指定的值。
// memset()函數在mem.h標頭檔中聲明,它把數組的起始地址作為其第一個參數,
//第二個參數是設定數組每個位元組的值,第三個參數是數組的長度(位元組數,不是元素個數)。
//其函數原型為: void *memset(void*,int,unsigned);
//標頭檔<string.h>
}
///////////////////////////////////////////////////////////////////////
//Title:增量式PID演算法程式
//Description:給出一個誤差增量
//Input: PID的P、I控制常數和之前的誤差量(PID *pp)& 當前誤差量(ThisError)
//Return: 誤差增量templ
//////////////////////////////////////////////////////////////////////
int PIDCal( PID *pp, int ThisError ){
//增量式PID演算法(需要控制的不是控制量的絕對值,而是控制量的增量)
int pError,dError,iError;
long templ;
pError = ThisError-pp->LastError;
iError = ThisError;
dError = ThisError-2*(pp->LastError)+pp->PreError;
//增量計算
templ=pp->Proportion*pError + pp->Integral*iError+pp->Derivative*dError; //增量
//儲存誤差用於下次運算
pp->PreError = pp->LastError;
pp->LastError = ThisError;
return ((int)(templ>>8));
}
參考自:http://blog.sina.com.cn/s/blog_408540af0100asu3.html