放弃编码器!纯靠MPU6050和PID算法,我的TT马达平衡小车也能稳如老狗

📅 2026/7/10 6:44:29 👁️ 阅读次数 📝 编程学习
放弃编码器!纯靠MPU6050和PID算法,我的TT马达平衡小车也能稳如老狗

放弃编码器!纯靠MPU6050和PID算法实现TT马达平衡小车

平衡小车一直是嵌入式控制领域的经典项目,但传统方案往往依赖电机编码器获取速度反馈。本文将分享一种无编码器的极简实现方案,仅通过MPU6050姿态传感器和精心调校的PID算法,让低成本TT马达小车达到惊人的稳定性。

1. 硬件方案的精简哲学

在资源受限的场景下,硬件取舍直接决定项目成败。我们选择的核心组件只有三样:STM32F103C8T6最小系统板、MPU6050六轴传感器和TT减速电机。这种组合的成本不到传统方案的1/3,但需要解决两个关键问题:

  • 速度反馈缺失:没有编码器意味着无法直接获取电机转速
  • 传感器噪声:廉价的MPU6050原始数据存在明显漂移

实测数据显示,未滤波的MPU6050角度输出存在约±2°的瞬时波动。为此我们对比了三种滤波方案:

滤波算法计算耗时(us)延迟(ms)稳定性
卡尔曼滤波58015★★★★★
一阶互补滤波325★★★☆
滑动平均滤波82★★☆

最终选择一阶互补滤波作为折中方案,其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结构,分为直立环、速度环和转向环三个层次。这种架构的独特优势在于:

  1. 各环解耦,便于单独调试
  2. 无需速度传感器,通过姿态变化推算速度
  3. 资源占用少,在72MHz的Cortex-M3上仅消耗15%CPU资源

2.1 直立环的"软着陆"策略

直立环负责快速响应角度偏差,其输出公式为:

直立输出 = Kp×角度偏差 + Kd×角速度

调试中发现两个典型现象:

  • 高频抖动:通常因Kd过大引起,表现为电机频繁正反转
  • 缓慢摆动:往往说明Kp不足,小车像钟摆一样来回晃动

经过上百次试验,总结出参数整定的"黄金法则":

  1. 先将Ki设为0,Kd设为Kp的1/10
  2. 逐步增大Kp直到出现轻微振荡
  3. 然后增大Kd直到振荡消失
  4. 最后微调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分钟

这种极简方案证明,精妙的算法设计完全可以弥补硬件上的不足。当看到小车在桌沿自动刹车时,所有调试的艰辛都化作了工程师独有的成就感。