• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > C51實現PID算法代碼

    C51實現PID算法代碼

    作者: 時間:2012-03-25 來源:網絡 收藏

    真正要用的時候,發現書上的在我們51上來還不是那么容易的事情。簡單的說來,就是不能直接調用。仔細分析你可以發現,教材上的、網上現行的的C語言幾乎都是用浮點型的數據來做的,可以想象,如果我們的計算使用浮點數據,那我們的51單片機來運行的話會有多痛苦。

    所以,本人自己琢磨著弄了一個整型變量來,由于是用整型數來做的,所以也不是很精確,但是對于很多的使用場合,這個精度也夠了。關于系數和采樣電壓全部是放大10倍處理的。所以精度不是很高,但是也不是那么低,大部分的場合都夠用了。實在覺得精度不夠,可以再放大10倍或者100倍處理,但是要注意不超出整個數據類型的范圍就可以了。

    本人做的是帶死區控制的PID

    具體的參考參見下面:
    typedefstructPIDValue
    {
    uint32Ek_Uint32[3];//差值保存,給定和反饋的差值
    uint8EkFlag_Uint8[3];//符號,1則對應的Ek[i]為負數,0為對應的Ek[i]為正數
    uint8KP_Uint8;
    uint8KI_Uint8;
    uint8KD_Uint8;
    uint8B_Uint8;//死區電壓

    uint8KP;//顯示修改的時候用
    uint8KI;//
    uint8KD;//
    uint8B;//
    uint16Uk_Uint16;//上一時刻的控制電壓
    }PIDValueStr;

    PIDValueStrxdataPID;
    /*******************************
    **PID=Uk+(KP*E(k)-KI*E(k-1)+KD*E(k-2));
    ********************************/
    voidPIDProcess(void)
    {
    uint32idataTemp[3];//
    uint32idataPostSum;//正數和
    uint32idataNegSum;//負數和
    Temp[0]=0;
    Temp[1]=0;
    Temp[2]=0;
    PostSum=0;
    NegSum=0;
    if(ADPool.Value_Uint16[UINADCH]>ADPool.Value_Uint16[UFADCH])//給定大于反饋,則EK為正數
    {
    Temp[0]=ADPool.Value_Uint16[UINADCH]-ADPool.Value_Uint16[UFADCH];//計算Ek[0]
    if(Temp[0]>PID.B_Uint8)
    {
    //數值移位
    PID.Ek_Uint32[2]=PID.Ek_Uint32[1];
    PID.Ek_Uint32[1]=PID.Ek_Uint32[0];
    PID.Ek_Uint32[0]=Temp[0];
    //符號移位
    PID.EkFlag_Uint8[2]=PID.EkFlag_Uint8[1];
    PID.EkFlag_Uint8[1]=PID.EkFlag_Uint8[0];
    PID.EkFlag_Uint8[0]=0;//當前EK為正數
    Temp[0]=(uint32)PID.KP_Uint8*PID.Ek_Uint32[0];//KP*EK0
    Temp[1]=(uint32)PID.KI_Uint8*PID.Ek_Uint32[1];//KI*EK1
    Temp[2]=(uint32)PID.KD_Uint8*PID.Ek_Uint32[2];//KD*EK2
    }
    }
    else//反饋大于給定
    {
    Temp[0]=ADPool.Value_Uint16[UFADCH]-ADPool.Value_Uint16[UINADCH];//計算Ek[0]
    if(Temp[0]>PID.B_Uint8)
    {
    //數值移位
    PID.Ek_Uint32[2]=PID.Ek_Uint32[1];
    PID.Ek_Uint32[1]=PID.Ek_Uint32[0];
    PID.Ek_Uint32[0]=Temp[0];
    //符號移位
    PID.EkFlag_Uint8[2]=PID.EkFlag_Uint8[1];
    PID.EkFlag_Uint8[1]=PID.EkFlag_Uint8[0];
    PID.EkFlag_Uint8[0]=1;//當前EK為負數
    Temp[0]=(uint32)PID.KP_Uint8*PID.Ek_Uint32[0];//KP*EK0
    Temp[1]=(uint32)PID.KI_Uint8*PID.Ek_Uint32[1];//KI*EK1
    Temp[2]=(uint32)PID.KD_Uint8*PID.Ek_Uint32[2];//KD*EK2
    }
    }


    上一頁 1 2 下一頁

    關鍵詞: 代碼 算法 PID 實現 C51

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 高淳县| 克什克腾旗| 抚州市| 天津市| 香港| 西宁市| 凤凰县| 太仆寺旗| 东台市| 阜新市| 定远县| 灌云县| 荣成市| 汉源县| 廊坊市| 长春市| 清涧县| 当涂县| 安顺市| 包头市| 汉川市| 崇信县| 巨野县| 丹阳市| 平舆县| 锡林浩特市| 孟州市| 松阳县| 富川| 临沧市| 曲阜市| 师宗县| 五峰| 拉萨市| 巴林左旗| 肥西县| 葫芦岛市| 丰顺县| 大安市| 庄河市| 葫芦岛市|