1. 平衡车项目概述
去年夏天我在工作室里折腾出一个会自己站立的"钢铁小强",这个基于STM32的平衡车项目让我整整两周没睡好觉。平衡车的核心原理就像我们骑自行车——身体前倾就加速,后仰就刹车,这种动态平衡的实现背后是一套精密的闭环控制系统。
市面上大多数教学项目都停留在理论层面,而这次我要分享的是从零开始打造一台真正能站立的平衡车全过程。这个项目涉及STM32硬件设计、PID算法调参、传感器数据处理等核心技能,特别适合已经掌握STM32基础开发,想挑战嵌入式控制系统的开发者。
2. 硬件架构设计
2.1 主控选型与外围电路
我选择了STM32F103C8T6作为主控芯片,这块被戏称为"蓝色药丸"的开发板性价比极高。核心外设包括:
- MPU6050六轴传感器(I2C接口)
- TB6612电机驱动模块(PWM控制)
- 12V直流减速电机(编码器反馈)
- 18650锂电池组(带充放电保护)
重要提示:电机驱动一定要选择带死区控制的芯片,否则上电瞬间可能烧毁MOS管。我第一版就因为这个失误损失了两块驱动板。
电源部分采用两级稳压设计:
- 锂电池12V直接供给电机驱动
- 通过LM2596降压到5V给传感器供电
- 再用AMS1117降到3.3V给MCU供电
2.2 机械结构搭建
车体框架我用3D打印件组装,关键参数:
- 轮径:6.5cm
- 轴距:18cm
- 重心高度:12cm
- 整车重量:约800g
这个尺寸比例经过多次迭代测试,重心太高容易振荡,太低则响应迟钝。打印材料建议用PETG,比PLA更有韧性,摔车时不易断裂。
3. 软件系统实现
3.1 传感器数据融合
MPU6050输出的原始数据需要经过三重处理:
- 卡尔曼滤波消除噪声
- 互补滤波融合加速度计和陀螺仪数据
- 角度换算(atan2算法)
c复制// 示例代码:简易互补滤波实现
float angle_calculate(float accel, float gyro, float dt) {
static float angle = 0;
float alpha = 0.98; // 滤波系数
angle = alpha * (angle + gyro * dt) + (1-alpha) * accel;
return angle;
}
3.2 PID控制算法实现
平衡车的核心是直立环PD控制:
math复制Output = Kp×θ + Kd×dθ/dt
运动控制则采用位置式PI算法:
math复制Speed = Kp×e + Ki×∫e dt
参数整定经验值(供参考):
| 控制环 | Kp | Ki | Kd |
|---|---|---|---|
| 直立环 | 80.0 | 0 | 2.5 |
| 速度环 | 150 | 0.5 | 0 |
| 转向环 | 25 | 0.1 | 0 |
调试技巧:先调直立环直到能短暂站立,再加速度环抑制漂移,最后调转向环。
4. 系统调试与优化
4.1 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 车体剧烈振荡 | Kp过大或Kd过小 | 先增大Kd,再微调Kp |
| 缓慢向一侧倾倒 | 机械重心偏移 | 调整配重或校准传感器零偏 |
| 电机发热严重 | PWM频率过低(<1kHz) | 提高PWM频率到5-10kHz |
| 响应延迟明显 | 控制周期过长(>5ms) | 优化代码,确保采样周期≤2ms |
4.2 高级优化技巧
- 参数自整定:记录振荡时的波形,用Ziegler-Nichols法计算临界增益
- 动态调整:根据倾斜角度的变化率自适应调整PID参数
- 运动学约束:限制最大加速度防止失步
- 低通滤波:对编码器速度信号进行二次滤波
5. 项目扩展方向
这个基础框架可以衍生出多种变体:
- 蓝牙遥控版本(添加HC-05模块)
- 循迹功能(增加红外对管阵列)
- 手机APP监控(通过ESP8266上传数据)
- 载人版本(需升级电机和电源系统)
我在第二版中加入了OLED显示屏,实时显示如下信息:
- 当前倾斜角度
- 电池电压
- PID参数
- 电机占空比
- 系统运行时间
调试心得:用4个LED指示灯表示系统状态(电源、传感器、控制、错误),在野外调试时比串口打印更实用。