3、TinyML外设采集场景:常见传感器(麦克风、IMU、摄像头)的数据特点与采集需求

TinyML 系统的起点是物理世界与数字世界的交汇点——传感器。无论是唤醒词检测、运动状态识别,还是视觉缺陷分拣,模型推理的质量上限在数据采集阶段就已经被决定。理解麦克风、IMU(惯性测量单元)和摄像头这三类最常见传感器的数据特点与采集需求,是设计 DMA 协同链路、配置缓冲区以及确定推理触发策略的前提。本章将围绕这三类传感器的信号本质、数据格式、时序约束和系统集成需求展开,为后续章节的 DMA 控制器配置与多缓冲设计奠定基础。

TinyML 外设采集场景:三类传感器数据链路与 DMA 协同需求 传感器域 麦克风 (PDM/I2S) 16-bit / 16kHz 单声道 持续流式,时域连续 IMU (I2C/SPI) 6轴/9轴,100-1000Hz 突发/周期批量,事件驱动 摄像头 (DVP/MIPI-CSI) QVGA 320x240 RGB565 帧突发,高带宽,行交错 DMA 协同域 数据特征提取 采样率 / 位宽 / 通道数 / 突发性 缓冲策略设计 环形缓冲 / 双缓冲 / 行缓冲 推理触发机制 阈值触发 / 周期触发 / 帧完成触发 处理器域 CPU 低负载介入 仅处理中断与上下文切换 TinyML 推理引擎 TFLite-Micro / CMSIS-NN 后处理与决策 分类结果 / 回归值 / 事件输出 数据流方向:传感器 → DMA 协同(特征提取/缓冲/触发) → 处理器推理

3.1 麦克风传感器:连续流式音频的数据特征与采集约束

麦克风是 TinyML 中最常见的“始终在线”传感器,典型应用包括关键词唤醒、声音事件检测和语音命令识别。其数据本质是一维时域波形,经过采样和量化后形成连续的 PCM(脉冲编码调制)数据流。在嵌入式系统中,麦克风通常通过 PDM(脉冲密度调制)或 I2S(集成电路内置音频总线)接口与 MCU 连接。PDM 麦克风输出 1-bit 高采样率流(典型 2.4MHz 或 3.2MHz),需要经过抽取滤波(CIC 或 FIR)转换为 16-bit PCM 数据;I2S 麦克风则直接输出 16-bit 或 24-bit PCM 数据,采样率通常为 8kHz、16kHz 或 48kHz。

从 DMA 协同的角度看,音频采集的核心需求是低延迟、无间隙的连续传输。以 16kHz/16-bit 单声道为例,每秒产生 32KB 数据,每 10ms 产生 320 字节。如果使用 CPU 中断方式逐字节搬运,MCU 将被完全占用,无法执行推理任务。因此,必须使用 DMA 将数据从外设 FIFO 搬运到内存缓冲区。音频数据的另一个关键特性是时间连续性——数据流不能中断,否则会产生“咔哒”声或导致语音特征断裂。这要求 DMA 配置为循环模式(Circular Mode),配合双缓冲(Double Buffer)机制,确保在一个缓冲区被 CPU 处理时,DMA 仍在向另一个缓冲区写入新数据。

参数项典型值对 DMA 设计的影响
采样率16 kHz(语音)每 62.5μs 产生一个采样点,DMA 需在采样间隔内完成搬运
位宽16-bitDMA 传输宽度设为半字(Half-word),提高搬运效率
通道数1(单声道)或 2(立体声)多通道时需考虑数据交错,DMA 需按帧格式搬运
数据速率32 KB/s(16kHz/16bit)每 10ms 产生 320 字节,适合 256 或 512 字节缓冲区
突发性持续均匀适合循环 DMA + 双缓冲,无需复杂触发逻辑

在缓冲区大小选择上,需要权衡延迟与 CPU 负载。缓冲区越小,音频延迟越低,但中断频率越高,CPU 被唤醒的次数越多。例如,使用 320 字节缓冲区(10ms 音频),MCU 每秒被中断 100 次;使用 640 字节缓冲区(20ms 音频),中断频率降为 50 次/秒,但延迟增加 10ms。对于唤醒词检测这类对延迟敏感的应用,通常选择 10-30ms 的缓冲区长度,既保证特征提取的实时性,又不至于让 CPU 频繁中断。

经验提示:在 Cortex-M4/M7 系列 MCU 上,建议将音频缓冲区对齐到 4 字节边界,并利用 DMA 的突发传输(Burst Transfer)功能,每次搬运 4 或 8 个半字,可显著降低总线占用率。同时,启用 DMA 的 FIFO 模式(如果硬件支持),可以进一步平滑数据流。

3.2 IMU 传感器:突发批量数据与事件驱动的采集策略

IMU(惯性测量单元)集成了加速度计和陀螺仪,部分型号还包含磁力计,输出 6 轴或 9 轴运动数据。与麦克风的连续流不同,IMU 的数据具有周期性突发的特点。IMU 内部通常有 FIFO 缓冲区,可以缓存多次采样数据,然后通过 I2C 或 SPI 接口一次性读出。例如,BMI160 IMU 内置 1024 字节 FIFO,在 100Hz 采样率下可缓存约 1.3 秒的 6 轴数据。这种设计使得 MCU 无需频繁访问传感器,而是可以以较低的频率批量读取数据,非常适合低功耗应用。

