☰
SAR ADC高精度数据采集实战:原理、采样电路与校准
2026/10/21 9:59:50 网站建设 项目流程

做高精度数据采集的工程师,早晚都会碰到SAR ADC。无论是电桥称重、电机电流采样、振动监测还是便携式仪器,逐次逼近型ADC几乎是无处不在的主力方案。很多人觉得选一颗24位的ADC就能得到24位精度,实际做出来一测,有效位数可能只有16位。这篇文章把我这些年用SAR ADC做High-Precision Data Acquisition的实践、调试和踩坑经验整理出来,围绕SAR ADC的原理、采样电路设计、驱动配置、校准和滤波几个环节展开,适合正在调ADC采样链路、做数据采集板或者准备选型的工程师参考。

1. 先理解SAR ADC:一个二进制搜索的天平

1.1 为什么叫SAR:不是合成孔径雷达

SAR这个词在不同领域撞车很严重。做遥感的人说到SAR,想到的是Synthetic Aperture Radar,合成孔径雷达,通过卫星或者无人机发微波对地面成像。做数据采集的人说到SAR,指的是Successive Approximation Register,逐次逼近寄存器。这完全是两码事。这篇文章只讨论后者,但网上搜SAR ADC的时候很容易带出大量雷达回波数据、SAR原始回波仿真、星载SAR参数之类的结果,大家别被带偏。

逐次逼近型ADC的核心思想,最早可以追溯到水银延迟线时代的逐次比较技术,但真正在集成电路里大规模落地,还是靠电荷再分配型电容DAC的成熟。现代一颗16位到24位的SAR ADC,内部就是采样保持电路、比较器、SAR逻辑和电容型DAC这几个部分。没有复杂到让人劝退,却对周边电路极其敏感。

1.2 逐次逼近的采样过程

逐次逼近的过程很像用天平称重。假设被测电压相当于一个未知重量的物体,SAR ADC内部的DAC电容阵列相当于砝码组,比较器就是判断“重了还是轻了”的手。第一次比较,把1/2满量程的电压和输入比,如果输入更大,最高位记为1,否则记为0。第二次根据这个结果,在1/4满量程或者3/4满量程上继续比,逐位确定下一比特。N位的SAR ADC只需要N次比较就能完成一次转换,所以它天然具备转换延迟低、速度快、功耗省的优点。

这里面有个细节容易被忽略:现代SAR ADC的电容阵列既当采样电容,又当DAC使用。采样阶段,输入信号对电容阵列充电;转换阶段,电容阵列把这些电荷重新分配,配合比较器逐位逼近。电容阵列的匹配精度直接决定了INL和DNL,这就是为什么同一颗ADC在出厂后还要做校准,尤其是高位产品,前台校准几乎是标配。

1.3 SAR ADC的家族定位:在速度和精度之间卡位

ADC家族里,SAR ADC的位置很微妙。和Delta-Sigma ADC相比,SAR的转换是“即时”的,没有流水线延迟,也没有数字滤波器的群延迟,非常适合多通道复用一个ADC、逐点采样、闭环控制这些场景。Delta-Sigma的优势在极高分辨率和低频高精度,牺牲的是速度。SAR则能在16位到24位的区间里做到几百kSPS乃至几MSPS,比如24位SAR ADC也能跑到1MSPS以上,这个区间基本是SAR一家的天下。

SAR ADC的功耗和采样率基本呈线性关系,不像流水线ADC有固定功耗,所以在电池供电、便携式高精度采集设备上非常友好。理解了这几点,后面讨论电路设计、选型、校准,心里就有谱了。

2. 高精度数据采集的第一道坎:供电、基准与输入电路

很多人觉得ADC精度取决于分辨率,其实在真实系统里,比分辨率更早暴露问题的是供电、基准和输入驱动。做过20位ADC的工程师都有体会:如果参考电源和模拟供电做得不干净,板卡底噪会直接吃掉好几个有效位。

