新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機PID算法程序(二)位置式PID控制算法

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

        作者: 時間:2016-11-24 來源:網絡 收藏
        51單片機組成的數字控制系統控制中,PID控制器是通過PID控制算法實現的。51單片機通過AD對信號進行采集,變成數字信號,再在單片機中通過算法實現PID運算,再通過DA把控制量反饋回控制源。從而實現對系統的伺服控制。



        位置式PID控制算法







        位置式PID控制算法的簡化示意圖









        上圖的傳遞函數為:



        (2-1)

        時域的傳遞函數表達式



        (2-2)

        對上式中的微分和積分進行近似



        (2-3)

        式中n是離散點的個數。

        于是傳遞函數可以簡化為:



        (2-4)

        其中





        u(n)——第k個采樣時刻的控制;

        KP——比例放大系數;

        Ki——積分放大系數;

        Kd——微分放大系數;

        T——采樣周期。



        如果采樣周期足夠小,則(2-4)的近似計算可以獲得足夠精確的結果,離散控制過程與連續過程十分接近。

        (2-4)表示的控制算法直接按(2-1)所給出的PID控制規律定義進行計算的,所以它給出了全部控制量的大小,因此被稱為全量式或位置式PID控制算法。



        缺點:

        1)由于全量輸出,所以每次輸出均與過去狀態有關,計算時要對e(k)(k=0,1,…n)進行累加,工作量大。

        2)因為計算機輸出的u(n)對應的是執行機構的實際位置,如果計算機出現故障,輸出u(n)將大幅度變化,會引起執行機構的大幅度變化,有可能因此造成嚴重的生產事故,這在實際生產中是不允許的。





        位置式PID控制算法C51程序

        具體的PID參數必須由具體對象通過實驗確定。由于單片機的處理速度和ram資源的限制,一般不采用浮點數運算,而將所有參數全部用整數,運算
        到最后再除以一個2的N次方數據(相當于移位),作類似定點數運算,可大大提高運算速度,根據控制精度的不同要求,當精度要求很高時,注意保留移位引起的“余數”,做好余數補償。這個程序只是一般常用pid算法的基本架構,沒有包含輸入輸出處理部分。


        =====================================================================================================*/
        #include
        #include //C語言中memset函數頭文件



        /*====================================================================================================
        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;//設定目標Desiredvalue
        double Proportion;//比例常數Proportional Const
        double Integral;//積分常數Integral Const
        double Derivative;//微分常數Derivative Const
        double LastError;// Error[-1]

        double PrevError;// Error[-2]
        double SumError;// Sums of Errors
        } PID;
        /*====================================================================================================
        PID計算部分
        =====================================================================================================*/
        double PIDCalc( PID *pp, double NextPoint )
        {
        double dError, Error;
        Error = pp->SetPoint - NextPoint;//偏差
        pp->SumError += Error;//積分
        dError = Error - pp->LastError;//當前微分
        pp->PrevError = pp->LastError;
        pp->LastError = Error;
        return (pp->Proportion * Error//比例項
        + pp->Integral * pp->SumError//積分項
        + pp->Derivative * dError//微分項
        );
        }
        /*====================================================================================================
        Initialize PID StructurePID參數初始化
        =====================================================================================================*/
        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
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 舒城县| 台中市| 巴南区| 衡阳县| 长泰县| 青龙| 土默特左旗| 贞丰县| 滦平县| 罗源县| 潮安县| 湘潭县| 宁明县| 安仁县| 惠水县| 垫江县| 江孜县| 晋宁县| 富顺县| 兰西县| 达尔| 宝丰县| 巴彦淖尔市| 佛山市| 广宗县| 迭部县| 荔浦县| 南和县| 临沧市| 大安市| 九寨沟县| 肥西县| 张家界市| 报价| 雅江县| 琼结县| 双江| 扎鲁特旗| 乐山市| 宣汉县| 夏津县|