IMU 的采样率范围较宽,从 25Hz(低功耗计步)到 1kHz(高动态运动捕捉)不等。每个采样点的数据量为 6 轴 × 2 字节 = 12 字节(加速度计和陀螺仪各 3 轴),如果包含磁力计则为 18 字节。在 100Hz 采样率下,数据速率为 1.2KB/s,远低于音频的 32KB/s。然而,IMU 数据的实时性要求并不低于音频——运动状态的突变(如跌倒检测)需要在毫秒级内响应。因此,DMA 协同的关键在于:当 IMU FIFO 达到预设阈值(如 50% 满)时,触发中断,DMA 将 FIFO 中的数据一次性搬运到内存缓冲区。

// IMU 数据批量读取的典型 DMA 配置(以 STM32 + LSM6DSO 为例)
// 1. 配置 SPI 为 DMA 模式,接收缓冲区 12 字节 × 采样点数
#define IMU_SAMPLE_COUNT  20   // 一次读取 20 个采样点
#define IMU_SAMPLE_SIZE   12   // 6轴 × 2字节
uint8_t imu_rx_buf[IMU_SAMPLE_COUNT * IMU_SAMPLE_SIZE];

// 2. 配置 DMA 为 Normal 模式,传输完成中断
DMA_InitTypeDef dma_init = {
    .PeriphInc = DMA_PINC_DISABLE,   // 外设地址固定(SPI 数据寄存器)
    .MemInc = DMA_MINC_ENABLE,       // 内存地址递增
    .Direction = DMA_PERIPH_TO_MEMORY,
    .BufferSize = IMU_SAMPLE_COUNT * IMU_SAMPLE_SIZE,
    .Mode = DMA_MODE_NORMAL,         // 单次传输,非循环
    .Priority = DMA_PRIORITY_HIGH
};

// 3. 在 IMU FIFO 阈值中断中启动 DMA 传输
void IMU_FIFO_Threshold_IRQHandler(void) {
    if (LSM6DSO_GetFIFOStatus() & LSM6DSO_FIFO_THRESHOLD) {
        LSM6DSO_ReadFIFO(imu_rx_buf, IMU_SAMPLE_COUNT);
        // DMA 自动搬运,传输完成中断中触发推理
    }
}

IMU 采集的另一个关键需求是时间戳同步。由于 IMU 数据是批量读取的,每个采样点的实际采集时间与读取时间之间存在偏移。对于需要融合多传感器数据的应用(如视觉-惯性导航),必须为每个采样点打上精确的时间戳。这可以通过两种方式实现:一是使用 IMU 内部的时间戳计数器(部分高端 IMU 支持),二是利用 MCU 的定时器在每次 DMA 传输完成时记录当前时间,并根据采样率推算每个采样点的时间。

风险提示:IMU 的 SPI/I2C 读取速度远低于数据产生速度。如果 DMA 配置不当或中断响应延迟过高,可能导致 IMU FIFO 溢出,造成数据丢失。务必计算最坏情况下的数据产生速率与 DMA 搬运速率的匹配关系。例如,100Hz 采样率下每 10ms 产生 120 字节数据,而 SPI 时钟 10MHz 时搬运 120 字节仅需 96μs,远小于 10ms,因此只要在 10ms 内启动 DMA 即可保证不溢出。

3.3 摄像头传感器:高带宽帧数据与行交错采集的挑战

摄像头是 TinyML 中数据量最大、时序约束最严格的传感器。以 QVGA(320×240)RGB565 格式为例,一帧图像的数据量为 320×240×2 = 153,600 字节(150KB)。如果以 30fps 的帧率运行,数据速率高达 4.5MB/s,这对 MCU 的总线带宽和存储资源提出了极高要求。因此,TinyML 视觉应用通常采用较低的分辨率(如 96×96 或 64×64 灰度图)和较低的帧率(5-15fps),以降低数据量和计算量。

摄像头的输出格式通常为 DVP(数字视频端口)或 MIPI-CSI 接口。DVP 接口包含 8 位或 16 位并行数据线、像素时钟(PCLK)、行同步(HSYNC)和帧同步(VSYNC)信号。DMA 采集的关键在于行交错传输——摄像头按行输出数据,每行结束后 HSYNC 拉高,DMA 需要在一行数据到达时及时搬运,避免数据覆盖。常用的策略是使用 DMA 的行缓冲模式:配置 DMA 每次传输一行数据(如 320×2 = 640 字节),传输完成后触发中断,CPU 将行数据拷贝到帧缓冲区,同时 DMA 开始传输下一行。

分辨率格式单帧大小30fps 数据速率典型应用
96×96灰度 8-bit9.2 KB276 KB/s手势识别、人脸检测
160×120RGB56538.4 KB1.15 MB/s物体分类、缺陷检测
320×240RGB565150 KB4.5 MB/s文档扫描、条码识别
640×480灰度 8-bit307 KB9.2 MB/s边缘计算(需外部存储)

