2. 传感器数据采集基础:模拟信号与数字信号、ADC/DAC原理、I2C/SPI/UART通信协议简介、数据手册解读技巧
各位同学,欢迎来到传感器监控实战的第二讲。今天我们要聊的,是嵌入式开发中最基础、也最容易被忽视的一环——数据采集。
说实话,我见过太多工程师,上来就调I2C、读寄存器,结果数据死活不对。最后查了半天,发现是模拟前端没处理好。嗯,咱们今天就把这块地基打牢。
2.1 模拟信号 vs 数字信号:这个世界是连续的,但单片机不是
你想想看,我们身边的物理量——温度、压力、光照——都是连续变化的。这就是模拟信号。而单片机只能认0和1,这就是数字信号。
我刚开始做项目时,总觉得“不就是把模拟转成数字嘛,ADC一接就完事”。结果有一次,一个温度传感器输出的模拟电压有50mV的纹波,直接导致温度读数跳了3度。后来才明白,模拟信号处理不好,后面全是白搭。
核心区别一句话:
- 模拟信号:连续、无限精度(理论上)、易受干扰
- 数字信号:离散、有限精度、抗干扰强
说白了,模拟信号是“原汁原味”的世界,数字信号是“采样量化”后的世界。我们做嵌入式,就是在这两个世界之间搭桥。
2.2 ADC/DAC原理:桥的两端
2.2.1 ADC(模数转换器)
ADC的核心工作就两步:采样和量化。
- 采样:每隔一段时间,抓一个模拟电压值。采样率越高,越能还原原始信号。
- 量化:把抓到的电压值,映射到一个数字码上。分辨率(比如12位、16位)决定了精度。
我记得有一次调试一个压力传感器,用的是12位ADC。理论上分辨率是3.3V / 4096 ≈ 0.8mV。但实际测下来,噪声就有2mV。你想想看,低两位基本就是噪声在跳。所以后来我习惯把分辨率留出余量,至少比需求高2位。
避坑指南:我曾经在项目里直接用单片机内置ADC去采一个高频振动信号,结果采样率不够,出现了混叠。后来老老实实加了外部ADC和抗混叠滤波器。记住:采样率至少是信号最高频率的2倍(奈奎斯特定理),实际工程中建议5-10倍。
2.2.2 DAC(数模转换器)
DAC是ADC的逆过程。把数字码转成模拟电压。常见的有R-2R梯形网络和PWM加低通滤波两种方式。
我个人习惯,如果对精度要求不高(比如控制LED亮度),直接用PWM加RC滤波,成本低、电路简单。但如果要输出精确的参考电压,还是得用专用DAC芯片。
2.3 通信协议简介:I2C、SPI、UART
传感器采集到的数据,怎么传给单片机?这就靠通信协议了。我按使用频率,给大家排个序。
| 协议 | 线数 | 速度 | 距离 | 典型场景 |
|---|---|---|---|---|
| UART | 2线(TX/RX) | 慢(通常115200bps) | 远(可达15m) | GPS模块、蓝牙模块 |
| I2C | 2线(SCL/SDA) | 中(100kHz-400kHz) | 短(板级) | 温度传感器、加速度计 |
| SPI | 4线(SCK/MOSI/MISO/CS) | 快(可达几十MHz) | 短(板级) | ADC、显示屏、SD卡 |
2.3.1 UART——最老实的通信方式
UART就是串口。异步通信,不需要时钟线。两个设备约定好波特率,就能收发数据。
我调试时最喜欢用UART,因为逻辑分析仪一挂,波形一目了然。但要注意:UART没有总线仲裁,只能点对点。想挂多个设备?要么用多路复用,要么换I2C。
2.3.2 I2C——多设备的好朋友
I2C只有两根线,但可以挂上百个设备。每个设备有唯一地址。主机发起通信,从机响应。
这里有个坑:I2C的上拉电阻。我见过有人忘了加上拉电阻,结果总线一直低电平,通信死活不通。还有一次,上拉电阻选太小(比如100Ω),功耗直接飙到几十毫安。一般4.7kΩ是个安全值,但具体要看总线电容和速度。
// I2C读取温度传感器示例(伪代码)
i2c_start();
i2c_write(0x90); // 设备地址+写位
i2c_write(0x00); // 寄存器地址
i2c_stop();
i2c_start();
i2c_write(0x91); // 设备地址+读位
temp_high = i2c_read(ACK);
temp_low = i2c_read(NACK);
i2c_stop();
temperature = (temp_high << 8) | temp_low;
2.3.3 SPI——速度之王
SPI是全双工、同步通信。速度可以跑到几十MHz。但代价是线多——至少4根。
我做过一个项目,用SPI读取一个高速ADC,采样率1Msps。SPI时钟跑到20MHz,完全没问题。但要注意:SPI没有标准协议层,每个芯片的时序可能不一样。一定要看数据手册里的时序图。
警告:SPI的片选信号(CS)一定要处理好。我见过有人把CS直接接地,结果多个SPI设备同时响应,总线冲突。每个设备必须独立控制CS。
2.4 数据手册解读技巧:别让芯片“骗”了你
数据手册(Datasheet)是芯片的“身份证”。但说实话,很多手册写得又臭又长。我教大家一个快速阅读法。
- 先看首页:芯片功能、关键参数(供电电压、工作温度、精度)
- 再看引脚定义:哪个脚是电源、哪个是信号、哪个是地
- 然后看电气特性:输入输出电平、时序要求、功耗
- 最后看时序图和寄存器:怎么配置、怎么读写数据
我踩过最大的坑,是某款加速度计的数据手册里,写的是“I2C地址0x68”,但实际芯片是0x69。后来发现是手册版本没更新。所以,一定要核对芯片丝印和手册版本号。
我的习惯:拿到新芯片,先画一个“最小系统图”——电源、地、通信接口、必要的去耦电容。然后写一个最简单的“读ID”程序。如果ID能读回来,说明通信通了。这一步能省后面80%的调试时间。
2.5 本章知识体系
下面这张图,是我自己总结的传感器数据采集知识体系。你可以把它当成一张“地图”,以后遇到问题,先看自己卡在哪一层。
好了,这一章的内容就到这里。记住:数据采集不是简单的“接上线就能读”。从模拟信号到数字信号,每一步都有坑。但只要你把基础打牢,后面做项目就会顺很多。
下一章,我们会深入讲一个具体的传感器——DHT22温湿度传感器,从数据手册读到代码实现,完整走一遍。到时候见。