2. 传感器数据采集基础:常见传感器类型、采样率与分辨率、ADC转换原理

好,咱们正式开始第二讲。传感器数据采集,说白了就是嵌入式AI的“吃饭”环节。你想想看,算法再牛,模型再大,如果传感器数据不准,后面全是白搭。我在项目里见过太多这种情况——模型在PC上跑得飞起,一上板子就崩,查到最后,往往是传感器数据采集这块出了问题。

这一章,咱们就把传感器采集的基础打牢。我会结合自己踩过的坑,把常见传感器类型、采样率、分辨率,还有ADC转换原理,一次性讲透。

2.1 常见传感器类型:温度、湿度、加速度、陀螺仪、麦克风

边缘AI项目里,传感器种类五花八门。但最常用的,其实就那几样。我按使用频率排个序,咱们一个个看。

2.1.1 温度传感器

温度传感器,最经典的就是DS18B20和DHT系列。我个人习惯用DS18B20,因为它单总线通信,省IO口。精度嘛,±0.5°C,够用了。

关键点:

  • 数字输出,直接读寄存器就行
  • 采样周期不能太快,DS18B20转换一次要750ms
  • 注意散热问题——传感器离MCU太近,会被芯片发热干扰
我的经验: 曾经有个项目,温度读数总是偏高。排查了半天,发现是传感器紧挨着电源模块。拉开5cm距离后,数据就正常了。嗯,布局很重要。

2.1.2 湿度传感器

湿度传感器常和温度集成在一起,比如DHT11、DHT22、SHT30。DHT22精度更高,但贵一点。SHT30是I2C接口,我个人更推荐,因为I2C抗干扰能力强。

注意:

  • 湿度传感器对结露敏感,高湿环境容易失效
  • 响应时间一般8秒左右,别指望它瞬间变化

2.1.3 加速度计

加速度计,比如MPU6050、ADXL345,是运动检测的核心。三轴输出X、Y、Z方向的加速度值。单位常用g(9.8m/s²)。

实际应用:

  • 计步器:检测垂直方向的周期性变化
  • 跌倒检测:看加速度的突变
  • 姿态估计:结合陀螺仪做融合
避坑指南: 我曾经在振动环境下用加速度计做倾角测量,结果数据全是噪声。后来加了低通滤波才搞定。记住,加速度计对高频振动非常敏感。

2.1.4 陀螺仪

陀螺仪测量角速度,单位°/s。和加速度计配合,可以算出物体的姿态角(俯仰、横滚、偏航)。MPU6050就是六轴(三轴加速度+三轴陀螺仪)。

关键点:

  • 陀螺仪有零偏漂移,长时间使用需要校准
  • 温度变化会影响零偏,我一般会在代码里做温度补偿

2.1.5 麦克风

麦克风在边缘AI里越来越重要,比如语音唤醒、声纹识别。常用的是MEMS麦克风,比如INMP441、SPH0645。输出一般是PDM或I2S接口。

采样率:

  • 语音识别:16kHz就够了
  • 声纹识别:建议44.1kHz或48kHz
  • 注意:采样率越高,数据量越大,MCU处理压力也大

2.2 采样率与分辨率

这两个概念,很多人容易搞混。我简单说清楚。

2.2.1 采样率

采样率就是每秒采集多少个数据点,单位Hz。根据奈奎斯特定理,采样率至少是信号最高频率的两倍。比如音频信号最高20kHz,那采样率至少40kHz。

实际选择:

  • 温度/湿度:0.1~1Hz就够了,变化慢
  • 加速度计:50~200Hz,看运动快慢
  • 陀螺仪:100~400Hz,姿态更新需要快一点
  • 麦克风:16kHz~48kHz
重要: 采样率不是越高越好。高了,数据量大,功耗高,MCU处理不过来。我一般会先估算信号带宽,再选采样率,留20%余量。

2.2.2 分辨率

分辨率就是ADC能区分的最小电压变化。比如12位ADC,参考电压3.3V,分辨率就是3.3V / 4096 ≈ 0.8mV。

