新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)PID算法程序(二)位置式PID控制算法

51單片機(jī)PID算法程序(二)位置式PID控制算法

作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
51單片機(jī)組成的數(shù)字控制系統(tǒng)控制中,PID控制器是通過PID控制算法實(shí)現(xiàn)的。51單片機(jī)通過AD對信號進(jìn)行采集,變成數(shù)字信號,再在單片機(jī)中通過算法實(shí)現(xiàn)PID運(yùn)算,再通過DA把控制量反饋回控制源。從而實(shí)現(xiàn)對系統(tǒng)的伺服控制。



位置式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 //C語言中memset函數(shù)頭文件



/*====================================================================================================
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
}


評論


技術(shù)專區(qū)

關(guān)閉