2.1 20位ADC对电源精度和基准的要求

20位ADC的理论最低有效位是1/1048576满量程,对应1LSB的电压在5V基准下只有4.77uV。这个量级意味着参考电源上哪怕出现几十微伏的纹波,都能在转换结果里看到明显跳码。所以高精度SAR ADC的基准不能直接拿开关电源输出接上去,至少需要一级低噪声LDO,再加一个高精度低温度漂移的基准源。很多分立方案会用ADR4525、REF5025这类基准,关键指标是初始精度、温漂1ppm/摄氏度级别、噪声峰峰值尽量低。

如果板子上同时有开关电源和ADC,数字电路和模拟电路尽量分电源域。给ADC的模拟电源AVDD,通常还要串磁珠或者PI滤波,把MHz级开关纹波压下去。我自己试过,同样的样板,把开关电源的3.3V直接给模拟部分,24位ADC的峰峰值噪声大约能到十几微伏;换成LDO加PI滤波之后,峰峰值能压到几微伏以内。这一点在ADC测试板上尤其重要。

有个容易被忽略的坑是基准输入引脚的旁路电容。高精度基准输出往往不能直接驱动大电容,有些基准源对容性负载有限制,搞不好会自激。正确的做法是:基准源输出到ADC的REF引脚之间放一个小电阻,比如10欧姆,再接一个1uF到10uF的低ESR电容,形成一个低通网络,同时避免基准源直接驱动大电容。

2.2 输入驱动与采样钳位电路的阻容值怎么选

SAR ADC输入端通常有一个采样开关和内部电容阵列。外部必须加RC钳位电路,也就是串联电阻和接地电容,用来抑制输入源的输出阻抗、滤除高频噪声、给采样电容在极短采样窗口内快速充电。阻容值选不好,轻则有效位数下降,重则出现幅值误差。

阻值的下限是驱动放大器的稳定性和静电防护要求,上限是采样建立时间。一个常用的简化估算:采样时间t_sample至少需要给采样电容充电到0.5LSB以内的误差。建立时间大约等于7到9倍时间常数,时间常数由外部源阻抗、串联电阻和总输入电容共同决定。比如你外部串联22欧姆,内部采样电容看到的总电容可能是几十pF到几百pF,那么时间常数大概在几纳秒到几十纳秒。要求建立到1/2^20精度,需要ln(2^20)=13.9个时间常数,还要考虑余量。ADC数据手册通常会给出最小采样时间,配合外部RC仿真,再把实际代码跑一遍看码值稳定性。

比较常见的外置RC组合是20到50欧姆串联电阻、1nF到几nF并联电容。电容太大会拖慢RC响应,太小滤不掉噪声。注意电容要用C0G/NPO等低介质吸收的陶瓷电容,不要用X7R,X7R的电压特性和介质吸收在精密ADC面前都很致命。

驱动放大器方面,运放的输出必须能在采样瞬时提供足够大的瞬态电流,带宽和压摆率都要考虑。对20位SAR ADC,通常要选低噪声、低失真的运放做RC驱动,很多工程师直接用ADC手册推荐的配套运放,这是最稳的做法。自己做选型时,我习惯看运放数据手册里的输出阻抗曲线,而不是只看带宽指标,因为ADC采样瞬间的电流需求很陡,输出阻抗如果在中频段抬起来,建立时间会明显变差。

2.3 降低板卡底噪:ADC测试绕不开的一道坎

ADC测试里最让人头疼的不是程序,而是底噪。一块板子如果底噪太差,用频谱分析看FFT,噪底比手册典型值高出一大截。我踩过几个坑,总结下来主要是这几类:

  • 数字信号线在模拟区域附近乱跑,产生串扰。特别是SPI的SCLK,边沿很陡,容性耦合到输入走线或者参考走线上就麻烦了。
  • 电源去耦不足。每个模拟电源引脚附近都要放一颗100nF低ESL电容,大电容可以共用一个10uF到22uF的X7R或钽电容,并注意摆放位置。
  • 地回路不干净。不要盲目用“一刀切”分割,模拟地和数字地最终要在合适位置单点汇接;返回电流路径不能横穿模拟输入区域。
  • 测试时没有用屏蔽罩。环境里的电磁干扰会直接被高输入阻抗的ADC采样到,特别是在输入悬空或高阻端接时。

