PID的算法改进

发布时间:2026/7/7 8:27:24
PID的算法改进 #本系列用来记录和输出自己学习PID的记录看的是江协)#out(t) Kp * error(t) Ki *error(t)dt Kd *1、积分限幅防止积分饱和是指对误差的积分累加器∑error设置最大值 Imax 和 Imin而不是限制乘完 Ki 后的结果。它的作用是防止执行器达到物理极限如PWM满幅后积分项仍在疯狂累加。当实际值因负载过重无法跟上目标值时积分项会将累加器撑爆导致系统在目标值突变时产生巨大的滞后和震荡。通过在累加器上设置“天花板”可以有效扼制这种情况保证系统在饱和状态下依然能快速恢复控制。// 1. 累加误差原始数据integral_sum error;// 2. 【关键步骤】在这里限幅限制的是累加和而不是乘完Ki的结果if (integral_sum INTEGRAL_MAX) integral_sum INTEGRAL_MAX;if (integral_sum INTEGRAL_MIN) integral_sum INTEGRAL_MIN;// 3. 最后再乘上 Ki 系数输出integral_output Ki * integral_sum;2、积分分离设置一个误差阈值当误差值很大时候关闭I项的控制使用PD控制当误差小的时候打开I项使用PID控制。其主要式解决过冲或者超调的问题。那么主要是解决的呢当我们设置PI控制后P向目标值进发I累计误差当P冲到顶了I项误差累积加起来了I项就会有惯性了I是之前所有时刻的误差累积就会超出目标值就产生了超调当我们设置了分离后不让I提早加入只有P到头后I在加入累积的误差很小就不会产生了。当然了如果P给我过打也会产生超调if (abs(error) 阈值){integral 0; // 或者不进行累加// 此时输出 P项 D项}else{integral Ki * error; // 只有接近目标时才累积}3、变速积分变速积分的实质是根据误差大小动态调节积分项的有效增益Ki * α。误差越大积分增益被压缩得越小误差越小积分增益恢复得越大。引入一个动态系数 α阿尔法取值范围 0 ~ 1。最终参与积分的有效系数 Ki × α误差大时α 趋近于 0相当于把 Ki 临时缩小了。误差小时α 趋近于 1相当于 Ki 满血复活。学到这里我们知道误差越大Ki越小误差越小Ki越大但是我就有个问题不应该是误差越大Ki越大误差越小Ki越小我这的理解对于P项来理解是没有问题但是放在I项来理解就错完了因为假设目标值是100P项为推到了95我们距离目标值只剩下5那么这个时候我们是不是应该让积分项工作呢所以I项只能是趋向1而不能是0当为0时候I项不工作的输出值就一直停留在了95.#define ERROR_MAX 100.0 // 设定误差的最大范围#define ERROR_MIN 10.0 // 设定误差的最小范围死区边界float get_variable_coefficient(float error){float abs_err fabs(error);if (abs_err ERROR_MAX)return 0.0; // 误差极大放弃积分防止超调else if (abs_err ERROR_MIN)return 1.0; // 误差很小全额积分消除静差else// 线性渐变 (误差越大系数越接近0)return (ERROR_MAX - abs_err) / (ERROR_MAX - ERROR_MIN);}// 在主循环中float alpha get_variable_coefficient(error);integral Ki * alpha * error; // 积分累加使用了变速系数