位数与精度:

ADC位数 量化等级 分辨率(3.3V参考) 适用场景
8位 256 12.9mV 粗略检测,如按键
10位 1024 3.2mV 一般传感器
12位 4096 0.8mV 高精度测量
16位 65536 50μV 微弱信号,如热电偶

注意: 分辨率高不代表精度高。精度还受参考电压稳定性、噪声、温度漂移影响。我见过有人用16位ADC,结果噪声占了低4位,实际有效分辨率只有12位。

2.3 ADC转换原理

ADC,模数转换器,把模拟电压变成数字量。边缘AI里,很多传感器输出的是模拟信号(比如麦克风、光敏电阻),必须经过ADC才能被MCU处理。

2.3.1 常见ADC类型

  • 逐次逼近型(SAR ADC): 最常见,速度快,精度适中。MCU内部集成的ADC基本都是这种。
  • Σ-Δ型: 精度高,但速度慢。适合音频、高精度测量。
  • 双积分型: 抗干扰强,但速度极慢。万用表里常用。

我个人在边缘AI项目里,90%的情况用MCU自带的SAR ADC。够用,还省成本。

2.3.2 ADC关键参数

  • 参考电压(Vref): 决定了ADC的量程。一般用MCU的VDD或内部基准。
  • 采样时间: ADC内部采样电容充电需要时间。采样时间太短,结果不准。
  • 转换时间: 从开始转换到输出结果的时间。SAR ADC一般1~10μs。
避坑指南: 我曾经用STM32的ADC采集音频信号,发现波形有失真。查了半天,原来是采样时间设置太短,采样电容没充满。把采样周期从1.5个时钟周期改成13.5个后,波形就正常了。

2.3.3 代码示例:MCU内部ADC读取

以STM32为例,读取一个模拟通道的电压值:

// 初始化ADC
void ADC_Init(void) {
    // 使能ADC时钟
    RCC->APB2ENR |= RCC_APB2ENR_ADC1EN;
    
    // 设置采样时间:55.5个周期
    ADC1->SMPR2 |= ADC_SMPR2_SMP0_2 | ADC_SMPR2_SMP0_1;
    
    // 开启ADC
    ADC1->CR2 |= ADC_CR2_ADON;
    
    // 校准
    ADC1->CR2 |= ADC_CR2_CAL;
    while(ADC1->CR2 & ADC_CR2_CAL);
}

// 读取ADC值
uint16_t ADC_Read(uint8_t channel) {
    // 选择通道
    ADC1->SQR3 = channel;
    
    // 启动转换
    ADC1->CR2 |= ADC_CR2_SWSTART;
    
    // 等待转换完成
    while(!(ADC1->SR & ADC_SR_EOC));
    
    // 返回结果
    return ADC1->DR;
}

说明: 这段代码是标准库写法。实际项目中,我建议用HAL库或LL库,可读性更好。但底层原理是一样的——设置采样时间、启动转换、等待完成、读结果。

2.4 实战建议:传感器选型与采集策略

最后,我分享几个实战中的经验。

  • 选型三原则: 精度够用就行,别追求高指标。接口越简单越好(I2C优先)。功耗要低,边缘设备大多电池供电。
  • 采集策略: 不要一直采。用定时器触发,或者中断唤醒。我习惯用DMA+双缓冲,这样CPU可以专心做算法。
  • 数据预处理: 原始数据直接送算法?不行。先做滤波、去噪、归一化。后面章节会详细讲。
我的习惯: 每次拿到新传感器,我都会先写一个简单的测试程序,连续采集1000个数据点,看看最大值、最小值、均值、方差。这样能快速发现传感器有没有问题,或者环境噪声有多大。别一上来就调算法,先确认数据是靠谱的。

好了,这一章就到这里。传感器采集是边缘AI的基石,一定要重视。下一章,咱们聊聊数据预处理——怎么把原始数据变成算法能吃的“干净数据”。