1. 项目概述:两轮平衡车的核心挑战与STM32解决方案
两轮自平衡车作为经典的嵌入式系统综合项目,完美融合了传感器技术、控制算法和机电一体化设计。这个看似简单的玩具背后,隐藏着三个核心工程难题:实时姿态感知、动态平衡控制和电机精准驱动。我选择STM32F103C8T6作为主控芯片,不仅因为其72MHz主频能轻松应对10ms周期的控制循环,更看重其丰富的外设资源——3个USART、2个SPI和2个I2C接口为多传感器集成提供了硬件基础。
在项目初期,我对比了MPU6050和BMI160两款惯性传感器。最终选用MPU6050的原因很实际:它内置的DMP(数字运动处理器)能直接输出融合后的姿态角,节省了约30%的CPU资源。实测中,原始传感器数据通过I2C接口以400kHz速率传输,配合STM32的DMA控制器,数据采集耗时稳定在0.8ms以内。这个时间预算对控制周期至关重要,因为留给算法执行和电机控制的时间窗口必须严格保证。
关键提示:STM32的GPIO速度配置常被忽视。将传感器接口的GPIO设为高速模式(50MHz)后,I2C通信稳定性显著提升,特别是在电机PWM干扰环境下。
2. 硬件架构设计与PCB工程实战
2.1 电源系统的可靠性设计
平衡车的电源架构需要同时满足数字电路、电机驱动和传感器的不同需求。我的方案采用两级电源管理:第一级是3.7V锂电池升压到12V供给电机驱动模块,第二级通过AMS1117-3.3将12V降压为3.3V供STM32和传感器使用。在PCB布局时,特别注意了以下几点:
- 电机驱动电源与数字电源完全隔离,采用磁珠FB1-FB3进行噪声抑制
- 在STM32每个电源引脚放置0.1μF去耦电容,VREF+引脚额外增加1μF钽电容
- 地平面采用星型连接,AGND与DGND在电源芯片下方单点连接
实测表明,这种设计使得电机启停时STM32供电电压波动小于50mV,完全满足ADC参考电压的稳定性要求。
2.2 电机驱动电路优化
TB6612FNG驱动芯片是比传统L298N更优的选择,效率提升约40%。原理图中特别注意了:
- VM电机电源引脚并联470μF电解电容和0.1μF陶瓷电容组合
- 每个MOSFET栅极串联10Ω电阻抑制振铃
- 电机输出端加入TVS二极管防护ESD
PCB布局时将驱动芯片尽量靠近电机接口,PWM信号走线采用等长设计(误差<50mil),有效避免了电机高频开关导致的信号完整性问題。
3. 软件控制算法实现
3.1 姿态解算的三种方案对比
在姿态解算环节,我测试了三种方案:
- 互补滤波:代码量最小(约50行),但动态响应差
- 卡尔曼滤波:效果最优,但STM32F103实现需要约15%CPU资源
- Mahony滤波:折中方案,调整参数后静态误差<0.5°
最终选择Mahony滤波,其核心代码如下(关键参数已优化):
c复制void MahonyAHRSupdate(float gx, float gy, float gz,
float ax, float ay, float az,
float mx, float my, float mz) {
float recipNorm;
float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;
float hx, hy, bx, bz;
float halfvx, halfvy, halfvz, halfwx, halfwy, halfwz;
float halfex, halfey, halfez;
// 省略具体实现...
// 关键参数:Kp=0.5f, Ki=0.0f 时响应速度与稳定性最佳
}
3.2 PID控制器的工程调参
平衡控制采用串级PID结构:
- 外环:角度环(P=28.0, I=0.5, D=0.3)
- 内环:速度环(P=0.15, I=0.02, D=0)
调参过程中发现几个关键现象:
- 微分项D超过0.5时电机出现高频振荡
- 积分项I需要加入抗饱和处理
- 采样周期从5ms改为10ms后系统更稳定
最终采用的PID实现包含输出限幅和积分分离:
c复制typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
float max_output;
} PID_Controller;
float PID_Update(PID_Controller* pid, float error, float dt) {
float proportional = pid->Kp * error;
// 积分分离:误差大时不积分
if(fabs(error) < 0.5f) {
pid->integral += pid->Ki * error * dt;
}
float derivative = pid->Kd * (error - pid->prev_error) / dt;
pid->prev_error = error;
float output = proportional + pid->integral + derivative;
return constrain(output, -pid->max_output, pid->max_output);
}
4. 工程实现中的典型问题与解决方案
4.1 电机干扰导致传感器失效
初期测试中,当电机全速运行时MPU6050经常输出乱码。通过示波器捕获发现电源线上有200mVpp的高频噪声。解决方案:
- 在传感器电源入口增加π型滤波(10Ω+100μF+0.1μF)
- I2C线上串联100Ω电阻并增加2.2nF电容到地
- 软件上增加CRC校验和超时重试机制
4.2 机械振动引发的误判
车体机械共振导致加速度计输出异常波动。通过FFT分析发现主要共振频率在25Hz左右,因此在软件中增加了二阶低通滤波:
c复制float lpf2(float input, float* buf, float alpha) {
buf[0] = (1-alpha)*buf[0] + alpha*input;
buf[1] = (1-alpha)*buf[1] + alpha*buf[0];
return buf[1];
}
// 调用示例:lpf2(raw_accel, accel_filter_buf, 0.2f);
4.3 答辩展示的实战技巧
在项目答辩时,特别准备了三个演示场景:
- 静态平衡展示:放置不同重量物体测试抗干扰能力
- 动态响应测试:用手推车体展示恢复速度
- 故障模拟:故意遮挡一侧红外传感器演示保护机制
答辩稿中重点突出了三个创新点:
- 采用四层PCB设计降低EMI(比双层板噪声降低12dB)
- 动态调整PID参数算法(根据倾角变化率自适应)
- 低功耗设计(待机电流<5mA)
5. 项目进阶方向与优化空间
当前系统还存在几个可优化点:
- 加入BLE模块实现手机控制(已验证HC-05模块兼容性)
- 改用FOC电机驱动提升能效(正在移植SimpleFOC库)
- 增加TOF传感器实现避障(VL53L0X测试中)
在PCB工艺上,下一版可以考虑:
- 使用4层板将电机电流路径与信号层完全隔离
- 尝试嘉立创的沉金工艺提升接口可靠性
- 在STM32晶振电路周围做guard ring设计
这个项目最让我意外的是,原本以为最难的PID调参其实两周就能稳定,而看似简单的电源设计却反复修改了五次才达标。建议后来者在项目规划时,至少预留30%时间给硬件可靠性测试。
