单片机之ADC(模拟数字转换器)

一、ADC采样通道

最常见的ADC有两种:

  • ++逐次逼近型SAR-ADC++:这是我们最常见的8位/12位ADC,特点是转换速度快,适合消费类电子、小家电、充电器、个人护理等产品。
  • ++∑-Δ型ADC++:通常为24位高分辨率ADC,特点是精度高、噪声低,适合充气泵、额温枪、 体重秤等产品。

尽管"逐次逼近型SAR-ADC"、"∑-Δ型ADC"听起来很复杂,但请不必担心,本文不会深入复杂的芯片设计原理,而是聚焦于如何高效使用它们。

我们以12位ADC作为讲解对象,因为它是目前应用最广泛的类型,理解了它的使用,再学习其他类型的ADC就会事半功倍。

由于ADC涉及的概念较多,我们将分多次讲解,主要内容包括:采样通道、参考电压、分辨率、精度/误差、滤波等。


ADC操作流程


采样通道

如上图,ADC的采样通道分为"内部通道"、"外部通道"。通过配置相应的寄存器选择通道,即可实现对模拟信号的采集。

外部通道,通常直接连接到MCU的GPIO,如上图中的ANx。

内部通道,不占用外部引脚,在许多应用中能简化设计并提升可靠性

  • ++内部通道++ ++-VDD++:锂电池供电的应用上最为常见,可以直接将锂电池接在MCU的VDD端口,然后通过这个内部通道读取电池电压,从而省去一个额外的外部电阻分压网络和IO口,实现电池电压测量。

这里会存在另外一个问题:在VDD增加RC滤波的电路中,VDD端的电压实际比BAT要低一些,那么VDD采集电池电压如何更准确呢?

若需深入探讨,可以留言或在公众号发送信息。

  • ++内部通道-GND++:ADC的参考电压实际有2个,一个是大家常说的"参考电压",另外一个是容易忽略的"GND"。如果ADC以不稳定的GND为参考,采集到的电压就会有误差,这就是所谓的"零点偏移"(也就是我们常说的Offset)。零点校准可以消除offset,实际上是通过内部通道GND的采样消除。
  • ++内部通道-Vref++ :你可能会疑惑,参考电压怎么自己也能被测量?将会在"ADC-参考电压"给出答案。

通道切换

大部分应用都会使用多个ADC通道,那么在切换通道之后,需要等待多长时间,采集的数据才准确?估计很多工程师都有这个疑问。

其实,这和电路外围有关。核心原因在于外部电压需要对ADC内部的采样电容充电。如果外部阻抗比较大,达到目标电压的时间就会变长。如果在这种情况下,切换通道之后直接采集,那么采集到的值往往是不准的。也就是下图电压U以下时的采集。

电容充电曲线

一般来说,ADC的输入阻抗在用户手册的电气特性章节会给出一个最大值,并且它会和采样时间的设置相互关联,以此来判断需要多久延时。

当然,有些用户手册会提供延时说明。如果手册没有明确标注,那么在实际操作时,建议直接舍弃前1到2次的采样值。这个"舍弃"动作,本质上就是一个延时等待的过程,让信号充分稳定。

而对于切换到内部通道(比如VDD、Vref),通常不需要额外延时。

二、ADC参考电压(一)

文章关键总结

  • 测量的电压需低于参考电压

  • 重要公式和LSB

  • 结合应用介绍典型参考电压:1.2V、2V


参考电压

假设你有一把最大量程为 2米 的身高尺,它可以轻松测量低于2米的身高,但如果遇到超过2米的人,这把尺子就无法测量了。这里的 "2米 " 相当于ADC(模数转换器)中的 参考电压 ------它决定了ADC能够测量的电压上限。

因此,实际需要测量的电压必须 低于参考电压 ,否则转换结果将不准确或溢出。

常见的ADC参考电压有以下几种类型:

  • 内部1.2V

  • 内部2V

  • 内部2.048V

  • VDD(芯片供电电压)

具体支持哪一种或哪几种,需参考原厂的数据手册。不同厂商的芯片可能只提供其中一种参考电压选项,因此在芯片选型时,务必结合实际测量范围的需求,重点关注这一参数。


重要公式

  • 转换电压 :输入到ADC采样通道的实际电压值,可查看" MCU之采样通道"

  • AD值 :ADC完成转换后的数值,通常在用户手册的寄存器描述中查看格式与范围

  • 参考电压 :即本次重点介绍的基准电压

  • 4096 :对应 12位ADC 的分辨率,即 2¹²,若为 8位ADC ,则该数值为 2⁸= 256

举例来说,在12位ADC中,若参考电压为2.048V,采集到的AD值为2048,则实际电压为:


重要单位:LSB

