回复:增量式PID带死区的公式有吗

已锁定

ligp99

  • 帖子

    926
  • 精华

    0
  • 被关注

    33

论坛等级:侠圣

注册时间:2008-06-13

钻石 钻石 如何晋级?

发布于 2021-12-15 18:01:10

2楼

展开查看
以下是引用ligp99在2021-12-15 11:25:40的发言 >楼主

增量式PID带死区的公式有吗

增量式PID


比例P :    e(k)-e(k-1)   当前误差 - 上次误差


积分I :   e(i)     当前误差   


微分D :  e(k) - 2e(k-1)+e(k-2)   当前误差 - 2*上次误差 + 上上次误差


 增量式PID根据公式可以很好地看出,一旦确定了 KP、TI  、TD,只要使用前后三次测量值的偏差, 即可由公式求出控制增量


而得出的控制量


▲u(k)对应的是近几次位置误差的增量,而不是对应与实际位置的偏差 没有误差累加

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


总结:增量型 PID,是对位置型 PID 取增量,这时控制器输出的是相邻两次采样时刻所计算的位置值

之差,得到的结果是增量,即在上一次的控制量的基础上需要增加(负值意味减少)控制量。


代码实现效果如下:


//根据增量式离散PID公式 

//pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]

//e(k)代表本次偏差 

//e(k-1)代表上一次的偏差  以此类推 

//e(k-2)代表上上次的偏差

//pwm代表增量输出

 

typedef struct PID

  float kp;

  float ki;

  float kd;

  float ek;     //当前误差

  float ek_1;   //上一次误差

  float ek_2;   //上上一次误差

  float limit;  //限幅

}PID;

 

static PID pid;

 

void PID_Init()

{

    pid.kp = 0.1;

    pid.ki = 0.2;

    pid.kd = 0.3;

    pid.limit = 1000;

    pid.ek = 0;

    pid.ek_1 = 0;

    pid.ek_2 = 0;

}

 

// 增量式PID控制

float PID_Increase(int Encoder,int Target)

{

    float pwm = 0;

    pid.ek = Target - Encoder; // 计算当前误差

    pid.ek_sum += pid.ek;      //求出偏差的积分

    pwm = pid.kp*(pid.ek - pid.ek_1) + pid.ki*pid.ek + pid.kd*(pid.ek - 2*pid.ek_1 + pid.ek_2);   //增量式PID控制器

    pid.ek_1 = pid.ek;   //保存上一次偏差 

    pid.ek_2 = pid.ek_1; //保存上上一次的偏差

    if(pwm > pid.limit)

    {

      pwm =  pid.limit;

    }

    else if(pwm < -pid.limit)

    {

      pwm =  -pid.limit;

    }

    return pwm;

}

————————————————

版权声明:本文为CSDN博主「苏守坤」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u014453443/article/details/100573722


有你帮助有我成长
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10590条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。