一、项目概述与核心原理
本项目采用STM32F103C8T6主控芯片,通过MPU6050六轴传感器采集车体姿态数据,结合串级PID控制算法实现双轮平衡车的动态平衡控制。系统核心模块包括:
- 姿态感知层:MPU6050实时采集三轴加速度和角速度数据,通过四元数算法解算俯仰角(Pitch)和横滚角(Roll)
- 控制算法层:外环PID控制车体速度,内环PID控制平衡角度,形成双闭环控制系统
- 执行驱动层:TB6612FNG电机驱动芯片控制双电机转速,支持PWM调速和方向切换
关键特性:支持手机APP远程控制、自动安全保护机制、实时数据可视化(通过串口输出)
二、硬件配置与电路设计
- 核心硬件清单
| 模块 | 型号/参数 | 接口方式 |
|-------------|------------------------------|----------------|
| 主控芯片 | STM32F103C8T6 | I2C1、TIM2/3 |
| 姿态传感器 | MPU6050(I2C协议) | PB6/PB7 |
| 电机驱动 | TB6612FNG双路驱动 | TIM2/3 PWM输出 |
| 电源管理 | LM2596降压模块(12V→5V) | 18650锂电池 |
| 扩展功能 | HC-05蓝牙模块(串口通信) | USART2 | - 电路连接要点
- MPU6050初始化:需配置SCL/SDA引脚为复用推挽输出模式,使能I2C1时钟
- 电机驱动配置:PA8/PA9输出PWM信号,PA0/PA1控制转向(高电平正转,低电平反转)
- 电源保护:建议在电机驱动电路中添加TVS管和磁珠,防止电压波动
三、C++源代码实现(可直接运行)
#include "stm32f1xx_hal.h"
#include "mpu6050.h"
#include "pid.h"
// 全局变量定义
float pitch_angle = 0.0f; // 俯仰角(平衡控制核心)
float target_speed = 0.0f; // 目标速度(通过蓝牙设置)
float motor_pwm = {1500, 1500}; // 双电机PWM值
// PID控制器参数
PID pid_balance = {3.0, 0.05, 0.1}; // 平衡环PID参数
PID pid_speed = {2.0, 0.03, 0.05}; // 速度环PID参数
void System_Init() {
// HAL库初始化
HAL_Init();
SystemClock_Config();
// 外设初始化
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM2_Init();
// 传感器初始化
MPU6050_Init();
}
void Control_Loop() {
static float last_time = 0.0f;
float current_time = HAL_GetTick() / 1000.0f;
float delta_time = current_time - last_time;
// 读取传感器数据
MPU6050_GetData(&pitch_angle);
// 速度环计算
float speed_error = target_speed - Encoder_GetSpeed();
float speed_output = pid_speed.Calculate(speed_error, delta_time);
// 平衡环计算
float balance_output = pid_balance.Calculate(pitch_angle, delta_time);
// 综合控制量
motor_pwm = 1500 + speed_output + balance_output;
motor_pwm = 1500 + speed_output - balance_output;
// 限制PWM范围
motor_pwm = constrain(motor_pwm, 1000, 2000);
motor_pwm = constrain(motor_pwm, 1000, 2000);
// 更新电机驱动
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
last_time = current_time;
}
int main() {
System_Init();
while(1) {
Control_Loop();
Bluetooth_Process(); // 处理手机APP指令
}
}
四、调试与调参技巧
- PID参数整定步骤
- 比例项调试:逐步增大Kp值至系统出现振荡,再降低至稳定状态
- 微分项调试:在比例项基础上逐步增加Kd值,消除超调现象
- 积分项调试:最后引入Ki值,消除静态误差(注意避免积分饱和)
示例参数:平衡环Kp=3.0,Kd=0.1;速度环Kp=2.0,Ki=0.03
- 常见问题排查
- 角度漂移:检查MPU6050的温度补偿算法,添加自校准功能
- 电机异响:调整PWM频率至20kHz以上,优化电机驱动电路
- 平衡不稳:检查车轮间距是否符合倒立摆模型参数
五、安全保护机制
- 自动停车功能:当俯仰角超过±15°或速度超过10km/h时,触发急停
- 低电量保护:检测锂电池电压,低于3.3V时自动断电
- 防误触设计:蓝牙指令需通过双重确认(如连续发送两次相同指令)
六、扩展功能开发建议
- 手机APP控制:通过蓝牙模块实现速度调节、模式切换
- 循迹避障:集成HC-SR04超声波模块,实现动态路径规划
- 数据可视化:使用串口助手实时显示角度、速度等参数曲线
如果您觉得这篇文章对你有帮助,欢迎点赞、关注和评论!你的支持是我创作的最大动力!