LSB,最低有效位。这个听起来有些拗口的专业名词,其实代表了ADC能识别的最小电压变化。

以一个参考电压为 2V12位ADC 为例:

1 LSB = 2 / 4096 ≈ 0.00048828

这个数值有两层含义:

  • 在理想情况下(不考虑误差),这是ADC能够测量的 最小电压单位

  • ADC输出的两个相邻数字值(例如1000和1001)所对应的实际电压 差值


内部参考电压:1.2V和2V

如果要采集的电压低于0.48828mV怎么办呢,我们可以选择更低的参考电压,如1.2V。

参考电压为 1.2V12位ADC,1 LSB = 1.2 / 4096 ≈ 0.00029297

内部参考电压1.2V和2V,是我们在设计方案时最常用的参考电压。

举一个实际应用:TWS充电仓

在TWS充电仓的设计中,通常需要检测一个非常微小的电流,用以判断耳机是否充满。例如,某些产品要求电流在5mA~8mA时关断充电。我们以7mA的关断电流、搭配1Ω采样电阻为例,此时采样电阻上的电压为7mV。

我们结合ADC公式,来具体对比使用内部1.2V和2V参考电压的差异:

|-----|------------|---|-----|------------|
| 内部参考电压2V || | 内部参考电压1.2V ||
| AD值 | 转换电压 mV | | AD值 | 转换电压 mV |
| 12 | 5.859375 | | 22 | 6.4453125 |
| 13 | 6.34765625 | | 23 | 6.73828125 |
| 14 | 6.8359375 | | 24 | 7.03125 |
| 15 | 7.32421875 | | 25 | 7.32421875 |
| 16 | 7.8125 | | 26 | 7.6171875 |

由上述表格可看出,在不考虑其他误差的情况下,对于7mV检测点,使用内部1.2V参考电压确实比2V具有更高的理论精度。同样采集5个数值,1.2V参考电压所对应的"转换电压"范围也更小,这意味着测量结果更加集中。

尽管在小电流检测的场景中,1.2V在参数上优于2V,但在实际项目里,内部2V参考电压通常是完全足够的。这是因为被采集的电流信号本身很小,设计时通常会预留足够的余量,且整个电路工作环境相对平稳。此外,许多MCU的ADC模块具备偏移校准/零点校准功能,可进一步保证测量准确性。因此,在实际产品应用中,1.2V和2V参考电压之间的差异通常并不明显。


由于篇幅所限,关于ADC参考电压的其他重要内容,我们将在下一篇文章中继续讲解,包括: 参考电压VDD、切换参考电压、参考电压的妙用

*三、*ADC参考电压(二)

文章关键总结

  • 结合应用介绍参考电压:VDD

  • 切换参考电压的延时及妙用


参考电压:VDD

使用参考电压VDD的典型应用:NTC温度采集、MOS驱动电路的短路/过流检测。

我们以 NTC温度采集 为例,下图是等效电路图

待测点的电压是

我们具体推算一下 VDD内部2V 这两类参考电压,就能直观地判断哪种更合适。

  • 参考电压VDD
  • 参考电压2V

这2种的差异:使用 VDD作为参考电压 ,其计算公式中的 VDD 会自然抵消,使得结果与电源绝对值无关。

而使用 内部2V参考电压 ,必须已知VDD的精确电压,才能反推回 NTC 的阻值。

在电动牙刷、电推剪、便携式榨汁机、电子烟等产品的短路/过流检测中,常采用 VDD作为ADC参考电压。其检测原理与NTC温度采集类似,通过判断采样点电压是否超阈值来实现保护。

若需深入探讨,可以留言或在公众号发送信息。


切换参考电压

ADC参考电压切换后需等待稳定,但不同切换方向的稳定时间不同:

  • 内部参考→VDD:稳定时间极短,通常可忽略

  • VDD→内部参考:需要一定稳定时间

原因:VDD由外部电容支撑,持续稳定;内部参考电压在未使用时可能关闭,重新启用需要启动和稳定时间。

具体延时请以芯片数据手册为准,必要时可通过实测或咨询原厂确定最佳值。

零延时切换是技术趋势,因此即便是同一厂商,其新旧产品在性能上也会有差异。


参考电压的妙用

在"MCU之采样通道"一文中我们提到,当采样通道选择 内部参考电压Vref ,且 参考电压源选择VDD 时,由于Vref是固定值(如2V),此时ADC的读数直接反映了VDD的电压大小,如下公式:

有些芯片的采样通道支持 VDD/4 ,如下公式:

在需 快速交替采集 电池电压(**用VDD作基准)**和供电电流(用内部基准Vref)的应用场景中,参考电压切换带来的延时可能无法满足实时性要求。

