基于 Arduino 平台构建 BLDC 机器人的姿态闭环控制系统,通常涉及 IMU 角度读取、互补滤波融合以及 PID 控制。这是自平衡机器人或稳定云台的核心技术栈。通过互补滤波融合原始数据获取精准姿态角,再利用 PID 计算电机驱动力矩。
系统核心架构
传感器融合:互补滤波
作为感知中枢,解决单一传感器无法兼顾动态与静态精度的问题。频域上利用低通滤波处理加速度计提取重力分量,高通滤波处理陀螺仪提取角速度。时域简化为加权平均:Angle = α * (Angle + Gyro_Rate * dt) + (1-α) * Accel_Angle。α 通常在 0.95~0.98 之间。相比卡尔曼滤波,互补滤波计算量小,适合资源受限平台。
核心算法:PID 控制器
决策大脑,将误差转化为指令。P 项提供恢复力,决定刚度;D 项提供阻尼,抑制超调;I 项在快速动态环中通常设为 0 或极小值以防过冲。
执行机构:BLDC 电机
肌肉部分。需具备快速响应特性,通常工作在速度环模式,通过控制轮速抵消倾角。
典型应用场景
- 两轮自平衡机器人:检测俯仰角,驱动左右轮维持垂直平衡。
- 云台稳定系统:反向旋转抵消载体晃动,保持画面水平。
- 倒立摆实验装置:验证控制算法有效性。
- 双足/多足机器人基座:维持躯干姿态稳定。
工程落地关键点
硬件选型与抗干扰
IMU 推荐 MPU6050 或 ICM-20689,刚性固定于重心附近,远离电机干扰。电源需隔离,BLDC 启停大电流易拉低电压导致复位,建议独立稳压并并联电容。严禁使用仅支持油门 PWM 的航模 ESC,需用支持闭环的方案如 SimpleFOC。
算法实现细节
滤波器参数需根据采样频率调整。PID 整定建议'由小到大',先 P 后 D 再 I。控制回路频率建议≥100Hz,严禁在主循环使用 delay(),应使用硬件定时器中断。机械结构上,重心越低越稳,传动需刚性避免间隙。
代码实战示例
示例一:两轮自平衡基础控制
这里展示 MPU6050 读取、互补滤波及 SimpleFOC 驱动的基本逻辑。
#include <Wire.h>
#include <MPU6050.h>
#include <SimpleFOC.h>
MPU6050 mpu;
BLDCMotor motor(7);
Encoder encoder(2, 3);
float Kp = 40.0, Ki = 10.0, Kd = 0.5;
float targetAngle = 0.0;
float previousError = , integral = ;
alpha = ;
dt = ;
filteredAngle = ;
{
Serial.();
Wire.();
mpu.();
mpu.(MPU6050_GYRO_FS_250);
mpu.(MPU6050_ACCEL_FS_2);
motor.();
encoder.();
motor.(&encoder);
}
{
ax, ay, az, gx, gy, gz;
mpu.(&ax, &ay, &az, &gx, &gy, &gz);
accelAngle = (ay, az) * RAD_TO_DEG;
gyroRate = gx / ;
gyroAngle = ;
gyroAngle += gyroRate * dt;
filteredAngle = alpha * (filteredAngle + gyroAngle * dt) + ( - alpha) * accelAngle;
error = targetAngle - filteredAngle;
integral += error * dt;
derivative = (error - previousError) / dt;
output = Kp * error + Ki * integral + Kd * derivative;
previousError = error;
motor.((output, , ));
Serial.(); Serial.(filteredAngle);
Serial.(); Serial.(output);
(dt * );
}


