去年夏天我在工作室捣鼓出一台能稳定悬停的微型四轴飞行器,核心控制器用的正是STM32H750这块性能怪兽。相比常见的F4系列,H750的480MHz主频和双精度浮点单元让飞行控制算法跑得飞起,实测PID循环周期可以轻松做到2kHz。这期就来聊聊如何用这颗Cortex-M7内核的芯片打造高性能飞控系统。
四轴飞行器的核心在于"感知-决策-执行"的闭环控制。我的这套系统包含MPU6050姿态传感器、PWM电调驱动、2.4G遥控接收三大模块,全部通过H750的硬件外设直连。特别要提的是芯片内置的ART Accelerator加速器,使得从外部Flash执行代码时几乎没有性能损失,这对需要频繁读取传感器数据的飞控程序至关重要。
选择STM32H750VBT6这颗100脚封装的型号主要基于三点:
注意:H750的VOS电压调节必须配置为Level 1(高性能模式),否则无法达到标称主频。我在初期调试时就因为忘了这茬,导致PID控制响应迟缓。
采用经典的"三明治"结构:
特别在MPU6050的SCL/SDA线上加了4.7K上拉电阻,实测发现H750的I2C接口驱动能力较弱,不加电阻会导致数据丢包。传感器数据通过DMA传输到内存,配合硬件I2C的时钟拉伸功能,即使在电机干扰下也能稳定通信。
使用Mahony互补滤波算法替代常见的卡尔曼滤波,主要考虑点:
关键代码片段:
c复制void MahonyAHRSupdate(float gx, float gy, float gz,
float ax, float ay, float az) {
float recipNorm;
float halfvx, halfvy, halfvz;
// 加速度归一化
recipNorm = 1.0f/sqrt(ax*ax + ay*ay + az*az);
ax *= recipNorm;
ay *= recipNorm;
az *= recipNorm;
// 更新四元数
gx *= 0.0174533f; // 度转弧度
gy *= 0.0174533f;
gz *= 0.0174533f;
...
}
采用X型布局的混控公式:
code复制motor1 = throttle - pitch + roll - yaw
motor2 = throttle - pitch - roll + yaw
motor3 = throttle + pitch - roll - yaw
motor4 = throttle + pitch + roll + yaw
每个电机的PWM输出限制在1000-2000μs范围内,通过H750的高级定时器TIM1产生。关键配置如下:
c复制TIM1->CCR1 = 1500; // 初始中位值
TIM1->CCMR1 |= TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1; // PWM模式1
TIM1->BDTR |= TIM_BDTR_MOE; // 主输出使能
我的H750实测最佳参数:
code复制Pitch: P=3.2, I=0.05, D=0.018
Roll: P=3.0, I=0.05, D=0.016
Yaw: P=1.8, I=0.03, D=0
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 起飞即翻跟头 | 电机转向错误/桨叶装反 | 用示波器检查PWM相位 |
| 高频振动 | D参数过大或机械共振 | 加装减震垫/降低D值 |
| 遥控响应延迟 | 2.4G信号受干扰 | 更换ELRS接收机天线位置 |
| 悬停漂移 | IMU未校准或磁场干扰 | 重新校准加速度计/远离金属物 |
开启FPU和Cache后,算法执行时间对比:
| 功能 | 无优化(ms) | 优化后(ms) |
|---|---|---|
| 姿态解算 | 0.45 | 0.12 |
| PID计算 | 0.28 | 0.08 |
| 无线通信处理 | 0.15 | 0.04 |
关键优化步骤:
采用双路供电方案:
实测发现当电机启动时,电源纹波会导致H750复位。解决方法是在3.3V线路并联470μF+0.1μF电容组合,同时开启PVD(Programmable Voltage Detector)功能:
c复制PWR->CR2 |= PWR_CR2_PVDE; // 使能电压监测
PWR->CR2 |= PWR_CR2_PLS_LEV4; // 设置2.9V阈值
EXTI->IMR1 |= EXTI_IMR1_IM16; // 开启中断
经过三个月迭代,目前这台飞行器可实现:
下一步计划移植Betaflight开源固件,利用H750的硬件CRC和加密功能实现无线固件升级。最近发现芯片的Octo-SPI接口可以接并行ADC,准备尝试直接采样电机电流实现动态补偿。