1. ADC基础原理:从模拟到数字的桥梁
ADC,模数转换器,说白了就是把连续的电压信号变成一串离散的数字。你想想看,单片机只能认0和1,但现实世界里的温度、声音、压力全是连续变化的模拟量。没有ADC,嵌入式系统就是个睁眼瞎。
我刚开始做嵌入式那会儿,总觉得ADC不就是读个电压嘛,能有多复杂?直到有一次调试一个工业传感器采集板,数据死活跳来跳去,查了三天才发现是采样率和信号频率没匹配好。嗯,从那以后我再也不敢小看ADC的基础原理了。
1.1 逐次逼近型ADC(SAR ADC)
逐次逼近型ADC,简称SAR ADC,是嵌入式系统里最常见的ADC类型。为什么?因为它性价比高,速度适中,功耗低。
它的工作原理,你可以想象成用天平称东西。你有一堆砝码:128g、64g、32g、16g、8g、4g、2g、1g。你要称一个东西,先放最大的128g,太重了就拿掉;再放64g,还重;放32g,轻了,留着;再放16g……这样逐次比较,直到把所有砝码试完。
SAR ADC就是这么干的。它内部有一个比较器、一个数模转换器(DAC)和一个逐次逼近寄存器(SAR)。每次比较一位,从最高位(MSB)开始,决定这一位是1还是0。
核心流程:
- 采样保持电路锁住当前输入电压
- SAR寄存器先假设最高位为1,DAC输出对应电压
- 比较器判断:输入电压 > DAC输出?保留该位为1,否则置0
- 移到下一位,重复步骤2-3
- 所有位确定后,输出转换结果
举个例子,一个8位SAR ADC,参考电压3.3V,输入电压2.0V。它会这样工作:
| 步骤 | 当前位 | DAC输出 | 比较结果 | 该位值 |
|---|---|---|---|---|
| 1 | Bit7 (128/256 × 3.3V = 1.65V) | 1.65V | 2.0V > 1.65V | 1 |
| 2 | Bit6 (192/256 × 3.3V = 2.475V) | 2.475V | 2.0V < 2.475V | 0 |
| 3 | Bit5 (160/256 × 3.3V = 2.0625V) | 2.0625V | 2.0V < 2.0625V | 0 |
| 4 | Bit4 (144/256 × 3.3V = 1.85625V) | 1.85625V | 2.0V > 1.85625V | 1 |
| ... | ... | ... | ... | ... |
最终结果就是逐位逼近出来的二进制数。N位SAR ADC只需要N个时钟周期就能完成一次转换,效率很高。
个人经验:我在调试STM32的ADC时,发现SAR ADC对输入阻抗很敏感。如果信号源内阻太大,采样电容充不满,转换结果会偏小。我习惯在ADC输入引脚加一个0.1μF的电容,效果立竿见影。
1.2 Σ-Δ型ADC
Σ-Δ型ADC,名字听着吓人,其实原理没那么玄乎。它跟SAR ADC的思路完全不一样——SAR是直接比较,Σ-Δ是过采样加噪声整形。
它的核心思想是:用很低的精度(1位)但极高的速度去采样,然后通过数字滤波把精度提上来。你想想看,用1位的比较器,输出只有0和1,但采样率是目标采样率的几十上百倍。这些0和1的密度就反映了输入电压的大小。
Σ-Δ ADC内部有两个关键部分:
- 调制器(Modulator): 以极高频率对输入信号进行1位量化,同时把量化噪声推到高频段
- 数字滤波器(Digital Filter): 把高频噪声滤掉,同时把1位数据流转换成高分辨率的数字输出
为什么叫Σ-Δ?Σ是积分(求和),Δ是差分。调制器里有一个积分器对误差进行累加,然后对累加结果做1位量化。说白了就是:误差越积越大,输出就翻转一下,把误差拉回来。
Σ-Δ ADC vs SAR ADC 关键区别:
| 特性 | SAR ADC | Σ-Δ ADC |
|---|---|---|
| 分辨率 | 8~16位 | 16~24位,甚至更高 |
| 采样率 | 可达数MSPS | 一般较低,几十kSPS以内 |
| 功耗 | 中等 | 相对较高(数字滤波耗电) |
| 抗噪能力 | 一般 | 强,噪声整形后信噪比高 |
| 典型应用 | 电机控制、数据采集 | 音频、精密测量、传感器 |
我记得有一次做高精度温度采集,要求分辨率达到0.01°C。用SAR ADC根本搞不定,16位ADC在3.3V参考下,1LSB对应50μV,温度传感器输出才10mV/°C,根本分辨不出来。后来换了Σ-Δ ADC,24位分辨率,1LSB不到0.2μV,问题迎刃而解。
1.3 分辨率与采样率的关系
分辨率,就是ADC能分辨的最小电压变化。N位ADC,分辨率 = Vref / 2^N。比如12位ADC,参考电压3.3V,分辨率 = 3.3 / 4096 ≈ 0.8mV。
采样率,就是ADC每秒能转换多少次,单位是SPS(Samples Per Second)。
这两个参数是互相制约的。为什么?
- SAR ADC: 分辨率越高,位数越多,需要的时钟周期越多,采样率自然就降下来了。16位SAR ADC比12位慢不少。
- Σ-Δ ADC: 分辨率越高,需要的过采样率(OSR)越高,数字滤波器的抽取倍数越大,输出采样率就越低。24位Σ-Δ ADC的输出速率通常只有几十到几百SPS。
避坑指南:我曾经在一个项目中选了24位Σ-Δ ADC,觉得精度越高越好。结果发现采样率只有10SPS,根本跟不上信号变化。后来才意识到,高分辨率和高采样率不可兼得,选型时一定要先搞清楚信号的带宽。
这里有个经验公式:对于Σ-Δ ADC,每提高一倍过采样率(OSR),信噪比提高3dB,相当于增加0.5位分辨率。但代价是输出采样率降低一半。
1.4 量化误差与信噪比
量化误差,是ADC天生就有的误差。因为模拟信号是连续的,但数字输出是离散的。比如一个12位ADC,输入2.0V,实际对应的数字量可能是2.000V到2.001V之间的某个值,但你只能取整。这个舍入误差就是量化误差。
量化误差的范围是 ±0.5 LSB。理论上,量化误差的均方根值是 LSB / √12。
信噪比(SNR),就是信号功率和噪声功率的比值。对于理想ADC,信噪比只由量化噪声决定:
SNR (dB) = 6.02 × N + 1.76
这个公式很实用。12位ADC的理论SNR = 6.02 × 12 + 1.76 = 74.0 dB。16位ADC的理论SNR = 6.02 × 16 + 1.76 = 98.1 dB。
实际ADC的SNR会比理论值低,原因包括:
- 热噪声:电阻和晶体管产生的随机噪声
- 时钟抖动:采样时钟的不稳定性
- 非线性:ADC的传递曲线不是完美的直线
- 电源噪声:供电纹波会耦合到ADC内部
我习惯在选型时,实际SNR至少要比理论值低3~6dB。比如需要80dB的SNR,理论算下来需要13位,但我通常会选16位的ADC,留出余量。
个人习惯:我在看ADC数据手册时,会特别关注ENOB(有效位数)。ENOB = (SNR - 1.76) / 6.02。比如一个16位ADC标称SNR为85dB,ENOB = (85 - 1.76) / 6.02 ≈ 13.8位。这说明实际有效精度只有13.8位,不是16位。很多厂商会拿理论值忽悠人,ENOB才是真实水平。
1.5 ADC核心知识体系
下面这张图把本章的核心知识点串起来了,方便你理解ADC选型和调试时的关键脉络:
这张图把SAR和Σ-Δ的对比、关键参数、选型建议都串起来了。你调试ADC时,脑子里要有这张图,遇到问题就知道从哪个方向排查。
最后提醒一句:ADC的参考电压(Vref)直接影响转换精度。我见过太多人用单片机的内部Vref,结果电源纹波大,ADC读数跟着跳。如果要求高精度,一定要用外部精密参考源,比如TL431或者REF30xx系列。别省这个钱,省了后面调试更痛苦。