恭喜,你发布的帖子
发布于 2021-12-15 18:01:10
2楼
增量式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
请填写推广理由:
分享
只看
楼主