pid负反馈闭环控制程序

一. 什么是PID

比例-积分-微分(Proportion Integration Differentiation)的简称,PID是一个负反馈闭环控制系统。
pid负反馈闭环控制程序_第1张图片

二. PID应用场景

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

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

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

1. 位置式PID

位置式pid公式
pid负反馈闭环控制程序_第2张图片
ek:Sv -Pv (目标值与当当前值的误差)

2. 增量式PID

增量式pid公式
pid负反馈闭环控制程序_第3张图片
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 小幅减少 ↘ 减少↓ 减少↓ 变动不大→ 变好 ↑

pid负反馈闭环控制程序_第4张图片

4. 二者区别

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

你可能感兴趣的:(c语言,pid,c语言,控制器,算法)