2. 传感器数据采集基础:常见传感器类型、采样率与分辨率、ADC转换原理
好,咱们正式开始第二讲。传感器数据采集,说白了就是嵌入式AI的“吃饭”环节。你想想看,算法再牛,模型再大,如果传感器数据不准,后面全是白搭。我在项目里见过太多这种情况——模型在PC上跑得飞起,一上板子就崩,查到最后,往往是传感器数据采集这块出了问题。
这一章,咱们就把传感器采集的基础打牢。我会结合自己踩过的坑,把常见传感器类型、采样率、分辨率,还有ADC转换原理,一次性讲透。
2.1 常见传感器类型:温度、湿度、加速度、陀螺仪、麦克风
边缘AI项目里,传感器种类五花八门。但最常用的,其实就那几样。我按使用频率排个序,咱们一个个看。
2.1.1 温度传感器
温度传感器,最经典的就是DS18B20和DHT系列。我个人习惯用DS18B20,因为它单总线通信,省IO口。精度嘛,±0.5°C,够用了。
关键点:
- 数字输出,直接读寄存器就行
- 采样周期不能太快,DS18B20转换一次要750ms
- 注意散热问题——传感器离MCU太近,会被芯片发热干扰
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
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。
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可以专心做算法。
- 数据预处理: 原始数据直接送算法?不行。先做滤波、去噪、归一化。后面章节会详细讲。
好了,这一章就到这里。传感器采集是边缘AI的基石,一定要重视。下一章,咱们聊聊数据预处理——怎么把原始数据变成算法能吃的“干净数据”。