基于STM32的平衡车外设控制实战指南:从代码到调参全解析

一、项目概述与核心原理
本项目采用STM32F103C8T6主控芯片,通过MPU6050六轴传感器采集车体姿态数据,结合串级PID控制算法实现双轮平衡车的动态平衡控制。系统核心模块包括:

  • 姿态感知层:MPU6050实时采集三轴加速度和角速度数据,通过四元数算法解算俯仰角(Pitch)和横滚角(Roll)
  • 控制算法层:外环PID控制车体速度,内环PID控制平衡角度,形成双闭环控制系统
  • 执行驱动层:TB6612FNG电机驱动芯片控制双电机转速,支持PWM调速和方向切换

关键特性:支持手机APP远程控制、自动安全保护机制、实时数据可视化(通过串口输出)


二、硬件配置与电路设计

  1. 核心硬件清单
    | 模块 | 型号/参数 | 接口方式 |
    |-------------|------------------------------|----------------|
    | 主控芯片 | STM32F103C8T6 | I2C1、TIM2/3 |
    | 姿态传感器 | MPU6050(I2C协议) | PB6/PB7 |
    | 电机驱动 | TB6612FNG双路驱动 | TIM2/3 PWM输出 |
    | 电源管理 | LM2596降压模块(12V→5V) | 18650锂电池 |
    | 扩展功能 | HC-05蓝牙模块(串口通信) | USART2 |
  2. 电路连接要点
  • 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指令
    }
}

四、调试与调参技巧

  1. PID参数整定步骤
  2. 比例项调试:逐步增大Kp值至系统出现振荡,再降低至稳定状态
  3. 微分项调试:在比例项基础上逐步增加Kd值,消除超调现象
  4. 积分项调试:最后引入Ki值,消除静态误差(注意避免积分饱和)

示例参数:平衡环Kp=3.0,Kd=0.1;速度环Kp=2.0,Ki=0.03

  1. 常见问题排查
  • 角度漂移:检查MPU6050的温度补偿算法,添加自校准功能
  • 电机异响:调整PWM频率至20kHz以上,优化电机驱动电路
  • 平衡不稳:检查车轮间距是否符合倒立摆模型参数

五、安全保护机制

  1. 自动停车功能:当俯仰角超过±15°或速度超过10km/h时,触发急停
  2. 低电量保护:检测锂电池电压,低于3.3V时自动断电
  3. 防误触设计:蓝牙指令需通过双重确认(如连续发送两次相同指令)

六、扩展功能开发建议

  1. 手机APP控制:通过蓝牙模块实现速度调节、模式切换
  2. 循迹避障:集成HC-SR04超声波模块,实现动态路径规划
  3. 数据可视化:使用串口助手实时显示角度、速度等参数曲线

如果您觉得这篇文章对你有帮助,欢迎点赞、关注和评论!你的支持是我创作的最大动力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码力金矿(编程高手8)

谢谢您的打赏,我将会更好创作。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值