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 以内,问题才解决。
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 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你想想看,数据从传感器出来,经过总线到飞控,最后存到记录仪,每一步都有坑,也都有技巧。
3.5 接口选型建议
最后,给你一个我自己的选型清单。不一定适合所有项目,但至少能帮你少走弯路。
- IMU(加速度计+陀螺仪):首选 SPI,速度够快,延迟低。别用 I2C,带宽不够。
- 磁力计(电子罗盘):I2C 就够了,数据更新率不高。
- 气压计:SPI 或 I2C 都行。但注意气压计对时序敏感,I2C 总线负载重时容易丢数据。
- GPS:UART 是标准配置。波特率设 115200 以上,否则数据刷新慢。
- 电调/电机控制器:PWM 或 CAN。PWM 简单但精度有限,CAN 复杂但可靠。
- 数据记录:SD 卡 + 黑匣子双保险。别省黑匣子的钱,一次炸机就回本了。