对此,有两种解决方案:

  • 若MCU支持将内部基准电压Vref配置为 ADC采样通道 (而非基准源),则可直接测量其电压,避免切换延时;

  • 若芯片本身的参考电压切换速度极快,也可直接使用。

四、AD时钟、采样与转换时间

ADC在配置并启动后,会自动执行 采样与转换 两个步骤。通常只需等待转换完成,读取结果即可。不过,不同MCU厂商通常会提供诸如AD时钟配置、采样时间选择等参数供调整。常见的程序处理方式是循环等待转换完成,这段时间即为采样与转换所需的总时间。

本文将以AD时钟、采样及转换时间为重点展开说明。

AD时钟

采样与转换的时间基于AD时钟,不同MCU厂商对AD时钟的称呼可能不同,例如中微称其为TAD,晟矽和应广则称为ADCLK。AD时钟通常由内部高频时钟分频得到。对于采用RISC内核的MCU,AD时钟频率多集中在1MHz、500kHz和250kHz;而基于51内核的MCU,其AD时钟通常更快,常见有4MHz、8MHz、12MHz和16MHz。

尽管部分用户手册支持选择更高的AD时钟频率,但在实际应用中,其表现会受到参考电压、工作电压等条件的限制。

根据中微某产品的建议(如下图),在锂电池供电条件下:

  • 当参考电压为VDD时,AD时钟需设为 FHSI / 32 = 16M / 32 = 500KHz

  • 当参考电压为2V时,AD时钟需设为 FHSI / 128 = 16M / 128 = 125KHz

如下图晟矽某产品的建议,其AD时钟可根据参考电压进行配置,最高频率为2MHz或1MHz:


RISC内核的采样/转换时间

我们以最常用的500kHz的AD时钟为例,说明从启动ADC到获取数值的总时间计算。ADC工作包含"采样"与"转换"两个阶段,总时间为二者之和,该时间需结合AD时钟计算。

各厂商的表述方式不同:例如中微、应广、十速等厂商的用户手册中,常用"转换时间"来指代整个过程的耗时。如前文展示的中微表格就列出了不同配置下的转换时间:

十速则在电气特性中给出答案

与之前厂商不同,晟矽将总时间明确划分为可配置的采样时间与固定的12个AD时钟转换时间。因此,总时间 = (采样时间 + 12) / AD时钟频率。

以某产品为例:AD时钟为500kHz,若设置采样时间为8个时钟周期,则总时间为 (8 + 12) / 500kHz = 40μs。

好了,现在你已清楚如何计算时序。但随之而来的问题是:我们为何要深究?直接使用厂商的Democode是不是就行了?

五、MCU方案不稳定?先看看ADC"磨蹭"了多久

在上一篇MCU之AD时钟、采样与转换时间中,我们探讨了"++AD时钟++ "与"++RISC内核的采样/转换时间++",相信不少读者心中可能会浮现出这样几个疑问:

  • 8位机的采样/转换时间为何能达到几十us这么长?

  • 文中提到"RISC内核",那8051内核的情况又如何呢?

  • 我们为什么要特别关注ADC的采样/转换时间?


8051内核的采样/转换时间

在8051内核产品的电气特性中,单次ADC的采样/转换时间,通常以"采样率"或"转换率"来表示。

中微CMS8S6990C

晟矽MC51F7084

采样率/转换率的单位是sps,即"每秒采样次数"。

例如,若采样/转换率为 1 Msps,则单次 ADC 采样转换时间为 1 μs;若转换率为 500 Ksps,则单次时间为 2 μs。与上一篇文章提到的RISC内核几十us的采样转换时间相比,8051内核的速度明显更快。

需要注意的是,电气特性中标注的采样率/转换率通常是最大值,实际使用时应当根据具体应用需求选择合适的数值。


我们为何要关注采样/转换时间呢

在大多数简单应用中,工程师通常只需参照例程编写代码,此时大家更关注的是ADC的采样结果的准确性。

但对于时间要求较高的场景,例如电子烟、无刷电机驱动、便携式榨汁机等,ADC的采样/转换时间就显得尤为关键。这类应用往往需要快速做出响应,比如在短路时必须在规定时间内关闭MOS输出。以电子烟为例,通常要求在短路发生后50μs内关闭MOS。虽然大家可能会首先想到使用比较器,但该领域中的高手往往会借助ADC来实现这一保护。在如此短的时间内,如果单次采样时间过长,且未做滤波处理,就极易导致误判。因此,AD时钟和采样/转换时间是这类应用中至关重要的参数。

