新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機PID程序

        單片機PID程序

        作者: 時間:2016-11-24 來源:網絡 收藏
        剛剛做的一個恒溫箱,采用PID算法,3秒一個輸出周期,輸出量為0-150,各參數量化到0-99,便于用戶修改,為抵消散熱,加入維持功率系數,程序如下(溫度放大了10倍)
        typedef struct DeltPID
        {
        char PIDTemp;//pid開關溫差
        char P;
        char I;
        char D;
        char PIDKc;//維持功率
        }data DELTPID;
        int data PID_Buff[3];//溫度緩沖區-參與PID運算
        int data PID_Value;//輸出控制量
        DELTPID PID=
        {
        50,
        50,
        50,
        50,
        50
        }; //增量pid結構體
        DELTPID E_PID;
        unsigned char data HeatCount = 0;
        void PID_Out()
        {
        if (HeatCount>0)
        {
        HeatCount--;
        HEAT_START;//開始加熱
        }
        else
        {
        HEAT_STOP;//停止加熱
        }
        }
        int data PID_Buff[3];//溫度緩沖區-參與PID運算
        DELTPID PID=
        {
        50,
        50,
        50,
        50,
        50
        }; //增量pid結構體
        DELTPID E_PID;
        #define MAX_DELT 15//最大增量
        void PID_Ctrl()
        {
        static int ei;//當前偏差
        int last_ei;//
        int delt_ei;//偏差變化量
        //刷新最近兩次偏差
        unsigned char i_sign;//是否取消積分作用
        unsigned char c_sign;//是否取消維持功率
        int delt_value;//增量pid輸出值
        last_ei = ei;
        ei = TempSet - PID_Buff[0];
        delt_ei = ei - last_ei;//求出偏差變化量
        if (ei > PID.PIDTemp)//當前溫差大于設定溫差
        {
        PID_Value = 150;//全功率輸出
        return;
        }
        else if (ei < -5)//超調
        {
        PID_Value = 0;//停止輸出
        return;
        }
        //增量pid控制
        if (((ei>0) && (delt_ei<0)) || ((ei<0) && (delt_ei>0)))
        {
        i_sign = 0;//專家pid測量值正向目標值靠近,取消積分作用
        }
        else
        {
        i_sign = 1;
        }
        if ((ei<0) && (delt_ei>0))
        {
        c_sign = 1;//溫度正在從高溫向目標值靠近
        }
        else
        {
        c_sign = 0;
        }
        delt_value = (float)PID.P/17*delt_ei + (float)PID.I/100*ei*i_sign-
        (float)PID.D/200*(PID_Buff[0]-2*PID_Buff[1]+PID_Buff[2]) + (float)PID.PIDKc/1000*TempSet*c_sign;
        if (delt_value>MAX_DELT)
        {
        delt_value = MAX_DELT;
        }
        else if (delt_value<(-MAX_DELT))
        {
        delt_value = -MAX_DELT;
        }
        PID_Value+=delt_value;
        if (PID_Value<0)
        {
        PID_Value = 0;
        }
        else if (PID_Value>150)
        {
        PID_Value = 150;
        }
        }



        關鍵詞: 單片機PID程

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 手游| 财经| 天镇县| 丹棱县| 南京市| 泊头市| 灵武市| 台湾省| 成武县| 徐闻县| 天峻县| 囊谦县| 额济纳旗| 商水县| 珠海市| 南丹县| 镇安县| 马龙县| 揭西县| 醴陵市| 兴山县| 平江县| 海盐县| 临城县| 庆阳市| 和静县| 楚雄市| 兴安盟| 探索| 雷州市| 大名县| 会昌县| 邢台县| 大田县| 中西区| 富阳市| 含山县| 凌云县| 清远市| 台山市| 沅江市|