第一章 传感器基础与数据采集概述
大家好,我是老张。做嵌入式这些年,我调试过的传感器少说也有上百种了。从最简单的温度传感器,到复杂的激光雷达,都离不开一个基本功——读懂传感器的原始数据。
这一章,咱们就把传感器的基础知识捋一遍。别小看这些概念,很多坑都是从这里开始的。
1.1 传感器分类——你得知道对手是谁
传感器怎么分类?我习惯按输出信号来分,这样调试思路最清晰。
| 分类方式 | 类型 | 典型代表 | 输出信号 |
|---|---|---|---|
| 按输出信号 | 模拟传感器 | 电位器、热敏电阻 | 电压/电流 |
| 数字传感器 | MPU6050、BMP280 | I2C/SPI数据包 | |
| 开关量传感器 | 霍尔开关、限位开关 | 高低电平 | |
| 按测量对象 | 环境传感器 | 温湿度、气压 | 缓慢变化 |
| 运动传感器 | 加速度计、陀螺仪 | 高频动态 |
我个人习惯,拿到一个新传感器,先看数据手册第一页——输出接口是什么。如果是模拟输出,准备好ADC;如果是数字接口,准备好逻辑分析仪。嗯,这个习惯帮我省了不少时间。
1.2 原始数据格式——别被二进制骗了
很多新手拿到传感器的原始数据,直接懵逼。比如读回来一个0x1A2B,这到底是多少度?
其实原始数据格式就那么几种:
- 整型格式:最常见。16位有符号整数,范围-32768到32767。比如加速度计输出16384,对应1g。
- 浮点格式:少数高端传感器直接输出float,省事但占用带宽大。
- 定点格式:比如Q15格式,1位符号+15位小数。我在项目中遇到过,一个陀螺仪输出就是这种格式,当时没注意符号位,算出来的角度全是反的。
- BCD码:老式传感器还在用,比如DS18B20的温度值就是BCD格式。
重点来了:原始数据≠物理量。中间差一个转换系数。这个系数在数据手册里,叫"灵敏度"或"分辨率"。
举个例子,一个温度传感器输出0x01F4,也就是500。手册说灵敏度是0.0625°C/LSB。那实际温度就是500 × 0.0625 = 31.25°C。简单吧?
1.3 采样定理——别让信号骗了你
采样定理,说白了就是:采样频率至少要是信号最高频率的两倍。否则就会发生混叠。
为什么会这样?你想想看,如果你每秒钟只拍一张照片,去记录一个每秒振动10次的弹簧,拍出来的结果可能看起来像静止的。这就是混叠。
我曾经在一个振动监测项目里吃过亏。传感器采样率设了100Hz,觉得够了。结果频谱分析时发现一个奇怪的峰值,折腾了两天才发现是50Hz工频干扰混叠进来的。从那以后,我每次都会在ADC前端加一个抗混叠滤波器。
避坑指南:我曾经以为采样率越高越好,结果发现数据量太大,MCU处理不过来。后来我总结了一个经验:采样率取信号最高频率的3-5倍,既保证精度,又不浪费资源。
1.4 量化误差——精度和分辨率的区别
很多工程师把精度和分辨率搞混。我刚开始也犯过这个错。
分辨率是ADC能分辨的最小变化。比如12位ADC,参考电压3.3V,分辨率就是3.3/4096 ≈ 0.8mV。
精度是实际值和真实值的偏差。一个16位ADC,分辨率很高,但精度可能只有±10mV。
量化误差,就是ADC把连续信号变成离散值时产生的误差。理论上,量化误差最大是±1/2 LSB。
举个例子:
// 假设12位ADC,参考电压3.3V
// 实际输入电压:1.000V
// ADC理论输出:1.000 / 3.3 * 4096 = 1241.21
// 实际ADC只能输出整数:1241
// 量化误差 = 1241 * 3.3 / 4096 - 1.000 = 1.00024 - 1.000 = 0.24mV
嗯,0.24mV的误差,对于大多数应用可以忽略。但如果你做的是精密测量,比如称重传感器,这个误差就不能忍了。
我的经验:降低量化误差有两个办法。一是提高ADC位数,从12位换到16位。二是用过采样技术,软件上做平均。我在一个压力传感器项目里,就是用128倍过采样,硬生生把12位ADC用出了14位的效果。
1.5 数据采集的完整链路
一个完整的数据采集链路,从传感器到最终数值,要经过这些步骤:
- 物理量感知:传感器把温度、压力等变成电信号
- 信号调理:放大、滤波、电平转换
- 模数转换:ADC把模拟量变成数字量
- 数据读取:MCU通过I2C/SPI/UART读取原始数据
- 数据解析:根据数据手册,把原始数据转换成物理量
- 误差补偿:校准、滤波、去噪
每一步都可能引入误差。我见过一个案例,信号调理阶段的运放偏置电压没调好,导致整个测量系统偏差了5%。排查了三天才发现是硬件问题。
所以我的建议是:调试传感器时,先用万用表测一下传感器输出端的实际电压,再用ADC读回来的数值反算,看看是否一致。这一步能帮你快速定位问题是出在硬件还是软件。
本章小结
这一章我们聊了传感器分类、原始数据格式、采样定理和量化误差。说白了,就是让你明白:传感器输出的原始数据,不是你想的那样直接能用。你得知道它是什么格式,怎么转换,采样率设多少,误差有多大。
下一章,我们开始实战——用STM32读取一个真实的温度传感器,从硬件连接到代码实现,一步步带你走通。到时候你会用上今天讲的所有知识。
记住一句话:读懂数据手册,比会写代码更重要。我见过太多工程师,代码写得飞起,结果连数据手册都没看完,最后栽在细节上。