2. 硬件基础:ADC工作原理(逐次逼近型)、采样率、分辨率与参考电压

做嵌入式开发,ADC 是绕不开的坎。我见过不少新手,上来就调代码,结果采出来的数据乱七八糟。其实问题多半出在硬件理解上。这一章,咱们就把 ADC 的底裤扒干净。

2.1 逐次逼近型ADC:它到底怎么工作的?

市面上单片机内置的 ADC,绝大多数是逐次逼近型(SAR ADC)。为什么?因为它平衡了速度和精度,成本也低。

说白了,它的工作方式像“猜数字”游戏。你心里想一个数(模拟电压),我来猜。我每次猜一个中间值,你告诉我“大了”还是“小了”,我再缩小范围继续猜。直到猜中为止。

具体到硬件,SAR ADC 内部有这几个关键部件:

  • 采样保持电路(S/H):在转换开始前,先把输入电压“冻结”住。不然电压一直在变,没法比。
  • 比较器:核心裁判。它比较输入电压和 DAC 输出的参考电压,输出“谁大谁小”。
  • 逐次逼近寄存器(SAR):大脑。它根据比较结果,一步步调整 DAC 的输出值。
  • 数模转换器(DAC):把 SAR 的数字值转换成模拟电压,喂给比较器。

整个流程是这样的:

  1. 采样保持电路捕获输入电压。
  2. SAR 先假设最高位为 1,DAC 输出对应电压。
  3. 比较器判断:输入电压 > DAC 输出?如果是,保留最高位为 1;否则置 0。
  4. 接着处理下一位,重复步骤 2-3。
  5. 直到所有位都确定,转换完成。

关键点:对于一个 N 位的 SAR ADC,完成一次转换需要 N+1 个时钟周期(N 次比较 + 1 次采样)。12 位 ADC 就是 13 个周期。

我曾经在一个项目中,发现 ADC 数据偶尔跳变严重。查了半天,原来是采样保持时间不够,电压还没稳定就开始比较了。嗯,这个坑后面会细说。

逐次逼近型ADC(SAR ADC)工作流程 模拟输入 采样保持 比较器 SAR逻辑 DAC 数字输出 核心逻辑:逐位逼近,每次比较确定一个比特位,N位ADC需要N次比较

2.2 分辨率:你能分辨多小的电压变化?

分辨率,就是 ADC 能分辨的最小电压变化量。12 位 ADC 能输出 4096 个不同的数字值(2^12)。

计算公式很简单:

分辨率 = 参考电压 / (2^N - 1)

举个例子,参考电压 3.3V,12 位 ADC:

分辨率 = 3.3 / 4095 ≈ 0.806 mV

这意味着,输入电压每变化 0.806 mV,数字输出就变化 1 个 LSB。

分辨率(位) 量化级数 3.3V参考下的LSB 常见应用
8 256 12.9 mV 电池检测、按键扫描
10 1024 3.22 mV 摇杆、电位器
12 4096 0.806 mV 传感器、音频
16 65536 50.3 μV 精密测量、仪器仪表

我的建议:别盲目追求高分辨率。12 位在大多数嵌入式场景下已经够用。分辨率越高,转换时间越长,对噪声也越敏感。我见过有人用 16 位 ADC 测电池电压,结果最后两位一直在跳,白白浪费了精度。

2.3 采样率:你到底能采多快?

采样率,就是 ADC 每秒能完成多少次转换。单位是 SPS(Samples Per Second)。

它受两个因素限制:

  • ADC 时钟频率:芯片手册会给出最大 ADC 时钟。比如 STM32F4 的 ADC 最大时钟是 36 MHz。
  • 转换周期数:SAR ADC 需要固定数量的时钟周期完成一次转换。12 位一般是 12-15 个周期。

最大采样率 = ADC 时钟 / 转换周期数。

举个例子:ADC 时钟 36 MHz,12 位转换需要 15 个周期:

最大采样率 = 36,000,000 / 15 = 2.4 MSPS

但这是理论值。实际中还要考虑:

  • 采样保持时间(尤其是高阻抗信号源)
  • 软件读取和处理的耗时
  • 多通道切换时的建立时间

注意:采样率不是越高越好。根据奈奎斯特定理,采样率至少是信号最高频率的 2 倍。但实际工程中,我建议留 5-10 倍余量。比如采集 1 kHz 的音频信号,采样率至少设到 10 kSPS 以上,才能保证波形还原度。

2.4 参考电压:ADC 的“尺子”准不准?

参考电压(Vref)是 ADC 的测量基准。它决定了 ADC 的输入范围。

通常有两种情况:

  • 内部参考:芯片内部集成的参考电压,比如 1.2V、2.5V。方便,但精度一般,温漂较大。
  • 外部参考:通过 Vref+ 引脚输入一个精确的电压。比如用 REF3033 提供 3.3V 参考。

参考电压直接影响测量精度。如果 Vref 有 1% 的误差,那你的测量结果也会有 1% 的误差。

我曾经在一个温度采集项目中,发现数据总是偏大 2-3 度。查到最后,是板子上 Vref 引脚走线太长,引入了电源噪声。后来我加了一个 10 μF 的滤波电容,问题就解决了。

经验法则:

  • 对精度要求高(< 1%),必须用外部参考。
  • Vref 引脚旁边一定要放 0.1 μF + 10 μF 的去耦电容。
  • Vref 走线要远离数字信号线,尤其是时钟和 PWM。

2.5 量化误差:ADC 天生的“原罪”

量化误差,是 ADC 把连续模拟量转换成离散数字量时,不可避免的误差。

说白了,就是“四舍五入”带来的损失。一个 12 位 ADC,LSB 是 0.806 mV。如果输入电压是 1.0000V,ADC 可能输出 1.0008V 或 0.9992V,误差在 ±0.5 LSB 以内。

量化误差的公式:

量化误差 = ± (LSB / 2)

对于 12 位、3.3V 参考:

量化误差 = ± (0.806 mV / 2) = ± 0.403 mV

这个误差是理论下限,无法消除。但可以通过过采样和求平均来降低它的影响。

小技巧:如果你需要更高的有效分辨率,可以试试过采样。比如用 12 位 ADC 采集 16 次求平均,等效分辨率可以提升到 14 位。代价是采样率降低了 16 倍。我在做电池电量监测时常用这招。

2.6 本章小结

ADC 的核心就这几样东西:逐次逼近原理、分辨率、采样率、参考电压。理解它们,你才能用好 ADC。