基于 Arduino 平台实现 BLDC 机器人的 IMU 角度读取、互补滤波及 PID 控制,构成了典型的姿态闭环系统。这套架构是自平衡机器人或稳定云台的核心技术栈,通过融合传感器数据获取精准姿态,再由 PID 计算驱动力矩驱动电机。
核心在于三块:传感器融合、决策大脑和执行机构。互补滤波作为感知中枢,解决了单一传感器无法兼顾动态与静态精度的问题。它利用低通滤波处理加速度计提取重力方向,高通滤波处理陀螺仪捕捉角速度变化,最后加权平均得到稳定角度。PID 控制器则是决策大脑,比例项提供恢复力,微分项抑制振荡,积分项消除静差(平衡系统中通常设为 0)。BLDC 电机负责执行,其快速响应特性适合跟随 PWM 指令产生恢复力矩。
应用场景很广,比如两轮自平衡机器人,通过检测俯仰角维持垂直平衡;云台稳定系统,反向旋转抵消晃动;或是倒立摆实验装置验证控制算法。实际开发中要注意硬件选型与抗干扰。IMU 推荐 MPU6050 或 ICM-20689,需刚性固定在重心附近,远离电机干扰。电源要隔离,防止电机启停拉低电压导致复位。算法实现上,滤波器系数 α 通常在 0.95~0.98 之间,PID 参数建议'由小到大'试凑,采样频率建议≥100Hz,严禁使用 delay() 阻塞主循环。
实战中,我们可以参考以下代码结构,涵盖基础平衡、四轴简化版及云台单轴控制。
1. 两轮自平衡机器人(IMU 角度读取 + PID 控制)
#include <Wire.h>
#include <MPU6050.h>
#include <SimpleFOC.h>
MPU6050 mpu;
BLDCMotor motor(7);
Encoder encoder(2, 3); // 编码器引脚
// PID 参数
float Kp = 40.0, Ki = 10.0, Kd = 0.5;
float targetAngle = 0.0; // 目标角度(垂直平衡点)
float previousError = 0, integral = 0;
// 互补滤波参数
float alpha = 0.98; // 加速度计权重
float dt = 0.01; // 采样时间 (s)
float filteredAngle = 0;
void {
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 * );
}


