新聞中心

        EEPW首頁 > 嵌入式系統(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)上找來的一個比較典型的PID處理程序,在使用單片機(jī)作為控制cpu時(shí),請稍作簡化,具體的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ù)”,做好余
        數(shù)補(bǔ)償。這個程序只是一般常用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處

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 中江县| 通辽市| 吐鲁番市| 纳雍县| 余干县| 天气| 微山县| 资兴市| 井陉县| 清涧县| 隆子县| 汉阴县| 蒲城县| 牙克石市| 井陉县| 宽城| 九寨沟县| 紫金县| 西充县| 贺州市| 湖北省| 海安县| 抚顺县| 台安县| 武定县| 灌阳县| 常熟市| 司法| 稻城县| 五寨县| 衡南县| 湟源县| 和顺县| 浮梁县| 蒙山县| 工布江达县| 石狮市| 英山县| 新津县| 渭南市| 琼结县|