1. 双轮平衡车的核心原理与挑战
双轮平衡车本质上是一个倒立摆系统,其核心在于通过实时调整电机转速来对抗重力作用下的自然倾倒趋势。这种动态平衡的实现依赖于三个关键要素:姿态感知、控制算法和执行机构。
1.1 倒立摆的物理模型分析
从力学角度看,双轮平衡车可以简化为一个带有自由度的倒立摆模型。当车体偏离垂直位置时,会产生一个倾倒力矩M=mgLsinθ,其中m为车体质量,g为重力加速度,L为质心高度,θ为倾角。要维持平衡,电机需要产生一个与之抗衡的力矩,这个对抗力矩通过轮胎与地面的摩擦力实现。
1.2 实时控制的关键需求
平衡车的控制具有几个显著特点:
- 高实时性:从检测到姿态变化到输出控制信号必须在毫秒级完成
- 非线性:大角度时sinθ≈θ的线性近似不再成立
- 强耦合:俯仰角与移动速度相互影响
- 扰动敏感:地面不平、负载变化都会影响系统稳定性
1.3 传感器选型考量
MPU6050作为常用的6轴运动传感器,集成了3轴加速度计和3轴陀螺仪,其优势在于:
- 数字输出(I2C接口)简化了电路设计
- 内置DMP(数字运动处理器)可减轻主控负担
- 16位ADC提供足够的分辨率
- 成本低廉且供应稳定
实际使用中发现,MPU6050的原始数据存在明显的零偏和噪声,必须进行软件滤波。常用的互补滤波算法计算量小且效果良好,适合在STM32上实现。
2. 硬件系统设计与实现
2.1 主控单元选型
STM32F103C8T6(蓝桥杯开发板常用型号)的主要优势:
- Cortex-M3内核提供足够的计算性能(72MHz主频)
- 丰富的外设接口(PWM、ADC、USART等)
- 64KB Flash和20KB RAM满足中等复杂度控制需求
- 广泛的社区支持和开发资源
c复制// 典型时钟配置(使用8MHz外部晶振)
RCC_HSEConfig(RCC_HSE_ON);
while(!RCC_WaitForHSEStartUp());
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
2.2 电机驱动电路设计
TB6612相比传统L298N的优势:
- 效率更高(MOSFET vs 双极型晶体管)
- 最大电流1.2A(连续)/3.2A(峰值)
- 低导通电阻(0.3Ω)
- 内置待机功能降低功耗
典型接线方式:
code复制PWMA -> TIM1_CH1
AIN1 -> GPIOB_12
AIN2 -> GPIOB_13
STBY -> 3.3V
VM -> 7.4V锂电池
VCC -> 3.3V
实际调试中发现,电机电源与逻辑电源必须分开供电,共地处理不当会导致PWM信号异常。建议使用磁珠或0Ω电阻进行单点接地。
2.3 电源管理系统
7.4V锂电池供电方案需要考虑:
- 开关稳压电路(如LM2596)提供5V
- LDO(如AMS1117-3.3)提供稳定3.3V
- 电压监测电路(电阻分压+ADC)
- 低电压报警(比较器或软件实现)
3. PID控制算法实现
3.1 位置式PID公式分解
标准PID离散公式:
code复制u(k) = Kp*e(k) + Ki*∑e(j) + Kd[e(k)-e(k-1)]
其中:
- e(k) = θ_target - θ_actual(角度偏差)
- Kp:比例系数,决定响应速度
- Ki:积分系数,消除稳态误差
- Kd:微分系数,抑制振荡
3.2 代码实现优化
c复制typedef struct {
float Kp, Ki, Kd;
float integral;
float prev_error;
} PID_Controller;
float PID_Update(PID_Controller* pid, float error, float dt) {
pid->integral += error * dt;
float derivative = (error - pid->prev_error) / dt;
pid->prev_error = error;
// 抗积分饱和处理
pid->integral = constrain(pid->integral, -INTEGRAL_LIMIT, INTEGRAL_LIMIT);
return pid->Kp * error +
pid->Ki * pid->integral +
pid->Kd * derivative;
}
3.3 参数整定经验
采用试凑法调参的典型步骤:
- 先设Ki=0, Kd=0,逐渐增大Kp直到出现等幅振荡
- 记录临界增益Ku和振荡周期Tu
- 根据Ziegler-Nichols规则:
- Kp = 0.6*Ku
- Ki = 2*Kp/Tu
- Kd = Kp*Tu/8
- 微调至最佳效果
实测中发现,角度环的Kp通常在20-50之间,Ki为0.1-1,Kd为100-300。速度环参数通常小一个数量级。
4. 系统集成与调试技巧
4.1 传感器数据融合
互补滤波算法实现:
c复制float ComplementaryFilter(float accel_angle, float gyro_rate, float dt) {
static float angle = 0;
float alpha = 0.98; // 陀螺仪权重
angle = alpha * (angle + gyro_rate * dt) +
(1-alpha) * accel_angle;
return angle;
}
4.2 常见问题排查
现象1:车体剧烈振荡
- 检查MPU6050安装是否牢固
- 降低Kp和Kd值
- 确认采样周期稳定(建议5-10ms)
现象2:向一侧缓慢倾斜
- 校准陀螺仪零偏(静止时读取100次取平均)
- 检查电机输出对称性
- 调整机械重心位置
现象3:响应迟钝
- 增大Kp值
- 检查PWM频率(建议8-10kHz)
- 确认电池电压充足
4.3 进阶优化方向
- 串级PID:外环角度+内环速度
- 模糊PID:应对不同倾角下的非线性
- 状态观测器:估计不可直接测量的状态量
- 能量控制:防止大角度时能量积累导致失控
c复制// 简易速度环实现示例
float target_speed = angle_pid_output;
float actual_speed = (encoder_left + encoder_right) / 2;
float speed_pid_output = PID_Update(&speed_pid, target_speed-actual_speed, dt);
在最终调试阶段,建议先用支架固定车体进行开环测试,观察PWM输出是否符合预期。逐步增加倾斜角度,验证控制效果。实际路测时,做好防摔措施,建议从墙面辅助开始逐步过渡到自由平衡。
