pid负反馈闭环控制程序

一. 什么是PID

比例-积分-微分(Proportion Integration Differentiation)的简称,PID是一个负反馈闭环控制系统。
请添加图片描述

二. PID应用场景

PID可以应用在对压力、温度、流量、液位等工艺变量要求维持在一定的数值上。

三. PID的代码以及控制逻辑

PID控制分两种,分别为位置式PID和增量式PID。

1. 位置式PID

位置式pid公式
请添加图片描述
ek:Sv -Pv (目标值与当当前值的误差)

2. 增量式PID

增量式pid公式
请添加图片描述
ek:Sv -Pv (目标值与当当前值的误差)

void IncPIDInit(void);
    int IncPIDCalc(int CurrPoint);
    void PID_SetValue(PID *pid, int sv);
        
    #define MAXOUT 100
    /********************结构体定义********************/
    typedef struct PID
    {
        int32 SetPoint;       //设定值

        float Proportion;   // 比例
        float Integral;     // 积分
        float Derivative;   // 微分

        int iError;          //当前误差
        int iIncpid;        //增量误差

        int LastError;      //前1次误差值
        int PrevError;      //前2次误差值

        int Uk;              //输出返回值
    } PID, *PID_t;

    PID pid;
    static PID_t sptr;

    /********************PID参数初始化********************/
    void IncPIDInit(void)
    {
        sptr                = &pid;
        sptr->SetPoint      = 700;      //设定值
        sptr->Proportion    = 3.0f;     //比例
        sptr->Integral      = 0.0f;     //积分
        sptr->Derivative    = 0.0f;     //微分

        sptr->LastError     = 0u;       //前2次误差值
        sptr->PrevError     = 0u;       //前1次误差值

        sptr->iError        = 0;        //当前误差
        sptr->iIncpid       = 0;        //输出返回值

    }

    /********************PID算法实现********************/
    /**
    * 输入参数:当前控制量
    * 返 回 值:目标控制量
     */
    int IncPIDCalc(int CurrPoint)
    {
        //当前误差
        sptr->iError = sptr->SetPoint - CurrPoint;

        /* 消除抖动误差 */
        if((sptr->iError<0.05f )&& (sptr->iError>-0.05f))
            sptr->iError = 0.0f;

        //增量误差
        sptr->iIncpid = sptr->Proportion * sptr->iError         //E[k]项
                        - sptr->Integral * sptr->LastError      //E[k-1]项
                        + sptr->Derivative * sptr->PrevError;   //E[k-2]项
        //存储误差,用于下次计算
        sptr->LastError = sptr->iError;
        sptr->PrevError = sptr->LastError;

        //输出值限幅
        if (sptr->iIncpid >= MAXOUT)
        {
            sptr->iIncpid = MAXOUT;
        }
        else if(sptr->iIncpid <= 0u)
        {
            sptr->iIncpid = 0;
        }
        else sptr->iIncpid = sptr->iIncpid;

        return (sptr->iIncpid);
    }

    /********************更改目标温度********************/
    void PID_SetValue(PID *pid, int sv)
    {
        pid->Sv = sv;
    }

3. 参数调试

调整方式(on) 上升时间超调量安定时间稳态误差稳定性
↑ Kp减少 ↓增加 ↑小幅增加 ↗减少 ↓变差 ↓
↑ Ki小幅减少 ↘增加↑增加 ↑大幅减少↓↓变差↓
↑ Kd小幅减少 ↘减少↓减少↓变动不大→变好 ↑

请添加图片描述

4. 二者区别

实际应用中大多用增量式PID。优点是:控制增量Δu(k)的确定仅与最近3次的采样值有关,容易通过加权处理获得比较好的控制效果,并且在系统发生问题时,增量式不会严重影响系统的工作。

  • 24
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kr.Forver

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值