3、数据采集硬件架构:飞控与传感器接口、数据总线、数据记录仪

各位,这一章我们聊聊硬件层面的数据采集。说白了,就是传感器怎么把数据传给飞控,飞控又怎么把这些数据存下来。我见过不少团队,算法写得漂亮,结果一上机数据全是乱码——问题就出在硬件接口上。

3.1 飞控与传感器接口:物理层的握手

飞控和传感器之间,首先得解决物理连接问题。常见的传感器接口无非就是那几种:GPIO、ADC、PWM 捕获,以及我们后面要重点讲的数据总线。

  • GPIO(通用输入输出):最简单的开关量信号。比如检测起落架是否放下,一个高低电平就够了。但我提醒你,GPIO 的电气特性一定要看手册,3.3V 的飞控别直接怼 5V 传感器,烧过芯片的人不止我一个。
  • ADC(模数转换):飞控内置的 ADC 用来读取模拟传感器,比如电压检测、电流计。分辨率一般是 12 位或 16 位。嗯,这里要注意,ADC 的参考电压必须稳定,否则采集到的数据全是噪声。
  • PWM 捕获:遥控接收机输出的 PWM 信号,飞控通过捕获脉宽来获取油门、方向等指令。精度取决于定时器的时钟频率。
我的习惯: 在设计接口时,我会在传感器和飞控之间加一级电平转换或隔离芯片。虽然成本高几块钱,但能省掉后期排查“莫名其妙重启”的麻烦。

3.2 数据总线:内部通信的“高速公路”

传感器数据量一大,用 GPIO 逐位读取就不现实了。这时候就得靠数据总线。无人机上最常用的四种总线:SPI、I2C、UART、CAN。我按使用频率排个序,给你讲讲。

3.2.1 SPI(串行外设接口)

SPI 是我个人最喜欢的总线。速度快,全双工,一根时钟线加两根数据线就能跑。IMU(惯性测量单元)几乎清一色用 SPI,因为需要高速读取陀螺仪和加速度计数据。

  • 四线制:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
  • 速度:轻松跑到 10MHz 以上,适合高频率传感器。
  • 缺点:每增加一个从设备,就需要多一根片选线。我曾经在一个项目里接了 6 个 SPI 传感器,飞控的 GPIO 差点不够用。
// SPI 读取 MPU6000 加速度计示例(伪代码)
uint8_t spi_read_byte(uint8_t reg) {
    CS_LOW();                    // 拉低片选
    spi_transfer(reg | 0x80);    // 发送寄存器地址(读标志)
    uint8_t data = spi_transfer(0x00); // 发送空字节,读取数据
    CS_HIGH();                   // 拉高片选
    return data;
}

3.2.2 I2C(集成电路总线)

I2C 只有两根线:SDA(数据)和 SCL(时钟)。它用地址来区分设备,理论上一条总线可以挂 100 多个传感器。但速度比 SPI 慢,标准模式才 100kHz,快速模式 400kHz。

我在项目中遇到过一个问题:I2C 总线上的传感器太多,加上线缆过长,导致信号反射,数据经常出错。后来我加了上拉电阻,并把线长控制在 20cm 以内,问题才解决。

避坑指南: 我曾经因为 I2C 的地址冲突,折腾了两天。两个传感器用了同一个地址,飞控死活读不到第二个。后来我加了一个 I2C 多路复用器(如 TCA9548A)才搞定。所以,选传感器前先确认地址是否可配置。

3.2.3 UART(通用异步收发器)

UART 是异步通信,不需要时钟线。一根 TX,一根 RX,加上共地就行。GPS 模块、数传电台、光流传感器,大多用 UART。

  • 波特率:常见的有 115200、57600、38400。波特率越高,传输越快,但抗干扰能力下降。
  • 注意:UART 是点对点通信,不能像 I2C 那样挂多个设备。如果飞控的 UART 口不够用,就得用串口扩展芯片。

3.2.4 CAN(控制器局域网)

CAN 总线在工业无人机和车规级飞控上很常见。它用差分信号传输,抗干扰能力极强。一条 CAN 总线可以挂几十个节点,每个节点都能主动发数据。

说实话,CAN 的配置比 SPI 和 I2C 复杂一些,需要设置波特率、掩码、过滤器。但一旦配好,稳定性没得说。我参与的一个农业植保机项目,所有电调、电池管理单元都用 CAN 通信,从来没出过丢包问题。

