第二讲:飞控硬件平台认知——主控芯片选型与传感器布局

各位同学好,我是老张。今天咱们聊聊飞控硬件平台的核心部件。说白了,就是飞控的大脑和感官系统。

我做了十几年飞控系统,见过不少新手一上来就追最新的芯片、最贵的传感器。结果呢?飞起来抖得像筛子,或者干脆炸机。嗯,这里头有门道。

2.1 主控芯片选型:STM32H7 vs F7

主控芯片是飞控的大脑。我个人习惯用STM32系列,生态成熟、资料多。目前主流飞控主要用两个系列:F7和H7。

对比项 STM32F7系列 STM32H7系列
主频 216MHz 480MHz(双核)
浮点运算 单精度FPU 双精度FPU
RAM 512KB 1MB+
典型型号 STM32F765 STM32H743
功耗 较低 较高(需散热)
适用场景 常规飞控 高阶算法、AI飞控

我的建议:

  • 做无副翼系统,F7完全够用。我早期用F405做过,也能跑。
  • 如果你要跑EKF(扩展卡尔曼滤波)或者视觉SLAM,上H7更稳妥。
  • H7的双核架构,一个核跑控制,一个核跑通信,互不干扰。
避坑指南:我曾经在H7上踩过坑——它的L1缓存默认是开启的,如果不做MPU(内存保护单元)配置,DMA传输的数据会不一致。飞控数据错一位,飞机就偏航了。

2.2 传感器接口与布局

飞控的传感器就像人的感官。IMU是内耳(感知姿态),GPS是眼睛(定位),磁力计是鼻子(定向),气压计是皮肤(感知高度)。

2.4.1 IMU(惯性测量单元)

IMU包含加速度计和陀螺仪。我常用的型号是ICM-20602和BMI088。

  • 接口:SPI(推荐)或I2C。SPI速度更快,延迟更低。
  • 布局:必须放在飞控板的几何中心。为什么?你想想看,如果IMU偏了,角速度测量会引入额外的向心加速度误差。
  • 减震:用泡沫胶或硅胶垫隔离高频振动。我见过有人直接用双面胶粘,结果悬停时姿态震荡±5度。
小技巧:IMU的SPI时钟线要远离电机电源线。我在项目中遇到过SPI通信被电机PWM干扰,导致数据丢包。后来把线绕开了,问题解决。

2.4.2 GPS(全球定位系统)

GPS模块我用的是Ublox M8N或M9N。接口是UART,波特率通常设115200或230400。

  • 天线:有源天线,增益至少25dB。天线要朝上,不能被碳纤维板遮挡。
  • 布局:尽量远离电机和电调。GPS信号很弱,电磁干扰会直接导致定位漂移。
  • 双天线:如果做RTK(实时动态定位),需要两个天线,间距至少30cm。

我记得有一次调试,GPS死活搜不到星。折腾了半天,发现是天线下面有一根电源线在走。把线挪开,秒搜星。嗯,细节决定成败。

2.4.3 磁力计(电子罗盘)

磁力计用来测量地磁场方向,辅助航向。常用型号有HMC5883L、IST8310。

  • 接口:I2C,地址通常为0x1E或0x0C。
  • 布局:必须远离大电流线路和铁磁物质。电机、电调、电源线都会产生磁场干扰。
  • 校准:每次上电后做椭圆拟合校准。我习惯在飞控初始化时自动触发校准流程。
注意:磁力计和GPS最好集成在一个模块上(比如Ublox的M9N+IST8310组合)。分开布局的话,安装误差会导致航向不准。我曾经吃过这个亏,飞机总是往一个方向偏,最后发现是磁力计和GPS的安装角度差了2度。

2.4.4 气压计

气压计用来测量高度。常用型号是MS5611和BMP280。

  • 接口:I2C或SPI。MS5611的SPI速度可以到20MHz。
  • 布局:必须开孔,让气压计接触外界大气。但孔要防尘、防雨。
  • 温度补偿:气压计对温度敏感。我建议在气压计旁边放一个温度传感器,做实时补偿。

说白了,气压计就是个精密的气压表。你想想看,海拔每升高1米,气压下降约12Pa。MS5611的分辨率是0.012Pa,理论上能分辨1毫米的高度变化。但实际受气流影响,能稳定到10厘米就不错了。

2.3 PWM/SBUS输出通道

飞控控制舵机和电调,靠的是PWM信号。遥控器接收机传回信号,靠的是SBUS。

2.3.1 PWM输出

PWM信号频率通常为50Hz(周期20ms),脉宽1ms到2ms对应-45度到+45度。

  • 定时器:STM32的TIM1、TIM8、TIM2等都可以输出PWM。
  • 通道数:无副翼系统至少需要4个PWM通道(副翼、升降、油门、尾舵)。我习惯预留8个通道,方便扩展。
  • 分辨率:建议用16位定时器,分辨率可达0.5us。12位定时器只有2us分辨率,舵机响应会粗糙。
// STM32H7 PWM初始化示例(TIM1,通道1)
TIM_HandleTypeDef htim1;
htim1.Instance = TIM1;
htim1.Init.Prescaler = 0;  // 不分频
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
htim1.Init.Period = 20000 - 1;  // 20ms周期
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&htim1);

TIM_OC_InitTypeDef sConfigOC;
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500;  // 中位值,1.5ms
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);

2.3.2 SBUS接收

SBUS是Futaba的串行总线协议,用UART接收,波特率100000,8位数据,偶校验,2位停止位。

  • 硬件:需要UART的RX引脚,外加一个反相器(SBUS信号是反相的)。
  • 协议:每帧25字节,包含16个通道数据,每通道11位分辨率。
  • 中断:用UART空闲中断接收,或者DMA+空闲中断。我推荐DMA方式,不占用CPU。
关键点:SBUS的帧间隔是7ms左右。如果超过15ms没收到数据,就要触发失控保护。我习惯在定时器中断里做超时检测,一旦超时,立即将舵机输出锁定到安全位置。

2.4 知识体系总览

下面这张图是我画的飞控硬件架构图,你看一眼就能明白各个模块怎么连的:

STM32H7/F7 主控芯片 IMU 加速度计+陀螺仪 GPS Ublox M8N/M9N 磁力计 HMC5883L/IST8310 气压计 MS5611/BMP280 SPI UART I2C I2C/SPI PWM输出 舵机/电调控制 SBUS输入 遥控器接收机 电源管理 5V/3.3V稳压 传感器接口 控制输出 电源

这张图里,主控芯片是核心,所有传感器通过SPI、UART、I2C总线连接。PWM和SBUS是飞控与外界交互的通道。电源管理模块给所有芯片供电。

嗯,硬件平台认知就讲到这里。记住一句话:硬件是骨架,软件是血肉。骨架歪了,再好的算法也飞不稳。下一讲咱们开始搭软件框架,把传感器数据读进来。


公众号:蓝海资料掘金营,微信deep3321