实际操作中,我一般在输入前端预留一个RC组合的位置,屏蔽罩也留好。测试时先用短路输入看噪声码分布,再逐步接入信号源,定位噪声来源。比如把输入短接到地,如果ADC输出码的散布依然很大,说明噪声来自板内部;如果把信号源接上之后噪声明显增大,就要怀疑信号源本身或者共模干扰。这个方法比直接上FFT更直觉,也更容易定位。

3. 嵌入式场景下的ADC实战:多通道、DMA与定时器触发

独立SAR ADC芯片之外,MCU内置ADC的应用更普遍。STM32、GD32、S32K312这些平台上的ADC,本身大都是SAR架构,很多高精度采集场景其实是用MCU内置ADC加外部调理电路实现的。这里的实战经验更集中,也更容易踩坑。

3.1 多通道扫描+循环采样+DMA的配置思路

STM32和GD32的SAR ADC要做多通道循环采样,最省CPU的方式就是扫描模式加DMA循环模式。配置时有一堆顺序容易搞错:先把通道排序寄存器设置好,比如规则序列里填上IN0、IN1、IN2;再把ADC通道采样时间统一设置好,多通道切换时如果采样时间不同,转换结果会串味。然后设置ADC为连续转换,开启扫描;最后配置DMA为循环模式,数据宽度要按ADC分辨率设置,比如12位右对齐时数据是16位的,但是只用低12位。

很多初学者犯的错误是只开DMA不设置循环模式,一轮采完DMA就停了,看起来只有前几次数据有效。另一个是SCAN模式下连续转换没有关闭EOC中断,导致中断频繁,CPU被拖死。正确做法是使用DMA传输完成中断,不要在EOC上打断。

如果做的是16位的外部SAR ADC,通过SPI读取,同样可以用DMA接收。这时要注意SPI帧格式和ADC转换完成标志的配合。有些ADC需要每次转换完成后主机发起读操作,如果DMA自动连续读,可能读到上一次的旧数据。更好的做法是用ADC的转换完成信号触发一个GPIO,再由定时器或外部中断启动SPI DMA读取,保证每次读到的都是最新一次转换结果。

3.2 DMA数据与手动轮询不一致的排查

有人会碰到一个问题:ADC用手动读数据寄存器的时候,值很稳定,切到DMA采集后,数组里出现一些“乱跳”的值,或者规律性地变化。这个现象我遇到过好几次,常见原因有几个:

  • 数据右对齐和左对齐没对应上,DMA按照字长度搬数据,结果低12位和高位放反了。
  • 没有等转换完成就读数据,尤其是用了连续转换,DMA可能在数据寄存器更新到一半时把旧值搬走。解决方法是确保DMA搬运时机和数据更新时序匹配,或者使用双重缓冲并检查数据有效性位。
  • 多通道扫描时,第一个通道的结果可能来自上一次转换的残余电荷,尤其是通道切换后第一次转换需要多丢弃一次。这个在4通道扫描循环里很典型:数组开头那一个值经常异常。

排查思路:先关掉DMA,单通道手动触发,打log看原始寄存器值;再开一个通道的DMA看看;最后再加第二个通道。逐级增加变量,比直接看一堆数组蒙圈快得多。

还有一次我遇到的神奇现象是DMA拿到的一串数据每隔N个点就重复一遍,查了半天发现是ADC的DMA地址没有递增,一直写到同一个缓冲区。这在Cortex-M平台上容易发生,因为外设DMA请求的地址寄存器配置错了,增量模式没开。检查DMA配置时,一定要确认外设地址固定,内存地址递增,数据宽度一致。

