3. 传感器基础:常见 MEMS 传感器与数据采集要点

做嵌入式AI,说白了就是让单片机学会“感知”世界。而感知的起点,就是这些MEMS传感器。这一章我们聊聊加速度计、陀螺仪、麦克风,以及它们怎么跟STM32“说话”。

3.1 常见MEMS传感器工作原理

MEMS(微机电系统)传感器,就是把机械结构做到硅片上。我刚开始接触时也觉得挺神奇——这么小的东西,怎么就能测加速度、角速度?

3.1.1 加速度计

加速度计的核心是一个“质量块-弹簧-阻尼”系统。当芯片加速时,质量块会偏移,通过检测电容变化就能算出加速度。

参数 典型值 说明
量程 ±2g / ±4g / ±8g / ±16g 选±2g适合倾角检测,±16g适合冲击检测
输出速率(ODR) 1Hz ~ 6.4kHz AI推理常用100Hz~400Hz
噪声密度 ~150 μg/√Hz 越低越好,影响静态精度
我的经验:做跌倒检测时,我习惯把量程设到±16g。有一次用±2g,老人摔了一跤直接削顶了——数据全在16g处截断,根本没法做特征提取。

3.1.2 陀螺仪

陀螺仪测的是角速度,单位°/s。它利用科里奥利效应——振动的质量块在旋转时会产生侧向位移。嗯,原理听着复杂,但用起来很简单:读寄存器就行。

陀螺仪有个大坑:零偏稳定性。静止时输出不为0,会随时间漂移。我曾经做过一个航姿参考系统,静止10分钟,偏航角漂了30多度……后来加了磁力计融合才解决。

参数 典型值 注意事项
量程 ±125°/s ~ ±2000°/s 人体运动用±500°/s足够
零偏稳定性 ~5°/h 消费级水平,工业级可到0.1°/h
交叉轴灵敏度 ~2% X轴转动会在Y/Z轴产生串扰

3.1.3 麦克风(MEMS麦克风)

MEMS麦克风其实是个电容式声压传感器。振膜感受到声压变化,电容跟着变,再通过ASIC转成数字信号。现在主流的是PDM接口(脉冲密度调制),用一根数据线+一根时钟线就能传音频。

做语音唤醒项目时,我踩过一个坑:麦克风的灵敏度是-26dBFS,但不同批次能差±3dB。这意味着同样的“你好”,有的板子能唤醒,有的死活不行。后来我加了自动增益校准。

关键指标:信噪比(SNR) > 64dB,灵敏度 -26dBFS ±1dB,声学过载点(AOP) > 120dB SPL

3.2 I2C/SPI通信协议回顾

传感器跟STM32通信,就两条路:I2C或SPI。选哪个?我一般看速率和引脚资源。

3.2.1 I2C协议要点

  • 两线制:SDA(数据线)+ SCL(时钟线),需要上拉电阻(4.7kΩ典型)
  • 地址:7位或10位,常用传感器是0x68、0x6B这种
  • 速率:标准模式100kHz,快速模式400kHz,高速模式3.4MHz
  • 特点:多设备共用总线,但速率受限,适合100kHz以下的数据采集
避坑:我曾经在一条I2C总线上挂了4个传感器,结果SCL波形变形严重。后来发现是总线电容太大,上拉电阻从4.7kΩ换到2.2kΩ才稳定。记住:总线电容不要超过400pF。

3.2.2 SPI协议要点

  • 四线制:SCLK(时钟)+ MOSI(主出从入)+ MISO(主入从出)+ CS(片选)
  • 速率:轻松上10MHz,有些传感器支持40MHz
  • 模式:CPOL(时钟极性)和CPHA(时钟相位)组合成4种模式,传感器常用Mode 0或Mode 3
  • 特点:全双工,速率高,但每多一个设备就要多一根CS线
对比项 I2C SPI
引脚数 2 4 + N×CS
最大速率 3.4MHz 40MHz+
多设备 地址寻址,方便 片选寻址,CS线多
适合场景 低速、引脚紧张 高速、大数据量

我个人习惯:加速度计/陀螺仪用I2C(数据量小),麦克风用SPI(音频数据量大)。当然,如果引脚够用,SPI永远是更稳的选择。

3.3 传感器数据采集要点

数据采得好不好,直接决定AI模型的上限。我见过太多项目,模型调得再好,传感器数据一塌糊涂,最后推理结果根本没法用。

3.3.1 时序同步

多传感器融合时,时间戳必须对齐。怎么做?

  • 硬件方案:传感器共用一根中断引脚,同时触发STM32的定时器捕获
  • 软件方案:每次读取数据时记录SysTick,做软件插值对齐

我做过一个项目,加速度计100Hz,陀螺仪200Hz,麦克风16kHz。如果不做时间对齐,融合出来的姿态角误差能到5度以上。

3.3.2 采样率选择

根据奈奎斯特定理,采样率至少是信号最高频率的2倍。但实际做AI推理,我建议4~5倍。

应用场景 推荐采样率 说明
人体活动识别 50~100Hz 人体运动能量集中在20Hz以下
跌倒检测 200~400Hz 冲击信号持续时间短,需要高采样率
语音关键词 16kHz 语音信号带宽8kHz,16kHz是标准
振动分析 1kHz~10kHz 取决于机械结构的共振频率

3.3.3 数据预处理

原始数据不能直接喂给AI模型。至少要做这几步:

  1. 去直流分量:减去静态偏置,比如加速度计静止时减去1g
  2. 滤波:低通滤波去除高频噪声,截止频率设为采样率的1/4
  3. 归一化:缩放到[-1, 1]或[0, 1]区间,加速模型收敛
  4. 滑动窗口:取固定长度(如256点)的数据帧,步长可重叠50%
我的习惯:先采集10秒静止数据算偏置,再采集10秒运动数据看幅值范围。这样归一化参数就有依据了,不会出现推理时数据超出训练范围的情况。

3.3.4 中断与DMA

千万别在主循环里轮询读传感器!CPU会被占死。正确做法:

  • 传感器数据准备好后,通过INT引脚触发STM32中断
  • 中断里只做标志位,不处理数据
  • 主循环或定时器回调里用DMA批量读取

我做过一个对比:轮询方式读3个传感器(100Hz),CPU占用率85%;改成中断+DMA后,降到12%。省出来的算力正好跑AI推理。

3.4 本章知识体系

下面这张图总结了传感器数据采集的完整链路,从物理世界到AI推理输入:

传感器数据采集链路 物理世界 加速度/角速度/声压 MEMS传感器 模拟→数字转换 I2C/SPI 通信协议 STM32 中断+DMA读取 数据预处理(必须步骤) 去直流分量 减去静态偏置 低通滤波 截止频率=fs/4 归一化 缩放到[-1,1] 滑动窗口 256点/50%重叠 AI模型推理 STM32Cube.AI / TensorFlow Lite ⚠ 数据质量决定模型上限 预处理不当→推理结果不可靠

从物理世界的加速度、角速度、声压,到MEMS传感器转换成电信号,再通过I2C/SPI传给STM32,最后经过预处理变成AI模型能吃的输入——每一步都有坑,每一步都值得认真对待。

核心原则:传感器数据采集不是“读寄存器”那么简单。时序同步、采样率选择、预处理流程,这三件事做好了,AI推理就成功了一半。