[PIC32/SAM] 平衡车控制系统是如何实现平衡的

[复制链接]
 楼主| dongnanxibei 发表于 2025-6-24 13:51 | 显示全部楼层 |阅读模式
平衡车控制系统,其平衡实现依赖于高实时性传感器采样、高效姿态解算算法、精准电机控制三者的闭环协作。
一、硬件架构

模块
关键组件
功能说明
主控MCUPIC32MZ EF系列(带FPU和DSP指令)100MHz+主频,硬件浮点加速,实时处理传感器数据
姿态传感器MPU6050(六轴IMU)集成陀螺仪+加速度计,I²C通信
电机驱动MCPWM模块 + DRV8301驱动芯片生成6路PWM,驱动无刷电机
编码器接口QEI模块(正交编码器接口)实时读取电机转速/位置
通信接口UART/USB(调试) + CAN(扩展)数据传输与参数校准

二、软件实现流程
1. 传感器数据采集与融合

  1. // 使用Microchip Harmony框架配置I²C读取MPU6050
  2. void IMU_ReadData(void) {
  3.     uint8_t raw_data[14];
  4.     I2C_Read(MPU6050_ADDR, ACCEL_XOUT_H, raw_data, 14); // 读取14字节原始数据

  5.     // 解析加速度计数据 (范围: ±2g)
  6.     float accel_x = (int16_t)((raw_data[0]<<8) | raw_data[1]) / 16384.0f;
  7.     float accel_z = (int16_t)((raw_data[4]<<8) | raw_data[5]) / 16384.0f; // Z轴垂直重力

  8.     // 解析陀螺仪数据 (范围: ±250°/s)
  9.     float gyro_y = (int16_t)((raw_data[8]<<8) | raw_data[9]) / 131.0f; // Y轴角速度(俯仰)

  10.     // 互补滤波融合
  11.     float dt = 0.01f; // 10ms采样周期
  12.     static float pitch_angle = 0.0f;
  13.     float accel_pitch = atan2(accel_x, accel_z) * 180/M_PI; // 加速度计计算倾角
  14.     pitch_angle = 0.98f * (pitch_angle + gyro_y * dt) + 0.02f * accel_pitch;
  15. }
关键点:利用硬件FPU加速浮点运算,互补滤波权重(0.98/0.02)需实测调整。

2. 双环控制算法实现


  1. // 直立环(PD控制)
  2. float Balance_Control(float pitch, float gyro_y) {
  3.     float Kp = -12.0f;   // 比例系数(负号表示反向调节)
  4.     float Kd = -0.25f;   // 微分系数
  5.     return Kp * pitch + Kd * gyro_y; // 输出电机基础控制量
  6. }

  7. // 速度环(PI控制 + 积分抗饱和)
  8. float Velocity_Control(float target_speed, float current_speed) {
  9.     static float integral = 0;
  10.     float Kp = 0.8f, Ki = 0.05f;
  11.     float error = target_speed - current_speed;
  12.    
  13.     // 积分限幅 (±100)
  14.     if (fabs(error) < 50) integral += error;
  15.     else integral = 0;
  16.    
  17.     return Kp * error + Ki * integral; // 输出速度补偿量
  18. }

  19. // 总控制量合成
  20. void Motor_Output(void) {
  21.     float pitch = IMU_GetPitch();       // 获取当前俯仰角
  22.     float gyro_y = IMU_GetGyroY();      // 获取Y轴角速度
  23.     float speed = QEI_GetSpeed();       // 编码器获取当前车速
  24.    
  25.     float balance_out = Balance_Control(pitch, gyro_y);
  26.     float speed_out = Velocity_Control(0, speed); // 目标速度=0(平衡点)
  27.    
  28.     float total_out = balance_out + speed_out;
  29.    
  30.     // 转换为PWM占空比(范围:-1000~+1000)
  31.     int16_t pwm = (int16_t)(total_out * 10);
  32.     MCPWM_SetDutyCycle(MOTOR_L, pwm);   // 左电机输出
  33.     MCPWM_SetDutyCycle(MOTOR_R, pwm);   // 右电机输出
  34. }
参数整定技巧:

先调直立环:增大 Kp 直至车身能勉强站立,再增大 Kd 抑制振荡
后调速度环:从较小 Ki 开始,避免积分累积导致失控


3. 电机精准驱动(利用MCPWM模块)

  1. // 配置MCPWM(中心对齐模式,死区时间保护)
  2. void PWM_Init(void) {
  3.     MCPWM_ConfigTimeBase(MCPWM_MODULE1, MCPWM_TIMER2,
  4.                          10000,          // PWM频率10kHz
  5.                          MCPWM_TIME_BASE_CLOCK_PBCLK,
  6.                          MCPWM_TIME_BASE_MODE_CONTINUOUS);
  7.    
  8.     // 设置死区时间(防MOSFET直通)
  9.     MCPWM_ChannelDeadTimeSetup(MCPWM_CHANNEL1, 100, 100); // 100ns死区
  10. }

  11. // 更新PWM输出
  12. void MCPWM_SetDutyCycle(MCPWM_CHANNEL ch, int16_t duty) {
  13.     duty = constrain(duty, -1000, 1000); // 限幅
  14.     MCPWM_ChannelPrimaryDutySet(ch, abs(duty)); // 设置占空比
  15.     MCPWM_ChannelOutputPolaritySet(ch, (duty >= 0) ? MCPWM_OUT_POL_ACTIVE_HIGH : MCPWM_OUT_POL_ACTIVE_LOW); // 设置方向
  16. }


三、Microchip方案优势
硬件加速

PIC32MZ的硬件FPU/DSP指令加速矩阵运算(如卡尔曼滤波)。

专用外设

