1. 项目概述:两轮自平衡小车的核心设计思路
两轮自平衡小车是嵌入式系统开发的经典练手项目,它完美融合了传感器技术、控制算法和机电一体化设计。这个基于STM32F103C8T6的方案,通过MPU6050陀螺仪实时感知车身姿态,采用PID算法动态调整电机转速,实现了自主平衡功能。相比市面上的玩具级产品,这套设计有三个显著特点:一是提供了蓝牙/WiFi/视频监控三种无线控制方式可选;二是具备完整的本地交互界面(OLED+按键);三是加入了锂电池管理系统,包括电压监测和低压报警功能。
从硬件架构来看,系统可以分为感知层(MPU6050陀螺仪+编码电机)、控制层(STM32主控)、执行层(TB6612电机驱动)和人机交互层(OLED+按键+无线模块)。这种模块化设计让每个功能单元都能独立调试,比如你可以先验证PID算法在静态平衡时的表现,再逐步加入运动控制功能。我在实际调试中发现,电机响应速度与PID参数需要反复微调,建议准备一套可快速更换的测试用电池,避免因电量下降影响调试结果。
2. 硬件设计详解与选型考量
2.1 核心控制器:STM32F103C8T6的优劣势分析
选择这款Cortex-M3内核单片机主要基于三点考虑:首先是72MHz主频足够处理PID运算(实测单个PID循环仅需12μs);其次是内置的硬件PWM模块能精准控制电机转速;最后是丰富的外设接口(5个USART、2个I2C、3个SPI)完美适配各类传感器。但要注意其64KB Flash在加入无线协议栈后会显得紧张,建议开启编译器优化并合理使用内存池。
关键提示:使用CubeMX初始化外设时,务必检查PWM频率与电机驱动匹配。TB6612的最佳驱动频率在1kHz-10kHz之间,过高会导致MOS管过热。
2.2 姿态感知:MPU6050的校准与数据处理
MPU6050集成了3轴加速度计和3轴陀螺仪,通过I2C接口输出原始数据。实际使用中会遇到两个主要问题:一是传感器零点漂移,需要通过上电自动校准解决(将静止时的输出作为偏移量);二是加速度计高频噪声与陀螺仪积分误差,需要采用互补滤波融合数据。以下是典型的校准流程:
- 小车水平静止放置3秒
- 连续采样100次原始数据求平均值
- 将平均值写入偏移量寄存器
- 验证各轴输出是否接近0(误差<0.1g)
2.3 电机驱动方案对比:TB6612 vs L298N
TB6612相比传统的L298N有三个明显优势:效率更高(MOSFET vs 达林顿管)、支持1.2A持续电流(峰值3.2A)、内置死区控制防止短路。但在布线时要注意:
- VM电机电源必须与单片机电源隔离
- PWMA/PWMB引脚需接10kΩ上拉电阻
- 电机两端必须并联续流二极管
3. 控制算法实现与参数整定
3.1 PID控制器的具体实现
平衡控制采用位置式PID算法,其离散化公式为:
code复制输出 = Kp×误差 + Ki×积分项 + Kd×微分项
在代码中需要特别注意:
- 积分项需设限幅防止windup
- 微分项建议采用不完全微分(α=0.2)
- 采样周期严格保持5ms(通过定时器中断实现)
典型参数范围(需根据实际车体调整):
- 角度环:Kp=35, Ki=0.5, Kd=0.8
- 速度环:Kp=120, Ki=2, Kd=0
3.2 无线控制协议设计
蓝牙/WiFi通信采用统一的帧格式以提高兼容性:
code复制[头字节0xAA][功能码][数据长度][数据...][校验和]
功能码定义示例:
- 0x01:启动/停止
- 0x02:运动控制(前进/后退/转向)
- 0x03:参数设置
在STM32端采用DMA+空闲中断接收数据,实测在10ms间隔下通信稳定。一个常见问题是手机APP快速连发指令导致缓冲区溢出,解决方法是在协议层加入序号检测和重传机制。
4. 电源管理与低功耗设计
4.1 锂电池充放电电路
采用TP4056充电芯片+XL6009升压的方案,关键设计要点:
- 充电电流设置为0.5C(对于2000mAh电池即1A)
- 升压输出稳定在12V(调节反馈电阻R1=100kΩ, R2=10kΩ)
- 在VBAT引脚接100μF钽电容抑制电机干扰
电压检测电路采用电阻分压(100kΩ+20kΩ),经RC滤波后接入ADC。低压报警阈值建议设为10.8V(3.6V/单体),通过以下公式计算:
code复制报警电压 = (R1+R2)/R2 × ADC参考电压
4.2 系统级功耗优化技巧
尽管是常供电设备,但通过以下措施可延长电池续航:
- 动态调整OLED刷新率(平衡时降至10Hz)
- 无线模块空闲时进入SNOOZE模式
- 关闭未使用的外设时钟(如ADC完成采样后立即关闭)
- 电机PWM采用快速衰减模式减少MOS管损耗
5. 调试技巧与常见问题解决
5.1 机械结构对稳定性的影响
车体设计不当会导致无法平衡的假象,需检查:
- 重心高度应低于轮轴(建议比例1:1.5)
- 电机轴与轮毂必须同心(偏心会引入周期性振动)
- 轮胎选择60-70A硬度的硅胶轮(抓地力与减震平衡)
5.2 PID参数整定实战步骤
推荐采用"先角度后速度"的调试顺序:
- 仅启用角度环P项,增大Kp直到出现等幅振荡
- 加入D项抑制振荡,通常Kd=Kp×0.02
- 最后加入小量Ki消除静差(不超过Kp/50)
- 速度环参数按同样流程,从Kp开始调试
5.3 典型故障排查指南
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 车体单侧倾斜 | 电机出力不均 | 重新校准PID输出限幅 |
| 剧烈抖动 | 微分增益过高 | 降低Kd或增加低通滤波 |
| 响应迟钝 | 采样周期过长 | 检查定时器配置是否准确 |
| 无线控制延迟 | 缓冲区溢出 | 增加协议应答机制 |
6. 扩展功能实现思路
对于想进一步提升功能的开发者,可以考虑:
- 加入IMU数据融合(如Mahony滤波)提升姿态解算精度
- 通过编码器实现里程计功能(需扩展STM32定时器输入捕获)
- 移植FreeRTOS实现多任务调度(注意堆栈大小设置)
- 开发PC端调参工具(基于Qt或PyQt)
我在实际项目中发现,给电机加装散热片能显著提升连续工作稳定性——当环境温度超过35℃时,未加散热片的驱动芯片温升可达40℃,而加装后仅上升25℃。另一个实用技巧是在轮毂内侧粘贴配重铅块,能有效降低重心且不影响外观。