首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[分享]各种PID算法和优化

发布于 2025-04-16 11:41:37
0
38

1. 经典PID公式位置式PID公式增量式PID公式PID适用范围: 线性时不变低阶(二阶及以下)控制系统,当然可以通过一些优化来一定程度上解决非线性和将高阶系统简化至二阶以下1.1 离散位置式PID...

1. 经典PID公式

图片alt

位置式PID公式

图片alt

增量式PID公式

PID适用范围: 线性时不变低阶(二阶及以下)控制系统,当然可以通过一些优化来一定程度上解决非线性和将高阶系统简化至二阶以下

1.1 离散位置式PID公式

u(k) = P error_now + I error_sum + D *(error_now- error_last)

  • error_now 当前误差

  • error_sum 误差累积

  • error_now- error_last 上次误差与当前误差的差值

  • 常用于位置环,例如平衡车的角度环

  1. 三个参数的简单理解

    • 比例项,只有当前误差有关,相位为0,对输出只有增益作用

    • 积分项,误差累积,误差随着时间的积累,具有滞后性,可以减少稳态误差

    • 微分项,误差变化率,反映了系统未来,具有超前性,及其容易受到高频噪声影响

  2. 三个环节的作用

    • 比例环节:起主要控制作用,使反馈量向目标值靠拢,但可能导致振荡

    • 积分环节:消除稳态误差,但可能会增加超调

    • 微分环节:产生阻尼效果,抑制振荡和超调,但会降低响应速度

1.2 离散增量式PID公式

∆u(k) = u(k) - u(k-1) = P [e(k) - e(k-1)] + I e(k) + D * [e(k) - 2e(k-1) + e(k-2)]

u(k) = u(k - 1) + ∆u(k)

  1. 比例项,当前误差差值

  2. 积分项,当前误差

  3. 微分项,当前误差差值 - 上一次误差差值

  4. ∆u(k)为本次的增量

  5. u(k)为总的输出量, 其实也是位置式的PID

  • 常用于速度环,例如步进电机速度环控制

1.3 增量式和位置式的区别

  1. 位置式PID: 直接输出 绝对控制量

  • 位置式 PID 适合:需要绝对位置输出、高频响应或复杂动态系统。(角度环)

  1. 增量式PID: 输出 控制量的增量

  • 增量式 PID 适合:执行机构支持增量控制、需避免积分饱和(积分限幅)、资源受限的系统。(例如步进电机)

2. PID的优化或变式

2.1 串级PID

串级PID的参数整定一般遵循从内到外,先整定内环PID的参数,再整定外环PID的参数

图片alt

2.2 并级PID

图片alt

2.3PID变式

为了增强PID的控制效果衍生很多的PID,常见的有如下:

1. 对于积分项的优化

  • 积分分离 或 积分限幅:当系统启动或结束时这种目标值短时间大幅变化时(例如小车启动),系统会有很大的偏差(error),会导致积分项过度积累,造成较大的超调和长时间波动
    所以针对这种目标值短时间大幅变化的场景,我们可以使用积分分离或者积分限幅PID进行优化
    积分分离,当error过大时,积分项(I)设置为0,其他情况才使用积分项进行运算

    积分限幅,对积分项(I)的值做一个上限(防止过冲)或下限(消除积分死区)

  • 消除积分死区:当设置的目标输出(如:pwm输出)离散区间过小时,PID计算时error可能会出现小于0(死区)的情况,导致积分项失效
    两种解决方法:

    1. 增大离散区间,提高运算精度

    2. 积分限幅(下限)

  • 变速PID: 动态改变积分项,偏差越大,积分越慢,反之则越快。

2. 对于微分项的改进

  • 不完全微分: 一般作为error反馈的传感器会出现高频噪声,而我们的离散微分项 (error(k) - error(k-1)) 就很容易受到高频噪声的干扰所以我们需要使用滤波算法(一阶低通滤波器)来对微分项进行滤波,消除高频干扰
    不完全微分: 消除高频干扰,不完全微分项公式 [D ((1-a) error(k) - a * error(k-1))],通过修改a来修改截止频率,由公式易得,a越大,截止频率越小,低通滤波效果越好

  • 微分先行PID: 只对被控量微分,不对误差(error)微分,适合于给定值频繁变化的场合,避免给定值变化时可能引起的振荡

3. 带死区PID

  • 带死区PID: 当负载过大时,整个控制系统可能会变为非线性系统,原先小的输出没有响应(出现死区),误差到达需要调节的阈值才开始pid计算

  • kx(线性系统) 和 kx+1(非线性系统)类似这种情况造成的死区

  • 举个例子,当小车的总重量过大(负载过大),导致占空比小的pwm对电机没有输出响应,此时我们我们可以在pid输出的结果加上死区电压(pwm)或者,当error小于阈值时输出固定能够驱动电机的pwm,当error大于阈值时,正常使用PID计算输出

2.4滤波

引入反馈时,由于传感器的输出往往带有高频噪声或者温漂导致输出失真,需要对输出值进行滤波

常用的滤波算法有

  • 一阶低通滤波(常用于微分项),即不完全微分

  • 卡尔曼滤波(常用于IMU)

  • 均值滤波

  • 等等

评论
一个月内的热帖推荐
站长交流