3.3 定时器触发ADC与FOC电流采样窗口

电机控制FOC里,电流采样要求在PWM周期内精确的时刻触发,通常用定时器更新事件或TRGO信号触发ADC。这样做的核心原因是为了避开PWM开通关断时产生的共模噪声尖峰,让采样窗口落在电流纹波的中心位置。用定时器触发而不是软件触发,能保证最小抖动。

配置上,STM32用TIM1/TIM8等高级定时器的TRGO触发ADC,需要在定时器里设置触发输出模式,ADC里选择外部触发源。GD32类似。S32K312上也有PTC和TRGMUX做触发路由,思路一致,只是寄存器名和配置工具不同。

FOC采样的时间窗口很有讲究。一般来说,采样时刻要在PWM下桥臂导通且开关动作完成之后,至少要留出1微秒到2微秒的稳定时间。如果ADC采样时间太短、输入RC太大,采到的电流可能是错误的。调试时可以故意把触发时刻前后移动几次,观察电流波形是否有毛刺,毛刺出现的位置就是PWM噪声活跃区。

还有一个容易被忽略的点:定时器触发ADC时,ADC的采样时间不能设置得太短。有些工程师为了追求高采样率,把采样周期压到极限,结果输入电容还没建立完成,转换结果带着前一个周期的残留电荷。这个在FOC里表现为电流波形有周期性台阶,不是随机噪声,很容易被误判为电机本身的问题。

3.4 一个实用的ADC值滤波函数

后处理滤波往往也决定采集质量。最常用的三种:滑动平均、中位值滤波、一阶低通。滑动平均适合过采样降噪,但会钝化突变;中位值滤波适合剔除尖峰干扰;一阶低通在需要平滑且计算量小的场合很好用。

我给出一个整数一阶低通的写法,避免浮点运算:

