ADC 的原理与实战

一、ADC 的核心作用:模拟与数字的桥梁

现实世界的物理量,比如温度、压力,首先会被传感器转换成连续变化的模拟电压。ADC 的任务,就是把这个模拟电压 "翻译" 成离散的数字信号,再送入数字系统进行处理。

在这个过程中,你可以把它想象成用一把有刻度的尺子去量一段连续的绳子。尺子的刻度越密(ADC 位数越高),测量结果就越精确,但尺子本身也会更复杂、更贵。


二、逐次逼近型 ADC:速度与精度的平衡

市面上有很多种 ADC 架构,而逐次逼近型(SAR)ADC是嵌入式领域最常见的一种。它的核心优势在于找到了速度和精度的平衡点:速度比双积分型快得多,精度又比 Flash 型高不少,非常适合大多数工业和消费类场景。

它的工作原理很像猜数字游戏:

  1. 第一步:先猜一个中间值(比如 5V 参考电压下,先猜 2.5V),和待测电压比较。
  2. 第二步:如果猜小了,就加上下一个更小的步长(比如 1.25V);如果猜大了,就不加。
  3. 第三步:不断重复这个过程,步长每次减半,直到逼近真实电压值。

举个例子,用 8 位 ADC 测量 3.8V 电压(参考电压 5V):

  • 第 1 次:2.5V < 3.8V → 保留高位为 1
  • 第 2 次:2.5V + 1.25V = 3.75V < 3.8V → 第二位为 1
  • 第 3 次:3.75V + 0.625V = 4.375V > 3.8V → 第三位为 0
  • ......
  • 最终得到二进制码:1100 0010(即十进制 194)
  • 换算回电压:194 / 256 * 5V ≈ 3.79V,和真实值 3.8V 非常接近

三、关键参数:选型时必看的三个指标

拿到一款 ADC 的数据手册,先别急着看引脚,这三个核心参数决定了它是否适合你的项目:

1. 分辨率

分辨率由 ADC 的位数决定,比如 8 位、12 位、16 位。位数越高,能表示的电压等级就越多,测量就越精细。

  • 8 位 ADC:能把参考电压分成 2⁸=256 个等级
  • 12 位 ADC:能分成 4096 个等级
  • 例如,用 12 位 ADC 测量 3.0V-4.2V 的锂电池电压,最小能分辨出约 0.29mV 的变化,精度足够满足需求。

2. 量程

量程是 ADC 能测量的输入电压范围,通常由参考电压决定。如果输入电压超出量程,会出现 "削顶" 失真,甚至损坏芯片。

  • 信号太小:可以用运算放大器先放大
  • 信号太大:可以用电阻分压来降低

3. 精度

精度是指测量值与真实值的误差,这比单纯看位数更重要。高精度 ADC 会在手册中明确标出偏移误差、增益误差、积分非线性(INL)等指标,当然价格也会更高。如果你的应用对绝对准确性要求极高(比如精密仪器),就必须仔细研究这些参数。


四、实战技巧:让你的 ADC 测量更可靠

1. 硬件设计:分压与滤波

如果要测量的电压超出了 ADC 量程(比如 10V),可以用电阻分压来解决。比如用一个 10kΩ 的采样电阻 Rt 和一个 10kΩ 的下拉电阻 R0,就能把 10V 电压分压到 5V,刚好适配 5V 参考电压的 ADC。分压公式为:V=U∗Rt​+R0​Rt​​

另外,模拟信号很容易受到噪声干扰,所以在 ADC 输入端增加滤波电路非常必要。常见的滤波方式有:

  • 均值滤波:对多次采样结果取平均,适合消除随机噪声
  • 中值滤波:取多次采样的中间值,适合消除脉冲干扰
  • 高低通滤波:根据噪声频率选择合适的截止频率

2. 软件算法:逐次逼近的实现

在软件里,我们可以用几行代码就实现逐次逼近的逻辑:

c

运行

复制代码
unsigned int adc_value;
while(Nb--) {
    if(N + V0/2 < V1) {
        N += V0/2;
        data = (data << 1) | 1;
    } else {
        data = (data << 1) | 0;
    }
    V0 /= 2;
}

这段代码通过不断减半步长(V0),逐位确定最终的数字量,和硬件 ADC 的工作原理完全一致。


五、总结

ADC 是连接物理世界和数字系统的关键纽带。理解它的原理,掌握选型和实战技巧,能让你在嵌入式开发中更游刃有余。

相关推荐
山峰哥5 分钟前
数据库性能救星:Explain执行计划深度拆解
服务器·开发语言·数据库·sql·启发式算法
KOAN凯擎小妹44 分钟前
无源晶振为什么有串联谐振和并联谐振?MCU为什么使用并联晶体?
单片机·嵌入式硬件·晶振·元器件
影视飓风TIM1 小时前
Linux下C程序编译:gcc 动态链接与静态链接全解
linux·c语言
花生了什么事o2 小时前
synchronized 与 ReentrantLock:Java 锁机制原理与实现对比
java·开发语言
茯苓gao2 小时前
嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战
网络·笔记·stm32·嵌入式硬件·学习·汽车
aramae2 小时前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端
ZHOU_WUYI2 小时前
4. light wam 模型loss计算过程
开发语言·人工智能·python
长不胖的路人甲3 小时前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
论迹复利3 小时前
蓝牙 OTA 升级断连、升级失败底层链路问题定位
嵌入式硬件·安全·bt
振南的单片机世界4 小时前
3.5T静默分帧,CRC16校验:Modbus-RTU帧结构解析
arm开发·stm32·单片机·嵌入式硬件