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)是芯片的“身份证”。但说实话,很多手册写得又臭又长。我教大家一个快速阅读法。

  1. 先看首页:芯片功能、关键参数(供电电压、工作温度、精度)
  2. 再看引脚定义:哪个脚是电源、哪个是信号、哪个是地
  3. 然后看电气特性:输入输出电平、时序要求、功耗
  4. 最后看时序图和寄存器:怎么配置、怎么读写数据

我踩过最大的坑,是某款加速度计的数据手册里,写的是“I2C地址0x68”,但实际芯片是0x69。后来发现是手册版本没更新。所以,一定要核对芯片丝印和手册版本号

我的习惯:拿到新芯片,先画一个“最小系统图”——电源、地、通信接口、必要的去耦电容。然后写一个最简单的“读ID”程序。如果ID能读回来,说明通信通了。这一步能省后面80%的调试时间。

2.5 本章知识体系

下面这张图,是我自己总结的传感器数据采集知识体系。你可以把它当成一张“地图”,以后遇到问题,先看自己卡在哪一层。

传感器数据采集知识体系 物理世界(模拟信号) 温度、压力、光照、声音……连续变化的物理量 传感器 模拟信号处理 滤波、放大、电平转换、阻抗匹配 ADC 数字信号(离散值) 采样、量化、编码后的数字码 通信协议 通信协议传输 I2C / SPI / UART 将数据传给单片机 数据手册 数据手册解读 → 正确配置与调试

好了,这一章的内容就到这里。记住:数据采集不是简单的“接上线就能读”。从模拟信号到数字信号,每一步都有坑。但只要你把基础打牢,后面做项目就会顺很多。

下一章,我们会深入讲一个具体的传感器——DHT22温湿度传感器,从数据手册读到代码实现,完整走一遍。到时候见。


专注资料整理