1. 项目背景与核心价值
两轮平衡车作为经典的嵌入式控制实践项目,一直是STM32开发者进阶路上的重要里程碑。这个开源项目完整公开了基于STM32F103C8T6的两轮平衡车全套资料,包括硬件设计(原理图+PCB)、控制算法实现和完整的工程代码。不同于市面上零散的平衡车教程,该项目特别注重工程规范性——原理图采用模块化设计,PCB布局充分考虑电磁兼容性,程序架构遵循嵌入式开发最佳实践。
对于想深入掌握STM32在运动控制领域应用的开发者而言,这个项目提供了从传感器数据采集、电机驱动到姿态解算的完整闭环实现。其中MPU6050的卡尔曼滤波处理、TB6612电机驱动电路的设计细节,以及PID参数整定的工程方法,都是可以直接复用到其他运动控制项目的宝贵经验。
2. 硬件设计解析
2.1 核心元器件选型
主控选用STM32F103C8T6这款经典Cortex-M3芯片,主要考虑其:
- 72MHz主频足够处理传感器融合算法
- 内置硬件PWM输出适合电机控制
- 丰富的外设接口(I2C/SPI/USART)
- 性价比高且开发资源丰富
电机驱动采用TB6612FNG模块而非常见的L298N,因为:
- 效率更高(MOSFET vs L298N的达林顿管)
- 最大1.2A持续电流满足小型平衡车需求
- 内置待机电路更省电
- 支持PWM调速和正反转控制
姿态传感器选用MPU6050(6轴IMU),其优势在于:
- 集成3轴加速度计+3轴陀螺仪
- 内置DMP可硬件解算姿态
- I2C接口节省IO资源
- 成本仅10元左右
2.2 原理图设计要点
电源部分采用两级稳压设计:
- 第一级:7.4V锂电池→AMS1117-5.0稳压到5V
- 第二级:5V→AMS1117-3.3V为MCU供电
关键点:在每级稳压前后都布置100μF+0.1μF的退耦电容
电机驱动电路设计特别注意:
- VM引脚接7.4V电池直接供电
- VCC逻辑电源与MCU共地
- 每个电机控制信号串联100Ω电阻防震荡
- STBY引脚通过1k电阻上拉到VCC
传感器接口设计:
- MPU6050的SCL/SDA线路上拉4.7k电阻
- 预留I2C总线扩展接口
- 加速度计量程配置为±4g
- 陀螺仪量程配置为±500°/s
2.3 PCB布局实战技巧
- 电源走线优先原则:
- 主电源线宽≥1mm
- 电机驱动部分采用铺铜方式
- 数字地与功率地单点连接
- 信号完整性处理:
- PWM信号走线等长处理
- 晶振电路包地处理
- 模拟信号远离高频数字线
- 电磁兼容设计:
- 电机驱动部分增加TVS二极管
- 电源入口布置π型滤波电路
- 关键信号线添加磁珠滤波
- 结构适配设计:
- 安装孔与车架匹配
- 传感器板与主控板分离设计
- 所有接插件采用防反插设计
3. 软件架构与核心算法
3.1 工程目录结构
code复制BalanceCar/
├── Drivers/ # HAL库驱动
├── Middlewares/ # 算法中间件
│ ├── MPU6050/ # 传感器驱动
│ └── PID/ # 控制算法
├── Application/ # 应用层
│ ├── main.c # 主循环
│ ├── control.c # 运动控制
│ └── sensor.c # 数据采集
└── Hardware/ # 硬件抽象层
3.2 姿态解算实现
MPU6050数据处理流程:
- 原始数据读取(I2C DMA方式)
- 校准处理(静止状态采集零点偏移)
- 卡尔曼滤波实现:
c复制void Kalman_Filter(float Accel, float Gyro) {
angle += (Gyro - q_bias) * dt;
Pdot[0] = Q_angle - P[0][1] - P[1][0];
Pdot[1] = -P[1][1];
Pdot[2] = -P[1][1];
Pdot[3] = Q_gyro;
P[0][0] += Pdot[0] * dt;
P[0][1] += Pdot[1] * dt;
P[1][0] += Pdot[2] * dt;
P[1][1] += Pdot[3] * dt;
angle_err = Accel - angle;
PCt_0 = C_0 * P[0][0];
PCt_1 = C_0 * P[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
angle += K_0 * angle_err;
q_bias += K_1 * angle_err;
P[0][0] -= K_0 * PCt_0;
P[0][1] -= K_0 * PCt_1;
P[1][0] -= K_1 * PCt_0;
P[1][1] -= K_1 * PCt_1;
}
3.3 控制算法实现
采用串级PID控制结构:
- 外环:角度环(P控制)
- 内环:速度环(PI控制)
c复制void Balance_PID_Control(void) {
// 角度环计算
angle_out = Kp_angle * (target_angle - real_angle);
// 速度环计算
speed_err = target_speed - encoder_speed;
speed_integral += speed_err;
speed_out = Kp_speed * speed_err + Ki_speed * speed_integral;
// 输出合成
motor_out = angle_out + speed_out;
// 输出限幅
motor_out = constrain(motor_out, -MAX_PWM, MAX_PWM);
// 电机驱动
Set_PWM(MOTOR_L, motor_out);
Set_PWM(MOTOR_R, motor_out);
}
4. 调试经验与优化技巧
4.1 硬件调试要点
- 电源测试:
- 上电前先测各电源对地阻抗
- 逐步上电观察电流变化
- 重点检查3.3V纹波(应<50mV)
- 电机驱动测试:
- 先断开电机,用示波器观察PWM波形
- 测试正反转逻辑是否正确
- 带载测试时监测MOS管温度
- 传感器测试:
- 使用MPU6050官方工具验证数据
- 检查I2C总线波形(SCL频率≤400kHz)
- 静态测试各轴零偏数据
4.2 软件调试技巧
- 数据可视化调试:
- 通过串口发送关键变量到上位机
- 使用VOFA+等工具绘制曲线
- 典型监测变量:
- 原始加速度/陀螺仪数据
- 滤波后角度
- PWM输出值
- PID参数整定步骤:
code复制(1) 先调角度环P,从小到大增加直到出现小幅振荡
(2) 加入速度环P,观察车体移动响应
(3) 最后加速度环I,消除稳态误差
(4) 微调各参数达到最佳动态响应
- 常见问题排查:
- 车体往一边偏:检查电机一致性/安装平衡
- 高频振荡:降低P参数或增加机械阻尼
- 响应迟钝:检查传感器数据更新频率
4.3 性能优化方向
- 算法层面:
- 将卡尔曼滤波改为互补滤波降低计算量
- 加入运动加速度补偿
- 实现参数自动整定功能
- 工程优化:
- 使用RTOS实现任务调度
- 加入低功耗模式
- 开发手机蓝牙调试APP
- 扩展功能:
- 增加超声波避障
- 实现路径跟踪
- 添加WiFi远程监控
5. 项目资源与开发建议
5.1 关键开发工具
- 硬件工具清单:
- ST-Link V2编程器
- 数字示波器(≥50MHz)
- 逻辑分析仪(可选)
- 万用表(带频率计功能)
- 软件工具链:
- Keil MDK(或STM32CubeIDE)
- Altium Designer(或立创EDA)
- 串口调试助手(推荐SecureCRT)
- 3D建模软件(设计车架用)
5.2 学习路径建议
- 基础准备阶段:
- 掌握STM32基本外设开发
- 学习PCB设计基本规范
- 理解PID控制原理
- 项目实践阶段:
- 先复现本项目基础功能
- 尝试修改机械结构
- 优化控制算法参数
- 进阶提升方向:
- 研究更先进的控制算法(如LQR)
- 开发可视化调试工具
- 实现多车协同控制
5.3 开源资料使用建议
- 工程文件使用注意:
- 原理图用AD19及以上版本打开
- 程序需安装HAL库支持包
- PCB生产文件需检查工艺参数
- 二次开发建议:
- 保留原始版本备份
- 使用Git进行版本管理
- 修改硬件时注意接口兼容性
- 常见问题FAQ:
Q: 为什么我的车体一直振荡?
A: 检查机械结构是否松动,降低P参数,增加D参数
Q: MPU6050数据不稳定怎么办?
A: 确保传感器安装牢固,检查电源质量,适当增加滤波强度
Q: 电机响应不一致如何解决?
A: 单独测试每个电机,检查驱动电路,可加入软件补偿系数