int16_t adc_lowpass(int16_t new_val, int16_t *state, uint16_t alpha) { // alpha范围0-1024,alpha越大响应越快 int32_t tmp = (int32_t)new_val * alpha + (int32_t)(*state) * (1024 - alpha); *state = (int16_t)(tmp >> 10); return *state; }

alpha取64时,相当于时间常数和采样周期有关,实测对工频噪声有一定抑制。注意不要盲目用低通滤波削弱真实信号,尤其是高速闭环控制系统里,滤波带来的滞后可能让控制环不稳定。我的原则是:能通过布局和采样窗口解决的噪声,尽量不从软件滤波解决。

滑动平均也分两种,普通平均值和加权平均。对ADC采样,我比较推荐先做中位值滤波去掉尖峰,再做滑动平均压白噪声。这个组合对付工业现场的电磁干扰特别有效,代价是多花一点RAM。如果MCU资源紧张,可以只做一阶低通,效果也够用。

4. 校准、信噪比与有效位数:从指标到真实精度

高精度数据采集里,最常被误解的指标就是有效位数。一颗芯片上印着24位,不代表你系统里真的有24位有效精度。这个差距,就是理论和工程的距离。

4.1 SNR、SINAD与ENOB怎么算

信噪比SNR是信号能量和所有噪声能量之比,但真正决定有效位数的是SINAD,也就是包含谐波失真在内的信噪失真比。换算公式是ENOB = (SINAD - 1.76) / 6.02。举例来说,一颗标称24位的SAR ADC,如果SINAD实测只有100dB,ENOB=16.3位,实际可用精度就是16位级别。

很多产品宣传页写“24位ADC”,没有写SINAD。选型时一定看数据手册里的SINAD或ENOB,同时看测试条件——输入频率越高,SINAD往往越差。数据手册上的指标常常是在极低输入频率下测出来的,真实系统里要打折扣。

比如我测试过一颗标称18位的SAR ADC,在1kHz输入时SINAD是98dB,ENOB约16位;把输入频率提高到50kHz,SINAD掉到92dB,ENOB只剩15位。这个差异不是芯片坏了,而是采样保持电路的孔径抖动和比较器带宽在起作用。所以评估ADC能不能用,一定要拿自己实际用的信号频率去测,而不是只盯最大采样率。

4.2 模拟前台校准到底在做什么

SAR ADC内部电容阵列制造时会有失配,导致DNL、INL和失调误差。现代高精度SAR内部通常会集成自校准逻辑,上电后或者接到校准指令后,在模拟前端对电容阵列充放电,用比较器测出每个权重电容的实际偏差,然后写进校准寄存器。这个过程叫模拟前台校准,analog foreground calibration。它是在正常转换前做的一次性校准,做完之后转换结果精度显著提升。需要注意的是,校准期间不能进行正常采样,所以很多ADC上电后都要等校准完成再启动采样,否则前几个转换值不准。

前台校准这个词,对应的是后台校准background calibration。后台校准在正常转换过程中持续或间歇进行,不需要打断采样,但实现复杂、成本高。对大多数系统,前台校准已经足够,只要每次上电后稍微等一下再采集就行。

我自己调试一颗24位SAR ADC时,发现上电后立刻采样,前几十个点偏差明显。后来看手册才发现校准完成位没查,校准没结束就开始转换了。这个坑特别容易踩,尤其是用现成驱动库的时候,配置函数可能只做了基本的初始化,没有等待校准标志。

4.3 系统层面的增益与失调校准

如果是自己搭的SAR ADC方案,外部校准也很常见。做法是输入一个精密的接近满量程的已知电压,采集后计算增益系数;输入地或者中点电压,计算失调系数。然后用软件在每次转换结果上做线性修正。这种两点校准能修正增益误差和失调,但修正不了INL的非线性。

实操中,我会在批量板上做两点校准。比如HX717这类用于称重的24位SAR ADC,校准系数可以直接写入芯片,也可以用MCU修正。校准流程是:先让系统输入零位,读取AD值记为offset;再输入一个标准砝码或者精密电压,读取AD值记为gain_raw,标准物理量记为gain_ref。那么任意测量值value的修正公式是:

value_corrected = (value_raw - offset) * gain_ref / (gain_raw - offset)

代码里用整数运算和Q格式避免浮点过重。校准完再测一遍中间点,看线性度。如果还是偏差明显,就要怀疑INL、温度漂移或者输入电路,而不是继续堆校准点。

校准的温度特性也值得注意。很多芯片的失调和增益系数会随温度变化,出厂校准只能保证常温下的精度。如果设备工作范围宽,最好在关键温度点重新标定,或者选择温漂系数足够低的ADC和基准。对高精度工业变送器来说,温漂往往最后变成系统瓶颈,比噪声还难处理。

4.4 过采样为什么不是万能药

提高采样率再做平均,确实能降低白噪声,有效位数大约每4倍采样率提升1位。但过采样只能改善随机噪声,对确定性误差——比如INL、参考电压漂移、固定频率干扰——没有太大作用。如果一个1kHz的干扰信号完整包含在采样带宽里,单纯平均很难完全消掉,需要配合频谱搬移或抖动技术。

所以我的建议是:先用硬件把底噪和失真压到合理范围,再用过采样把有效位补上来。顺序反了,软件工作量会成倍增加,效果还不理想。

有一种情况过采样确实很有效:ADC自身白噪声占主导,且没有明显的固定频率干扰,这时把采样率提高4倍再取平均,ENOB基本可以提升1位。但如果噪声里有大量50Hz工频及其谐波,平均窗口不是整周期的话,反而可能让误差更大。工程上我喜欢先采一段长数据做FFT,看看噪声频谱结构,再决定用哪种滤波或过采样策略。

5. SAR ADC家族怎么选型:从HX717到MCU内置ADC

最后一个实操问题:真的需要外置SAR ADC吗?怎么挑?这个问题没有标准答案,但有几个判断维度几乎不变。

5.1 专用高精度芯片:双通道24位ADC与称重/精密测量

HX717这类双通道24位ADC,近几年在称重和便携式精密测量上很流行。它内置了低噪声PGA、可调增益,双差分输入通道,适合应变桥、称重传感器。24位分辨率加上低漂移特性,配合内部校准逻辑,让MCU可以轻松实现高精度称重。选它的理由是外围简单、成本可控、开发快,尤其适合电子秤、工业变送器。

但不是所有精密测量都需要24位。很多时候18位、20位的SAR ADC在速度和精度上更平衡,比如单通道1MSPS级别的SAR ADC,用于振动分析、便携式采集卡就比24位Delta-Sigma更合适。这里面有个常见误区:以为分辨率越高越好。实际上,如果你的传感器信号本身只有10位信噪比,后面接24位ADC只是把噪声量化得更精细,并不会提高真实精度。系统精度由整条链路最弱的一环决定,ADC分辨率只是其中一环。

5.2 MCU内置ADC与独立SAR ADC的取舍

内置ADC的优势是BOM少、PCB简单、同步触发方便,尤其FOC场景,定时器触发内置ADC几乎是标配。缺点是供电和PCB布局已经固定,模拟性能上限不高;很多MCU内置12位ADC实际有效位数在10.5位到11.5位之间,做高精度称重或者高分辨率数据采集就不够了。

这时候外置SAR ADC的优势就出来了:独立电源、独立基准、独立PCB区域,可以专门优化来获得更高的SINAD和ENOB。代价是增加成本和面积,还要处理模拟前端驱动。选型逻辑很简单:需求目标是几位的有效分辨率,采样率是多少,通道数多少,能否接受外部基准和驱动。如果目标是11位有效位,MCU内置就够;目标是16位以上,老老实实上外部SAR ADC。

还有一个实际考虑是开发效率。MCU内置ADC省事,但调试PGA、基准、外部驱动一样不少;外置SAR ADC看起来多一个芯片,但很多是完整信号链方案,反而可以更快出原型。我一般建议板上预留两种位置:先用MCU内置ADC跑通功能,如果精度不够,再切换独立SAR ADC方案验证。

5.3 常见SAR ADC产品形态与参数对比

常见的SAR ADC大多通过SPI输出,有单通道、多通道、单端、差分输入之分。下面这几类形态可以帮助定位:

类型典型分辨率采样率典型应用场景
普通精密SAR16位100kSPS-1MSPS工业采集、传感器测量
高速高精度SAR18位/20位1MSPS以上振动分析、频谱测量
超精密低功耗SAR24位数十kSPS-1.5MSPS称重、精密仪器、电池供电设备
MCU内置SAR12位/16位与MCU主频相关电机控制、常规采集、FOC

选型时除了看分辨率,核心还要看SINAD、INL、参考电压灵敏度、输入阻抗、采样保持时间。这几个参数直接决定你系统最后长什么样。还有一个容易被忽略的指标是输入共模范围,差分输入SAR ADC的共模电压如果不在规定范围内,线性度会明显恶化。设计前端运放时,需要先把共模点算清楚。

5.4 一个容易混淆的问题:SAR ADC与雷达SAR不是一回事

写到这里把之前的混淆再强调一次:如果你看到poSAR、SAR原始回波仿真数据、星载SAR数据,那是合成孔径雷达的资料,不要拿来当成逐次逼近ADC的参考。英文缩写相同,领域完全不同。做数据采集的搜资料时就写Successive Approximation Register ADC或者SAR ADC no drama,能少走很多弯路。

我自己这几年做高精度采集,最大的体会是:先用示波器和FFT把板卡底噪摸清楚,再谈算法和校准。很多精度问题,最后都出在物理层面的布局和电源上,而不是ADC本身。希望这套经验对正在做SAR ADC相关项目的朋友有点帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询