lzh电子论坛

欢迎来到lzh电子论坛:
如果您对电子技术感兴趣就加入我们吧!在这里互相交流互相学习!主要讨论的方向有:单片机,ARM,PCB板设计,FPGA,汇编,C/C++等方面。
-----lzh电子论坛
lzhbbs.forumotion.com
lzh电子论坛

电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

欢迎访问lzh电子论坛。可通过【谷歌,SOSO,搜狗】搜索“lzh电子论坛”直接进入论坛。点击了解论坛详细制度


    PID调节子程序

    分享
    avatar
    Admin
    管理员
    管理员

    帖子数 : 869
    威望 : 15
    注册日期 : 12-11-23
    年龄 : 26

    PID调节子程序

    帖子 由 Admin 于 2013-07-20, 8:18 pm

    #include

    #include "global_varible.h"

    /****************************************************************************
    * 模块名: PID
    * 描述: PID调节子程序
    * 采用PID-PD算法。在偏差绝对值大于△e时,用PD算法,以改善动态品质。
    * 当偏差绝对值小于△e时,用PID算法,提高稳定精度。
    * PIDout=kp*e(t)+ki*[e(t)+e(t-1)+...+e(1)]+kd*[e(t)-e(t-1)]
    *============================================================================
    * 入口: 无
    * 出口: 无
    * 改变: PID_T_Run=加热时间控制
    *****************************************************************************/
    void PID_Math(void)
    {
    signed long ee1; //偏差一阶
    //signed long ee2; //偏差二阶
    signed long d_out; //积分输出

    if(!Flag_PID_T_OK)
    return;
    Flag_PID_T_OK=0;

    Temp_Set=3700; //温度控制设定值37.00度

    PID_e0 = Temp_Set-Temp_Now; //本次偏差
    ee1 = PID_e0-PID_e1; //计算一阶偏差
    //ee2 = PID_e0-2*PID_e1+PID_e2; //计算二阶偏差
    if(ee1 > 500) //一阶偏差的限制范围
    ee1 = 500;
    if(ee1 < -500)
    ee1 = -500;
    PID_e_SUM += PID_e0; //偏差之和
    if(PID_e_SUM > 200) //积分最多累计的温差
    PID_e_SUM = 200;
    if(PID_e_SUM < -200)
    PID_e_SUM = -200;

    PID_Out = PID_kp*PID_e0+PID_kd*ee1; //计算PID比例和微分输出
    if(abs(PID_e0) < 200) //如果温度相差小于1.5度则计入PID积分输出
    {
    if(abs(PID_e0) > 100) //如果温度相差大于1度时积分累计限制
    {
    if(PID_e_SUM > 100)
    PID_e_SUM = 100;
    if(PID_e_SUM < -100)
    PID_e_SUM = -100;
    }
    d_out = PID_ki*PID_e_SUM; //积分输出
    if(PID_e0 < -5) //当前温度高于设定温度0.5度时积分累计限制
    {
    if(PID_e_SUM > 150)
    PID_e_SUM = 150;

    if(PID_e_SUM > 0) //当前温度高于设定温度0.5度时削弱积分正输出
    d_out >>= 1;
    }
    PID_Out += d_out; //PID比例,积分和微分输出
    }
    else
    PID_e_SUM=0;

    PID_Out/=100; //恢复被PID_Out系数放大的倍数
    if(PID_Out > 200)
    PID_Out=200;
    if(PID_Out<0)
    PID_Out=0;

    if(PID_e0 > 300) //当前温度比设定温度低3度则全速加热
    PID_Out=200;
    if(PID_e0 < -20) //当前温度高于设定温度0.2度则关闭加热
    PID_Out=0;

    Hot_T_Run=PID_Out; //加热时间控制输出

    PID_e2 = PID_e1; //保存上次偏差
    PID_e1 = PID_e0; //保存当前偏差
    }
    ////////////////////////////////////////////////////////////void PID_Math() end.


    _________________
    电子的道路是孤独的,要懂得左手温暖右手,要懂得把debug当作快乐去欣赏,去享受,那样你才会成功...

      目前的日期/时间是2018-11-20, 1:55 am