新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 標準的PID處理例程

標準的PID處理例程

作者: 時間:2016-11-11 來源:網絡 收藏
/*====================================================================================================
這是從網上找來的一個比較典型的PID處理程序,在使用單片機作為控制cpu時,請稍作簡化,具體的PID
參數(shù)必須由具體對象通過實驗確定。由于單片機的處理速度和ram資源的限制,一般不采用浮點數(shù)運算,
而將所有參數(shù)全部用整數(shù),運算到最后再除以一個2的N次方數(shù)據(jù)(相當于移位),作類似定點數(shù)運算,可
大大提高運算速度,根據(jù)控制精度的不同要求,當精度要求很高時,注意保留移位引起的“余數(shù)”,做好余
數(shù)補償。這個程序只是一般常用pid算法的基本架構,沒有包含輸入輸出處理部分。
=====================================================================================================*/
#include
#include
/*====================================================================================================
PIDFunction

ThePID(比例、積分、微分)functionisusedinmainly
controlapplications.PIDCalcperformsoneiterationofthePID
algorithm.

WhilethePIDfunctionworks,mainisjustadummyprogramshowing
atypicalusage.
=====================================================================================================*/

typedefstructPID{

doubleSetPoint;//設定目標DesiredValue

doubleProportion;//比例常數(shù)ProportionalConst
doubleIntegral;//積分常數(shù)IntegralConst
doubleDerivative;//微分常數(shù)DerivativeConst

doubleLastError;//Error[-1]
doublePrevError;//Error[-2]
doubleSumError;//SumsofErrors

}PID;

/*====================================================================================================
PID計算部分
=====================================================================================================*/

doublePIDCalc(PID*pp,doubleNextPoint)
{
doubledError,
Error;

Error=pp->SetPoint-NextPoint;//偏差
pp->SumError+=Error;//積分
dError=pp->LastError-pp->PrevError;//當前微分
pp->PrevError=pp->LastError;
pp->LastError=Error;
return(pp->Proportion*Error//比例項
+pp->Integral*pp->SumError//積分項
+pp->Derivative*dError//微分項
);
}

/*====================================================================================================
InitializePIDStructure
=====================================================================================================*/

voidPIDInit(PID*pp)
{
memset(pp,0,sizeof(PID));
}

/*====================================================================================================
MainProgram
=====================================================================================================*/

doublesensor(void)//DummySensorFunction
{
return100.0;
}

voidactuator(doublerDelta)//DummyActuatorFunction
{}

voidmain(void)
{
PIDsPID;//PIDControlStructure
doublerOut;//PIDResponse(Output)
doublerIn;//PIDFeedback(Input)

PIDInit(&sPID);//InitializeStructure
sPID.Proportion=0.5;//SetPIDCoefficients
sPID.Integral=0.5;
sPID.Derivative=0.0;
sPID.SetPoint=100.0;//SetPIDSetpoint

for(;;){//MockUpofPIDProcessing

rIn=sensor();//ReadInput
rOut=PIDCalc(&sPID,rIn);//PerformPIDInteration
actuator(rOut);//EffectNeededChanges
}
}


關鍵詞: 標準PID處

評論


技術專區(qū)

關閉