摄像头采集的 DMA 设计需要特别关注帧同步与行同步的配合。在 VSYNC 上升沿到来时,DMA 应被配置为接收新的一帧;在 HSYNC 有效期间,DMA 逐行搬运数据。如果使用双帧缓冲(Ping-Pong Buffer),一帧数据在 DMA 写入时,另一帧数据可以被 CPU 用于推理,从而实现采集与计算的流水线并行。然而,由于帧数据量远大于音频和 IMU,MCU 的内部 SRAM 往往不足以容纳两帧完整图像。此时需要采用分块处理策略:将图像划分为多个区域(如 4 个 48×48 的块),每采集完一个块就触发一次推理,或者使用外部 PSRAM 作为帧缓冲。

工程案例:在某工业视觉分拣项目中,使用 STM32H743(2MB SRAM)驱动 OV7670 摄像头(QVGA RGB565)。由于 SRAM 不足以容纳双帧缓冲,设计采用了“行缓冲 + 分块推理”方案:DMA 每次传输 40 行数据(40×640 = 25.6KB),传输完成后触发中断,CPU 将这 40 行数据裁剪为 4 个 48×48 的灰度块,依次送入 TFLite-Micro 模型进行缺陷分类。整个流程中,DMA 持续采集下一批 40 行数据,与 CPU 推理并行执行。实测帧率从全帧处理的 8fps 提升到 22fps,且 CPU 负载保持在 60% 以下。

3.4 三类传感器采集需求对比与 DMA 协同设计要点

综合上述分析,三类传感器在数据特征、采集模式和 DMA 协同策略上存在显著差异。麦克风是连续均匀流,适合循环 DMA + 双缓冲;IMU 是周期突发块,适合阈值触发 + 单次 DMA 批量搬运;摄像头是高带宽帧流,适合行缓冲 + 帧/块完成触发。下表总结了关键差异:

对比维度麦克风IMU摄像头
数据形态一维时域波形多维运动向量二维像素矩阵
典型速率16-48 kHz 采样100-1000 Hz 采样5-30 fps 帧率
单次数据量2-4 字节/采样12-18 字节/采样9-150 KB/帧
突发性低(均匀流)中(FIFO 批量)高(帧突发)
DMA 模式循环模式普通模式(单次)普通模式(行/块)
缓冲策略双缓冲(Ping-Pong)单缓冲 + FIFO 阈值行缓冲 + 帧缓冲/分块
触发方式半满/全满中断FIFO 阈值中断行完成/帧完成中断
推理触发时机每 10-30ms 音频块每 N 个采样点每帧或每块图像

在实际系统设计中,还需要考虑多传感器并发的场景。例如,一个可穿戴设备可能同时采集 IMU 和麦克风数据,用于活动识别和语音增强。此时,DMA 通道的优先级分配至关重要:摄像头(如果存在)应获得最高优先级,因为其数据速率最高且不允许丢失;IMU 次之,因为其 FIFO 可以容忍短暂延迟;麦克风优先级最低,但必须保证循环 DMA 不被长时间阻塞。此外,多个 DMA 通道共享总线带宽,需要合理配置突发传输大小和 FIFO 阈值,避免总线冲突导致的数据延迟。

常见误区:许多开发者将 DMA 视为“万能搬运工”,忽略了外设本身的流控机制。例如,某些低端 MCU 的 DMA 不支持循环模式,此时需要手动在传输完成中断中重新配置 DMA。另外,DMA 传输完成中断与 CPU 访问缓冲区之间存在竞争条件——如果 CPU 正在处理缓冲区 A 的数据,而 DMA 已经开始写入缓冲区 A(由于配置错误),将导致数据损坏。务必使用硬件双缓冲或软件标志位来确保互斥访问。

最后,采集需求直接决定了推理触发策略。对于麦克风,通常采用滑动窗口方式,每 10-30ms 触发一次特征提取和推理;对于 IMU,采用事件计数方式,累积到 N 个采样点后触发一次推理;对于摄像头,采用帧完成或块完成方式,在图像数据完整到达后触发推理。合理的触发策略可以显著降低无效推理次数,延长电池寿命。例如,在始终在线的关键词唤醒系统中,如果音频缓冲区每 10ms 触发一次推理,而唤醒词平均长度为 800ms,则系统每秒执行 100 次推理,其中大部分是无效的。通过引入能量检测或语音活动检测(VAD)作为前置条件,可以在无语音时跳过推理,将功耗降低 80% 以上。

总结复盘:设计 TinyML 外设采集链路时,应遵循以下步骤:① 明确传感器的数据格式、速率和突发特性;② 计算缓冲区大小与中断频率的平衡点;③ 选择合适的 DMA 模式(循环/普通/双缓冲);④ 配置外设的 FIFO 或阈值触发机制;⑤ 设计推理触发策略,避免无效计算;⑥ 验证多传感器并发时的总线带宽和优先级。只有将传感器特性与 DMA 能力深度结合,才能构建高效、低功耗的 TinyML 数据采集系统。