新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 標(biāo)準(zhǔn)的PID處理例程

標(biāo)準(zhǔn)的PID處理例程

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

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

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

typedefstructPID{

doubleSetPoint;//設(shè)定目標(biāo)DesiredValue

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

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

}PID;

/*====================================================================================================
PID計(jì)算部分
=====================================================================================================*/

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

Error=pp->SetPoint-NextPoint;//偏差
pp->SumError+=Error;//積分
dError=pp->LastError-pp->PrevError;//當(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)
);
}

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


關(guān)鍵詞: 標(biāo)準(zhǔn)PID處

評(píng)論


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

關(guān)閉