MCPWM模块支持互补PWM、死区插入、故障保护,简化电机驱动设计。

QEI模块自动解码编码器信号,减轻CPU负担。

实时性保障

通过中断优先级配置,确保IMU数据读取(1kHz)> 控制计算(500Hz)> PWM更新(10kHz)的时序链。


四、安全与优化设计
故障保护

  1. // 硬件看门狗+软件超限保护
  2. if (fabs(pitch) > 30.0f) {  // 倾角过大
  3.   MCPWM_ChannelFaultStateSet(MCPWM_CHANNEL1, MCPWM_FAULT_DISABLE); // 立即关闭电机
  4.   Watchdog_Reset();          // 触发看门狗复位
  5. }
低功耗模式

待机时切换至Sleep模式,IMU中断唤醒(电流 < 1mA)。

 楼主| dongnanxibei 发表于 2025-6-24 13:51 | 显示全部楼层
调试工具链
MPLAB X IDE + Harmony框架:图形化配置外设,自动生成驱动代码。

实时数据可视化:通过UART输出姿态角/电机PWM数据,用MPLAB Data Visualizer绘制波形。
  1. printf("Pitch:%.2f,PWM:%d\n", pitch_angle, pwm); // 串口调试输出
 楼主| dongnanxibei 发表于 2025-6-24 13:53 | 显示全部楼层
关键挑战与解决
问题
Microchip方案对策
传感器噪声干扰硬件I²C滤波 + 软件卡尔曼滤波
电机响应延迟MCPWM硬件触发ADC采样,实现同步控制
电池电压波动影响PWM精度内置ADC实时监测电压,动态补偿PWM占空比

微芯单片机通过 “传感器硬件接口优化 + 实时控制算法 + 专用电机外设” 三位一体实现平衡控制,其核心代码量可控制在200行以内(不含底层驱动),响应延迟 < 2ms,满足商业平衡车的性能需求。
hp860629 发表于 2025-7-5 09:11 | 显示全部楼层
这个算法很重要
桃花落满山前 发表于 2025-7-23 11:54 | 显示全部楼层
浅浅的回答一下
平衡车通过陀螺仪和加速度计检测姿态,单片机计算偏差后驱动电机调整转速,利用 PID 算法实时控制两轮力矩,抵消倾倒力矩实现平衡。
cooldog123pp 发表于 2025-7-24 17:17 | 显示全部楼层
实现平衡 滤波算法和PID算法两大核心以及相关传感器都是必不可少
魔法森林精灵 发表于 2025-7-25 19:19 | 显示全部楼层
这个帖子解释了平衡车的工作原理,从硬件到软件实现,非常详细。尤其是双环控制算法的实现,对于理解平衡车的动态平衡控制非常有帮助。
xixi2017 发表于 2025-7-26 11:52 | 显示全部楼层
PID是个好东西。
yiyigirl2014 发表于 2025-7-29 19:33 | 显示全部楼层
检测不平衡,那么刷新率是多少呢?
魔法森林精灵 发表于 2025-7-30 08:53 | 显示全部楼层
这个帖子很详细地解释了平衡车的控制系统,从硬件架构到软件实现流程,再到安全与优化设计,非常全面。
uiint 发表于 2025-8-4 10:18 | 显示全部楼层
平衡车通常配备陀螺仪和加速度计,用于测量车身的角速度和加速度。这些传感器能够提供关于车身倾斜角度和运动状态的实时数据。
jtracy3 发表于 2025-8-4 14:27 | 显示全部楼层
平衡车的平衡状态通过​​车身倾斜角度​​和​​角速度​​描述,需通过传感器实时采集这些数据。
albertaabbot 发表于 2025-8-4 17:19 | 显示全部楼层
为了提高姿态测量的精度,通常采用互补滤波或卡尔曼滤波等技术,将陀螺仪的高频率数据与加速度计的低频稳定性数据融合,消除单一传感器的误差。
updownq 发表于 2025-8-4 19:11 | 显示全部楼层
结合加速度计(测量静态倾角)和陀螺仪(测量角速度),通过卡尔曼滤波(KF)或互补滤波(CF)消除噪声,提高姿态估计精度。
jimmhu 发表于 2025-8-4 21:01 | 显示全部楼层
平衡车的本质是动态稳定系统,通过单片机实时采集姿态数据,利用PID算法快速计算电机补偿量,驱动车轮移动抵消车体倾斜。
robincotton 发表于 2025-8-4 22:55 | 显示全部楼层
传感器原始数据(角速度、加速度)需通过​​融合算法​​消除噪声和误差,得到准确的​​俯仰角(Pitch)​​和​​横滚角(Roll)​​,这是平衡控制的核心输入。
1988020566 发表于 2025-8-5 08:42 | 显示全部楼层
使用卡尔曼滤波器或其他数据融合算法,将陀螺仪和加速度计的数据结合起来,得到更准确的车身姿态信息。
hearstnorman323 发表于 2025-8-5 15:41 | 显示全部楼层
控制系统根据倾斜角度和运动状态,动态调整前后轮的动力分配,以保持车辆的平衡。
作业天敌在此 发表于 2025-8-6 08:58 | 显示全部楼层
这个帖子解释得非常详细,平衡车的控制系统确实依赖于传感器、算法和电机控制的紧密协作。硬件架构和软件实现流程都描述得很清晰。
zerorobert 发表于 2025-8-7 08:42 | 显示全部楼层
PID(比例-积分-微分)控制器是实现平衡的关键。它根据传感器反馈的数据,计算出适当的控制量,调整电机的转速,从而调整车体的姿态,使其保持平衡。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

223

主题

3840

帖子

18

粉丝
快速回复 在线客服 返回列表 返回顶部