从程序实现的角度来看,若将ADC放置在中断中执行,就必须考虑定时器的中断配置。假设ADC采样/转换时间为40 μs,而定时器中断周期为50 μs,那么中断频率会非常高,导致主程序运行效率大幅下降。如果定时器中断周期设为30 μs(小于ADC转换时间),则主程序将完全无法执行,这样的定时器配置也就失去了意义。

此外,如果系统中ADC通道较多,且每个通道需要多次采样,工程需若不清楚采样/转换时间的计算,就可能影响采用 时间片轮询法 编写的代码,导致各时间片的时序发生偏差。

最后,ADC采样往往需要与PWM模块配合工作。若两者能够实现最佳配置,采样到的数据就会更加稳定、准确。这也解释了为什么使用相同的产品和相同的MCU,有些人设计的系统更加稳定可靠。

六、MCU之ADC分辨率、误差、精度、有效位

ADC最核心的竞争力和最容易混淆的几个概念:分辨率、误差、精度、有效位

分辨率

想象一下家里的空调:有的空调支持0.5℃一档加减,有的则是1℃一档。这0.5℃和1℃就是分辨率。

对于ADC来说:

  • 24-bit分辨率:则切割成了 16,777,216 份(2的24次方)

  • 12-bit分辨率:将参考电压切割成4096份(2的12次方)

  • 8-bit分辨率:将参考电压切割成256份(2的8次方)

误区提醒:分辨率高,并不代表测量一定准。就像一把尺子刻度画得再细(分辨率高),如果尺子本身受热缩短了,量出来的长度依然是错的。所以,分辨率通常只代表ADC的"理论位数"。

误差与精度

举个例子:

在一个恒温25.0℃的实验室里,你用两个温度计测量:

  • B显示26.0℃,误差为1.0℃(误差4.0%)。

  • A显示25.2℃,误差为0.2℃(误差0.8%);

显然,A的精度比B高。

在实际电路中,ADC采集的误差 = ADC模块固有误差 + 外部电路误差。如果用MCU采集NTC热敏电阻的电压,最终发现偏差很大,这不一定是ADC的锅。外部分压电阻的精度(1%或5%)、参考电压的漂移、甚至PCB走线的干扰,都会叠加在最终结果上。

有效位

一个12位分辨率的ADC,但实际用起来,可能只有9位是稳的。

假设使用2V的参考电压,测量一个恒定的1V信号,理论ADC值应该是2048(二进制:1000 0000 0000)。

但在实际读取时,你发现最后3位一直在跳动(000~111之间随机乱变)。这意味着这最后3位是"无效"的,受噪声影响无法信任。

这时,原本12位的分辨率,扣除掉3位波动,有效位就只有9位。

这波动的3位对应约4mV的电压偏差。在普通电池电压检测中,4mV可能不算什么;但在TWS耳机充电仓检测"充满关断电流"这种微弱信号时,4mV的波动可能误判。

如下是中微SC8F076和芯圣HC18M30xF的用户手册,中微标注在选择内部参考电压时,有效位是8位;芯圣的典型值是10位。并非所有的用户手册都会标注有效位。

通过前面的对比,我们不难发现:ADC误差才是决定测量"准不准"与"稳不稳"的核心。既然误差如此关键,那它究竟是从哪儿来的?在接下来的系列文章中,我将带大家拆解 ADC 误差的来源。我们不仅会分析 ADC 本身的增益误差、偏移误差,还会涉及那些听起来让人头大的**积分非线性误差(INL)、微分非线性误差(DNL)**等等。我会延续通俗易懂的风格,带你攻克这些晦涩的专业名词。

相关推荐
无事好时节2 小时前
51 单片机GPIO / 按键 / 中断 / 定时器 / PWM
单片机·嵌入式硬件
一枝小雨4 小时前
【OTA专题】17 打通Bootloader与App逻辑之间的通信
stm32·单片机·嵌入式·流程图·freertos·ota·bootloader
2401_863318636 小时前
基于单片机的家庭防盗报警系统
单片机·嵌入式硬件
一枝小雨6 小时前
【OTA专题】18 OTA性能优化:优化bootloader存储空间与固件完整性校验(CRC)
stm32·单片机·性能优化·嵌入式·freertos·ota·bootloader
iYun在学C6 小时前
驱动程序(注册字符设备)
linux·嵌入式硬件
尼喃6 小时前
PW2605Z,专为系统安全护航的高可靠性负载开关
stm32·单片机·嵌入式硬件
阿昊真人7 小时前
stm32 按键中断
stm32·单片机·嵌入式硬件
代码游侠7 小时前
学习笔记——51单片机学习
笔记·stm32·单片机·嵌入式硬件·51单片机
松涛和鸣7 小时前
DAY52 7-Segment Display/GPIO/Buttons/Interrupts/Timers/PWM
c语言·数据库·单片机·sqlite·html