1. 项目概述
两轮自平衡车作为典型的倒立摆控制系统,一直是控制理论和嵌入式开发的经典实践项目。这个看似简单的玩具背后,涉及传感器融合、实时控制算法、电机驱动等多个技术领域的交叉应用。基于STM32的设计方案因其性价比高、生态完善,成为大多数电子爱好者和工程学生的首选平台。
我在2018年第一次尝试制作自平衡车时,花了整整三个月才让它勉强站稳。经过多次迭代优化,现在用STM32F4系列芯片配合MPU6050传感器,从零开始搭建一个能稳定自立的平衡车系统,最快三天就能完成原型开发。这个过程中积累的硬件选型、参数调试和故障排查经验,正是本文要分享的核心内容。
2. 系统架构设计
2.1 核心控制原理
自平衡车的本质是一个一维倒立摆控制系统。当车体偏离垂直位置时,需要通过车轮运动产生反向加速度来维持平衡。这涉及到三个关键物理量:
- 倾角(θ):车体与垂直方向的夹角
- 角速度(ω):倾角变化速率
- 加速度(a):车轮运动产生的线性加速度
这三个量通过牛顿运动定律相互关联,形成经典的闭环控制系统。实际操作中,我们采用PID控制算法来实现实时调节:
code复制控制量 = Kp×角度误差 + Ki×误差积分 + Kd×角速度
2.2 硬件组成框图
完整的系统包含以下模块:
code复制[STM32主控] ←→ [MPU6050传感器]
↓
[电机驱动电路] → [直流减速电机]
↑
[锂电池供电系统]
特别要注意的是电机选型。经过多次测试,我发现减速比在1:30-1:50之间的直流电机最适合DIY项目。太高的减速比会导致响应迟钝,太低则扭矩不足。推荐使用带编码器的JGB37-520电机,价格约50元/个,性能足够稳定。
3. 关键硬件实现
3.1 传感器数据采集
MPU6050作为最常用的6轴IMU传感器,其I2C接口与STM32的连接非常简单:
c复制// STM32硬件I2C初始化
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 400000;
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
HAL_I2C_Init(&hi2c1);
// MPU6050初始化
uint8_t init_data[2] = {0x6B, 0x00}; // 退出睡眠模式
HAL_I2C_Master_Transmit(&hi2c1, MPU6050_ADDR, init_data, 2, 100);
但实际使用中会遇到两个典型问题:
- I2C通信受电机干扰导致数据异常
- 传感器原始数据存在零漂和噪声
解决方法:
- 使用屏蔽双绞线连接传感器
- 在电源端增加10μF钽电容滤波
- 软件上采用移动平均滤波算法
3.2 电机驱动设计
推荐使用TB6612FNG驱动芯片,相比传统的L298N,它具有:
- 更高效率(90% vs 70%)
- 更低发热量
- 内置保护电路
典型接线方式:
code复制PWMA → TIM1_CH1
AIN1 → GPIOB_0
AIN2 → GPIOB_1
STBY → 3.3V
重要提示:务必在电机电源端并联大容量电解电容(至少470μF),否则PWM调速时会导致电源电压波动,影响控制稳定性。
4. 软件算法实现
4.1 姿态解算
MPU6050输出的原始数据需要经过姿态解算才能得到准确的倾角。常用的方法有:
- 互补滤波(实现简单)
c复制angle = 0.98*(angle + gyro*dt) + 0.02*accel_angle;
- 卡尔曼滤波(精度更高)
c复制// 预测步骤
x = A * x + B * u;
P = A * P * A' + Q;
// 更新步骤
K = P * H' / (H * P * H' + R);
x = x + K * (z - H * x);
P = (I - K * H) * P;
对于初学者,建议先用互补滤波实现基本功能,等系统能稳定运行后再尝试卡尔曼滤波。
4.2 PID控制实现
在STM32上实现增量式PID算法:
c复制typedef struct {
float Kp, Ki, Kd;
float err, last_err, integral;
} PID;
float PID_Update(PID* pid, float error, float dt) {
float derivative = (error - pid->last_err) / dt;
pid->integral += error * dt;
pid->last_err = error;
return pid->Kp * error
+ pid->Ki * pid->integral
+ pid->Kd * derivative;
}
参数调试经验:
- 先调Kp让车体能大致反应
- 再调Kd抑制振荡
- 最后加少量Ki消除静差
典型参数范围:
- Kp: 20-50
- Ki: 0.1-1
- Kd: 1-5
5. 系统调试技巧
5.1 上位机监控
使用STM32的USB CDC虚拟串口功能,将关键数据实时发送到电脑,用Python绘制曲线:
python复制import serial
import matplotlib.pyplot as plt
ser = serial.Serial('COM3', 115200)
data = []
while True:
line = ser.readline().decode().strip()
angle, output = map(float, line.split(','))
data.append((angle, output))
plt.plot(data)
plt.pause(0.01)
这种方法可以直观看到PID控制效果,大幅提高调试效率。
5.2 常见故障排查
- 车体持续单向加速
- 检查电机极性是否接反
- 确认传感器安装方向正确
- 测量实际输出电压是否对称
- 高频振荡无法稳定
- 降低Kp,增加Kd
- 检查传感器数据是否有噪声
- 确认控制周期是否稳定(建议2-5ms)
- 响应迟钝
- 提高控制频率
- 检查电池电压是否充足
- 确认电机没有堵转
6. 进阶优化方向
当基础功能实现后,可以考虑以下增强功能:
- 无线遥控功能
- 添加HC-05蓝牙模块
- 实现手机APP控制
- 速度环控制
- 通过编码器获取实际速度
- 增加外环PID控制巡航速度
- 低功耗优化
- 动态调整控制频率
- 增加休眠唤醒功能
- 机械结构改进
- 使用3D打印定制车架
- 优化重心位置
我在第三个版本的车体上实现了所有这些功能,总成本控制在300元以内。最关键的体会是:机械结构的对称性和刚性比算法参数更重要。曾经因为车架1mm的装配误差,导致调参两天都无法稳定,重新加工零件后问题立刻解决。
