放弃编码器!纯靠MPU6050和PID算法,我的TT马达平衡小车也能稳如老狗
放弃编码器!纯靠MPU6050和PID算法实现TT马达平衡小车
平衡小车一直是嵌入式控制领域的经典项目,但传统方案往往依赖电机编码器获取速度反馈。本文将分享一种无编码器的极简实现方案,仅通过MPU6050姿态传感器和精心调校的PID算法,让低成本TT马达小车达到惊人的稳定性。
1. 硬件方案的精简哲学
在资源受限的场景下,硬件取舍直接决定项目成败。我们选择的核心组件只有三样:STM32F103C8T6最小系统板、MPU6050六轴传感器和TT减速电机。这种组合的成本不到传统方案的1/3,但需要解决两个关键问题:
- 速度反馈缺失:没有编码器意味着无法直接获取电机转速
- 传感器噪声:廉价的MPU6050原始数据存在明显漂移
实测数据显示,未滤波的MPU6050角度输出存在约±2°的瞬时波动。为此我们对比了三种滤波方案:
| 滤波算法 | 计算耗时(us) | 延迟(ms) | 稳定性 |
|---|---|---|---|
| 卡尔曼滤波 | 580 | 15 | ★★★★★ |
| 一阶互补滤波 | 32 | 5 | ★★★☆ |
| 滑动平均滤波 | 8 | 2 | ★★☆ |
最终选择一阶互补滤波作为折中方案,其C语言实现如下:
float ComplementaryFilter(float accelAngle, float gyroRate, float dt) { static float angle = 0; const float alpha = 0.98; // 陀螺仪权重 angle = alpha * (angle + gyroRate * dt) + (1-alpha) * accelAngle; return angle; }2. 控制系统的三层架构
平衡小车的核心控制采用串级PID结构,分为直立环、速度环和转向环三个层次。这种架构的独特优势在于:
- 各环解耦,便于单独调试
- 无需速度传感器,通过姿态变化推算速度
- 资源占用少,在72MHz的Cortex-M3上仅消耗15%CPU资源
2.1 直立环的"软着陆"策略
直立环负责快速响应角度偏差,其输出公式为:
直立输出 = Kp×角度偏差 + Kd×角速度调试中发现两个典型现象:
- 高频抖动:通常因Kd过大引起,表现为电机频繁正反转
- 缓慢摆动:往往说明Kp不足,小车像钟摆一样来回晃动
经过上百次试验,总结出参数整定的"黄金法则":
- 先将Ki设为0,Kd设为Kp的1/10
- 逐步增大Kp直到出现轻微振荡
- 然后增大Kd直到振荡消失
- 最后微调Ki消除静态误差
2.2 速度环的虚拟反馈机制
没有编码器时,我们创造性地利用小车倾角变化推算速度:
虚拟速度 = ∫(直立环输出)这个看似简单的技巧背后有深刻的控制理论支撑——当小车需要加速时,它会主动前倾来产生加速度。速度环PID参数整定要点:
- 比例项Kp决定恢复速度的响应强度
- 积分项Ki用于消除稳态误差
- 微分项Kd通常设为0,避免引入噪声
注意:速度环的输出是作为直立环的角度设定值偏移量,这种耦合关系需要仔细平衡
3. 软件实现的工程技巧
在STM32上实现实时控制需要特别注意时序精度。我们采用以下配置:
- 使用TIM2定时器产生1kHz的中断频率
- PWM输出分辨率设置为16位
- MPU6050采用400kHz I2C通信
关键的中断服务程序框架:
void TIM2_IRQHandler(void) { static uint32_t lastTick = 0; if(HAL_GetTick() - lastTick >= 1) { // 1ms周期 lastTick = HAL_GetTick(); MPU6050_GetData(&sensorData); float angle = Filter_Update(sensorData); float speed = Estimate_Speed(angle); PID_Update(&anglePID, targetAngle - angle); PID_Update(&speedPID, targetSpeed - speed); Motor_Output(anglePID.output + speedPID.output); } }4. 调试过程中的典型问题解决
实际调试中遇到的几个代表性案例:
案例1:启动时剧烈后仰
- 现象:上电瞬间小车猛地向后倒
- 原因:MPU6050未完成校准
- 解决:增加3秒启动延迟,期间采集陀螺仪零偏
案例2:转向时失去平衡
- 现象:转弯时容易向内侧倾倒
- 分析:转向环与直立环耦合过强
- 优化:在转向输出中加入角度补偿项
案例3:电池电压影响稳定性
- 发现:电量降低后控制性能下降
- 措施:增加电压监测,动态调整PWM最大值
经过两周的持续优化,最终实现的小车可以在以下条件下稳定运行:
- 最大倾角恢复:±20°
- 静态平衡误差:<0.5°
- 续航时间:18650电池约45分钟
这种极简方案证明,精妙的算法设计完全可以弥补硬件上的不足。当看到小车在桌沿自动刹车时,所有调试的艰辛都化作了工程师独有的成就感。