总线类型 线数 速度 通信方式 典型用途
SPI 4 + N×CS ~10-80 MHz 同步全双工 IMU、气压计、Flash
I2C 2 ~100-400 kHz 同步半双工 磁力计、温度传感器
UART 2 ~115200-921600 bps 异步全双工 GPS、数传、光流
CAN 2(差分) ~125k-1M bps 异步多主 电调、电池管理、高可靠性链路

3.3 数据记录仪:把飞行数据“锁”下来

数据采集了,总得存下来吧?不然炸机了连黑匣子都没有,怎么分析原因?

3.3.1 SD 卡存储

SD 卡是最常见的存储方案。飞控通过 SPI 或 SDIO 接口读写 SD 卡。日志文件一般存成 .bin 或 .csv 格式。

  • 文件系统:建议用 FAT32,兼容性最好。exFAT 也行,但有些飞控的库不支持。
  • 写入策略:千万别每条数据都写一次 SD 卡,那样卡寿命会急剧下降。我习惯用环形缓冲区,攒够 512 字节(一个扇区)再批量写入。
  • 掉电保护:无人机说掉电就掉电。我会在写入前先写一个“开始标记”,写完再写“结束标记”。下次上电时检查标记,如果只有开始没有结束,说明上次写入不完整,直接丢弃。
// 环形缓冲区写入 SD 卡伪代码
#define BUFFER_SIZE 512
uint8_t buffer[BUFFER_SIZE];
uint16_t index = 0;

void log_data(uint8_t *data, uint16_t len) {
    memcpy(&buffer[index], data, len);
    index += len;
    if (index >= BUFFER_SIZE) {
        sd_write_sector(buffer);  // 写入一个扇区
        index = 0;
    }
}

3.3.2 黑匣子(专用记录仪)

对于高价值无人机,光靠 SD 卡不够。SD 卡在坠机时可能物理损坏,或者飞控直接断电来不及写最后几秒的数据。这时候就需要独立的黑匣子。

黑匣子一般是一个独立的 MCU + 大容量 Flash 芯片,通过 UART 或 CAN 与飞控通信。它有自己的电源(超级电容或小电池),即使主电源断了,也能把最后几秒的数据写完。

关键参数:
  • 存储容量:至少 2GB,支持循环覆盖。
  • 采样频率:能记录 100Hz 以上的 IMU 数据。
  • 抗冲击:能承受 100G 以上的冲击(坠机时不会坏)。
  • 独立供电:断电后至少能工作 5 秒。

我记得有一次,客户的无人机在空中失控坠毁。SD 卡摔断了,但黑匣子完好。我们读出最后 3 秒的数据,发现是电机输出指令突然跳变——原来是电调通信线虚焊。如果没有黑匣子,这个故障根本查不出来。

3.4 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你想想看,数据从传感器出来,经过总线到飞控,最后存到记录仪,每一步都有坑,也都有技巧。

数据采集硬件架构总览 数据采集硬件架构总览 IMU(SPI) 磁力计(I2C) GPS(UART) 电调(CAN) 数据总线 SPI / I2C UART / CAN 协议转换 数据解析 时序同步 飞控 数据融合 控制算法 日志打包 时间戳 异常检测 数据记录仪 说明: 传感器通过不同总线(SPI/I2C/UART/CAN)将数据传给飞控。 飞控完成数据融合和控制后,将日志打包发送给数据记录仪(SD卡/黑匣子)。 记录仪独立供电,确保坠机时最后几秒数据不丢失。

3.5 接口选型建议

最后,给你一个我自己的选型清单。不一定适合所有项目,但至少能帮你少走弯路。

  • IMU(加速度计+陀螺仪):首选 SPI,速度够快,延迟低。别用 I2C,带宽不够。
  • 磁力计(电子罗盘):I2C 就够了,数据更新率不高。
  • 气压计:SPI 或 I2C 都行。但注意气压计对时序敏感,I2C 总线负载重时容易丢数据。
  • GPS:UART 是标准配置。波特率设 115200 以上,否则数据刷新慢。
  • 电调/电机控制器:PWM 或 CAN。PWM 简单但精度有限,CAN 复杂但可靠。
  • 数据记录:SD 卡 + 黑匣子双保险。别省黑匣子的钱,一次炸机就回本了。
我的经验: 如果你在设计阶段不确定用哪种总线,优先选 SPI。它速度快、协议简单、调试方便。I2C 虽然线少,但调试起来比 SPI 麻烦得多——尤其是遇到时钟拉伸和总线锁死的时候。