51單片機(jī)PID算法程序(二)位置式PID控制算法
位置式PID控制算法
位置式PID控制算法的簡化示意圖
上圖的傳遞函數(shù)為:
(2-1)
在時域的傳遞函數(shù)表達(dá)式
(2-2)
對上式中的微分和積分進(jìn)行近似
(2-3)
式中n是離散點(diǎn)的個數(shù)。
于是傳遞函數(shù)可以簡化為:
(2-4)
其中
u(n)——第k個采樣時刻的控制;
KP——比例放大系數(shù);
Ki——積分放大系數(shù);
Kd——微分放大系數(shù);
T——采樣周期。
如果采樣周期足夠小,則(2-4)的近似計(jì)算可以獲得足夠精確的結(jié)果,離散控制過程與連續(xù)過程十分接近。
(2-4)表示的控制算法直接按(2-1)所給出的PID控制規(guī)律定義進(jìn)行計(jì)算的,所以它給出了全部控制量的大小,因此被稱為全量式或位置式PID控制算法。
缺點(diǎn):
1)由于全量輸出,所以每次輸出均與過去狀態(tài)有關(guān),計(jì)算時要對e(k)(k=0,1,…n)進(jìn)行累加,工作量大。
2)因?yàn)橛?jì)算機(jī)輸出的u(n)對應(yīng)的是執(zhí)行機(jī)構(gòu)的實(shí)際位置,如果計(jì)算機(jī)出現(xiàn)故障,輸出u(n)將大幅度變化,會引起執(zhí)行機(jī)構(gòu)的大幅度變化,有可能因此造成嚴(yán)重的生產(chǎn)事故,這在實(shí)際生產(chǎn)中是不允許的。
位置式PID控制算法C51程序
具體的PID參數(shù)必須由具體對象通過實(shí)驗(yàn)確定。由于單片機(jī)的處理速度和ram資源的限制,一般不采用浮點(diǎn)數(shù)運(yùn)算,而將所有參數(shù)全部用整數(shù),運(yùn)算
到最后再除以一個2的N次方數(shù)據(jù)(相當(dāng)于移位),作類似定點(diǎn)數(shù)運(yùn)算,可大大提高運(yùn)算速度,根據(jù)控制精度的不同要求,當(dāng)精度要求很高時,注意保留移位引起的“余數(shù)”,做好余數(shù)補(bǔ)償。這個程序只是一般常用pid算法的基本架構(gòu),沒有包含輸入輸出處理部分。
=====================================================================================================*/
#include
#include
/*====================================================================================================
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 {
double SetPoint;//設(shè)定目標(biāo)Desiredvalue
double Proportion;//比例常數(shù)Proportional Const
double Integral;//積分常數(shù)Integral Const
double Derivative;//微分常數(shù)Derivative Const
double LastError;// Error[-1]
double PrevError;// Error[-2]
double SumError;// Sums of Errors
} PID;
/*====================================================================================================
PID計(jì)算部分
=====================================================================================================*/
double PIDCalc( PID *pp, double NextPoint )
{
double dError, Error;
Error = pp->SetPoint - NextPoint;//偏差
pp->SumError += Error;//積分
dError = Error - pp->LastError;//當(dāng)前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
return (pp->Proportion * Error//比例項(xiàng)
+ pp->Integral * pp->SumError//積分項(xiàng)
+ pp->Derivative * dError//微分項(xiàng)
);
}
/*====================================================================================================
Initialize PID StructurePID參數(shù)初始化
=====================================================================================================*/
void PIDInit (PID *pp)
{
memset ( pp,0,sizeof(PID));
}
/*====================================================================================================
Main Program主程序
=====================================================================================================*
double sensor (void)// Dummy Sensor Function
{
return 100.0;
}
void actuator(double rDelta)// Dummy Actuator Function
{}
void main(void)
{
PID sPID;// PID Control Structure
double rOut;// PID Response (Output)
double rIn;// PID Feedback (Input)
PIDInit ( &sPID );// Initialize Structure
sPID.Proportion = 0.5;// Set PID Coefficients
sPID.Integral = 0.5;
sPID.Derivative = 0.0;
sPID.SetPoint = 100.0;// Set PID Setpoint
for (;;) {// Mock Up of PID Processing
rIn = sensor ();// Read Input
rOut = PIDCalc ( &sPID,rIn );// Perform PID Interation
actuator ( rOut );// Effect Needed Changes
}
評論