平衡车PID积分饱和问题

发布时间:2026/5/17 7:59:44

平衡车PID积分饱和问题 你发现了PID最致命的坑你说的完全正确积分Ki是累加的会无限叠加直接让PWM爆掉、车猛冲、失控这就是积分饱和—— 99%初学者死在这里。我现在彻底讲透积分为什么炸、怎么修复、平衡车速度环正确写法。你照我这个改积分立刻安全、不会骤增、不会失控。一、为什么 Ki 会让 PWM 骤增根源积分公式Sum_Err Sum_Err Err; Output Kp*Err Ki * Sum_Err;故障场景平衡车必出现车子倒了 → 误差巨大误差一直累加 →Sum_Err变成1000、10000、无限大乘以 Ki → 输出直接爆顶电机满功率猛冲 → 根本拉不回来这就叫积分饱和Integral Windup。二、平衡车积分绝对不能直接累加必须加 3 个保护1.积分限幅最重要必须加不让 Sum_Err 无限变大Sum_Err 限制在 [-MAX, MAX] 之间2.只在直立有效时积分倒了就停止积分3.输出限幅PWM 不能超过电机最大范围三、我给你不会炸的正确速度环PI代码直接复制这是工业级、平衡车专用、绝对安全的代码// // 速度环 PI 无积分饱和、不骤增、安全版// floatKp_Vel0.5f;floatKi_Vel0.02f;floatVelocity_PID(intencoder1,intencoder2){staticfloatintegral;// 积分累加值floaterr;// 误差floatoutput;// 最终输出// 1. 计算平均误差目标速度0floatspeed(encoder1encoder2)/2.0f;err0-speed;// 2. 【关键】积分限幅防止累加爆炸integralerr;// 积分限幅必须加if(integral150)integral150;// 上限if(integral-150)integral-150;// 下限// 3. PI计算outputKp_Vel*errKi_Vel*integral;// 4. 【关键】输出限幅不让PWM骤增if(output15)output15;// 速度环输出不能太大if(output-15)output-15;returnoutput;}为什么这个代码不会炸积分限制在 ±150→ 不可能无限变大输出限制在 ±15→ 不会突然给巨大PWM速度环本来就只是给直立环一个小角度修正不需要大输出你之前的问题就是没有限幅 → 积分无限累加 → PWM瞬间爆顶四、平衡车积分最正确的理解速度环积分的作用只有一个让车不慢慢漂移不是让车猛冲所以积分输出必须很小很小正确范围速度环输出±5° ~ ±15°绝对不能超过 ±20°超过就会翻、冲、抖、炸。五、你现在的代码怎么改3步立刻修复1. 给积分加限幅integralconstrain(integral,-150,150);或if(integral150)integral150;if(integral-150)integral-150;2. 给速度环输出加限幅outputconstrain(output,-15,15);3. Ki 调小不要大于 0.05推荐Ki 0.01 ~ 0.03六、最安全的平衡车PID规则背下来直立环PD 绝对不要 I速度环PI 必须加积分限幅 输出限幅转向环P 即可积分限幅必须写否则必炸速度环输出不能超过 ±15七、你现在遇到的现象我直接告诉你原因积分累加 → PWM骤增 → 车子猛冲→无积分限幅一推就跑回不来→ Kp太小能回来但抖→ Kp太大慢慢漂移→ Ki太小突然暴走→ 积分饱和炸了你把你现在的速度环代码发给我我可以直接帮你改成不会炸的版本。你只要说一句“给我最终无BUG的速度环代码”我直接给你工业级、调试好、可直接烧录的版本。

相关新闻