高速ADC设计攻克高位数高采样率难题:时钟与前端是关键
2026/9/13 15:21:51 网站建设 项目流程

1. 为什么125MSPS与16bit的组合是ADC设计里的“硬骨头”

拿到“125M sps,16bit ADC模块设计”这个需求,我第一反应不是高兴,而是警觉。单看125MSPS采样率,市面上大量SAR和流水线芯片都能做到;单看16bit分辨率,Sigma-Delta架构能轻松拿下。但这两个参数放在一起,就成了另一个维度的挑战——125MSPS下还要保住16bit的有效位数,SNR和SFDR的指标线一下就拉到了非常苛刻的区间。

先算一笔账,大家就明白难点在哪了。16bit的理论SNR是: SNR = 6.02 × N + 1.76 = 6.02 × 16 + 1.76 ≈ 98.08dB

这个值是纯量化噪声极限,实际工程里要想让ENOB(有效位数)接近15bit以上,系统里所有噪声源的总贡献必须压在-100dBFS以下。这还不是最要命的,更要命的是采样时钟的抖动。对于输入信号频率fin,时钟抖动tjitter造成的SNR劣化满足: SNR_clk = 20 × log10(1 / (2π × fin × tjitter))

代入几个典型输入频率算一下就知道了。如果输入信号是10MHz,想要让时钟抖动不成为限制因素、保持98dB的SNR,那么: tjitter = 1 / (2π × 1e7 × 10^(98/20)) ≈ 0.1ps

这是个什么概念?普通晶振的输出抖动通常在1ps到几ps量级,随便用一个LVCMOS晶振直接驱动高速ADC,SNR可能直接掉到80dB以下,16bit的ADC最后实测连12bit都保不住。所以这个标题背后,真正的设计重点根本不在那颗ADC芯片本身,而在时钟、电源、前端驱动、PCB布局这些“外围”工作。本文就把整个模块的设计主线完整捋一遍,从架构选型讲到校准验证,全是能直接落地的思路。

适合看这篇文章的,是在做高速数据采集、软件无线电、医疗超声、激光雷达等领域的硬件工程师。如果你正准备在项目里用一颗16bit的高速ADC,或者已经在调试但实测指标始终上不去,这篇文章能把坑提前给你标出来。

2. 架构选型:SAR、流水线还是折叠内插?

高速高精度ADC的架构选择,这步是决定整个设计路线的大前提。很多第一次做高速ADC的朋友上来就看分辨率,看采样率,忽略了架构差异带来的应用体验和调试难度完全不同。

2.1 三种主流架构的取舍逻辑

SAR架构,也就是逐次逼近型,内部只有一个比较器一套DAC,靠二分查找逐位逼近输入电压。优点是没有流水线延迟,功耗较低,中低频段的线性度做得相当好。SAR真能跑到125MSPS以上的也有,TI的ADS4225这种流水线先放一边,SAR跑到125M的产品确实不算多,而且位数一般集中在12到14bit。SAR在高分辨率下的问题是电容阵列规模大,高速比较器功耗会迅速上涨。

流水线架构的原理是把量化过程分成多级,每一级完成一部分位的量化并输出残差给下一级。每一级只需处理前一级的余量,所以每一级的比较器精度要求并不高,整体可以做到高速和高分辨率兼得。16bit 125MSPS这个点,流水线是绝对主流,TI、ADI的大量高速采集芯片都采用这个架构。代价是存在流水线延迟,对多片同步或需要“零延迟”的控制场景不友好。另外,流水线架构对时钟质量和PCB布局更挑剔,因为级间残差放大器的建立时间直接和转换精度挂钩。

折叠内插型架构在FPGA、示波器前端这样的超高速场合更常见,用折叠电路把输入信号映射到多个平行比较器,减少比较器数量并利用内插减少前端放大器数量。它在Gsps级别的ADC中出镜率高,但在这个量级的位数和速度下,实在谈不上是主流选择。我在选型时直接跳过折叠内插,主要是看中后期调试成本和设计风险。

2.2 具体器件选型时关注的参数

在这个规格点上,我建议优先看ADI的AD9653、AD9637这类16bit 125MSPS流水线ADC,或者TI的ADS4225(虽然是12bit的,但要上16bit就得往ADS5263、ADS54J60这类高端系列看)。真正的重点是几个容易被忽略的隐藏参数:

第一,模拟输入带宽(Full Power Bandwidth, FPBW)。125MSPS采样率对应奈奎斯特带宽是62.5MHz,但实际信号可能远高于此,比如中频采样场景下信号频率能到100MHz、200MHz。这时候如果ADC的模拟输入带宽不够,信号幅度在进入量化器之前就已经衰减了,前端再干净也没意义。

第二,DNL和INL数据,也就是微分非线性和积分非线性。这两个参数直接影响无杂散动态范围,尤其在多音信号或高次谐波占主导的场景里,INL曲线不平滑会导致谐波分量抬头,SFDR一掉,接收机的抗阻塞能力就崩了。选型时不仅要看典型值,还要看全温范围内的最大值,很多芯片在25度时写得漂亮,温度一拉偏,ENOB直接掉1到2位。

第三,功耗和散热。125MSPS 16bit的流水线ADC,功耗通常在几百毫瓦量级。模块如果做在密闭机箱里,热噪声会通过基准漂移和输入级失调来影响性能。选型时就要把散热路径想清楚,PCB上对应位置得有足够的散热铜皮和过孔阵列。

3. 时钟树与模拟前端:SNR指标八成都折在这里

模块设计走到原理图阶段,最容易“看起来没问题”但实测翻车的就是两个部分:采样时钟和模拟前端。我把这两个放在一起讲,因为它们在噪声预算里是互相耦合的。

3.1 时钟抖动预算与分配

回到第一部分的公式,125MSPS采样率下,如果输入信号频率做到10MHz,想保住16bit的性能,时钟抖动需要控制在0.1ps左右。这个数字非常严苛,普通晶振根本做不到,必须用专用的低抖动时钟缓冲器或锁相环。工程上常用的方案有两类:

一类是全数字方案,用FPGA内部的MMCM/PLL给ADC提供采样时钟。另一类是独立时钟芯片方案,比如TI的LMK61E2(低抖动可编程振荡器)、LMK04828(双环路去抖时钟芯片)。我在这个模块里选了LMK61E2直接输出LVDS时钟给ADC,实测抖动大约0.2ps,对10MHz频段的信号来说,SNR劣化不到0.3dB,可以接受。

如果是更高频的应用,比如中频采样100MHz以上,0.2ps的抖动也会吃掉1到2dB的SNR。这时候就得考虑LMK04828这类带片上环路滤波的去抖时钟,配合外部VCXO,把抖动压到50fs量级。代价是调试复杂度上了一个台阶,寄存器配置、环路带宽的选择都会影响最终效果。我的经验是:别一上来就上高端去抖芯片,先用可编程振荡器把方案跑通,确认整链路瓶颈在别处之后再评估是否值得加去抖。

时钟信号的PCB布线也极其关键。LVDS差分对的等长误差控制在正负5mil以内,阻抗按100欧差分控制,走线尽量远离数字信号和电源层边缘。另外,ADC的采样时钟输入有一个内部偏置电压,芯片手册通常会要求在时钟输入引脚加交流耦合电容,这个电容不是随便选的,我喜欢在这里用0.1uF的NP0或X7R,然后根据时钟输入幅度确认摆幅是否满足数据手册要求。

3.2 前端RC滤波与驱动放大器设计

ADC的模拟输入端不是高阻理想输入,它有一个采样电容,每次采样都会有一个充电瞬态电流。这个瞬态电流流过外部电阻,会引入额外误差。这里有一个计算公式值得记录:外部串联电阻R_s与采样电容C_s形成的时间常数,决定了信号建立精度。对于16bit,建立误差要小于1/2 LSB,而1/2 LSB相对满量程的比例是: 1 / (2 × 2^16) ≈ 7.6e-6

如果采样时间是Ts,那么需要满足: Ts > (N + 0.5) × ln2 × R_s × C_s ≈ 11.5 × R_s × C_s

125MSPS采样率下,如果占空比50%,采样时间约4ns。代入16bit 16bit N=16计算出,R_s × C_s必须小于0.35ns。很多器件数据手册会给出推荐前端RC值,典型取值是10欧姆串联电阻配10pF对地电容,再加上芯片内部已有的采样电容。这个RC一方面起到抗混叠滤波作用,另一方面缓冲采样瞬态。但是要注意,电容选太大也不行,它会和驱动运放形成新的极点,导致信号通路带宽不足,而且运放需要的驱动电流也会变大。

前端驱动运放的选型是另一个老坑。16bit 125MSPS下,运放的THD指标和输入驱动能力必须同时达标。普通的高速运放,新号带宽够但是失真大,在满摆幅输入下谐波分量飙高,会把ADC的SFDR拖垮。专门的ADC驱动放大器,例如TI的LMH6554、THS4509这类全差分放大器,才适合干这个活。全差分结构的好处是输出共模可以灵活调整,正好和ADC输入共模匹配,省的用电阻分压网络去硬拉共模电压。

3.3 ∑-Δ前端RC的对比参考

聊到RC滤波,顺便提一下∑-Δ ADC的前端设计思路。很多人看到“ADC前端RC滤波”就以为给芯片输入端加个电容就完事,其实∑-Δ和SAR/流水线的RC设计逻辑完全不一样。∑-Δ ADC过采样率高,采样电容小而开关频率高,对外部驱动放大器建立时间的要求相对宽松,但对外部RC参数更敏感,RC太大会在带内形成信号衰减,太小又无法抑制高频开关噪声。所以这类前端通常用较小的串联电阻加较大的旁路电容,并且需要对地参考一个干净的模拟地平面。这些细节不展开,但希望大家明白:同一句话“前端RC滤波”,在不同架构下含义天差地别,拿SAR的经验去套∑-Δ,往往把指标做坏。

4. 电源与基准:看不见的噪声比想象中更可怕

高速ADC的电源抑制能力有限,尤其在高频段,电源上的纹波会直接耦合到参考电压或输入级,变成输出数据的杂散。这个阶段犯的错在时域波形里看不清晰,但一测动态参数,SFDR上的某个毛刺就冒出来了。

4.1 模拟电源的噪声预算

16bit ADC的LSB电压,按满量程2Vpp计算: LSB = 2 / 2^16 ≈ 30.5uV

这意味着电源纹波哪怕只有几十微伏,都会在输出码值中体现出来。普通DC-DC的纹波通常在10mV量级,必须经过LDO和滤波网络二次处理。LDO选型要关注两个参数:输出噪声密度和电源抑制比(PSRR)。TI的TPS7A4701、ADI的LT3045这类超低噪声LDO,输出噪声在10Hz到100kHz积分后只有几微伏,是高速ADC电源的标配。

LDO的输出端还要加足够的去耦电容,但是注意电容类型和位置。我一般用1uF的X7R并联10nF的NP0,紧贴ADS5263这类芯片的供电引脚,再串联一个磁珠或小阻值电阻,把LDO输出和ADC电源引脚之间做二级滤波。磁珠选交流阻抗在100MHz时约100到600欧的型号,直流电阻尽量小,避免吃压降。

4.2 基准电压源的设计细节

ADC的参考电压是整个转换精度的地基。芯片内部的基准往往噪声很大,所以16bit高速ADC通常允许外部输入高精度基准。外部基准源输出的任何波动都会直接叠加到输入信号上。这里有个容易踩的坑:基准输出电压的宽频噪声和温漂同样重要,例如ADR445、ADR435这类基准,噪声低至1.8uVpp,温漂系数能做到几个ppm/°C。但光有基准芯片还不够,基准输出到ADC参考输入引脚之间的走线必须用模拟地包住,走线要短而宽,参考输入引脚上的去耦电容按数据手册推荐值放置,通常是0.1uF和10uF搭配。

4.3 接地策略:单点接地还是分割地?

关于ADC的模拟地和数字地,我在这个项目里最终选择的是统一地平面加分区布置。把PCB板卡上模拟器件和数字器件分别摆在不同的区域,各区域的地都直接连到同一层完整的铺铜上,不在中间开槽断开。这是现代高速数据转换器布线的通行做法,因为任何开槽都意味着回流路径被拉长,容易形成辐射环路。数字信号如果必须穿过模拟区域,请一定让走线下方的地平面保持完整,并确保信号线自己有一条紧邻的回流路径,否则高频回流电流窜到模拟部分,再多的滤波电容都救不回来。

5. PCB布局三大要点:把“参考设计”变成“自己的板卡”

同样的原理图,画的PCB不同,实测指标能差出一大截。高速ADC模块的PCB设计,布局的核心目标就一句话:让信号和时钟的物理路径最短,让电源和地的回流路径最干净。下面三个点是我总结出来最值得反复检查的。

5.1 阻抗控制与差分走线

ADC的模拟输入通常是差分信号,LVDS时钟和数字输出也是差分信号。PCB的差分阻抗要严格按100欧控制。计算阻抗时,介质厚度和铜厚的实际值会和PCB厂商标称值有偏差,所以发板前一定要让板厂提供叠层参数,自己用仿真工具复核一遍。差分对内等长也是硬指标,125MSPS的LVDS数据信号边沿可以做到几百皮秒以内,等长差超过10mil就会引入时序问题。

5.2 地过孔与去耦电容的摆放

ADC芯片底部散热焊盘和接地焊盘处,要打足够多的过孔,不仅为了散热,更是为了降低接地回路电感。这些过孔被打在焊盘正下方。去耦电容的位置,理论上是越靠近电源引脚越有效,但实际操作时,电容要放在芯片的同一面且紧挨供电引脚,过孔从电容焊盘直接落到地平面,不要绕路。电源通路应该遵循:LDO输出 → 磁珠 → 去耦电容阵列 → 芯片电源引脚,路径上的任何支路都从主干上引出,而不是串串。

5.3 版图上避开“隐形振铃”

这个点是我吃过大亏才记下来的:时钟走线在扇出后有一段垂直参考平面的过度区域,比如从差分过孔换层到另一面,如果没有伴随地过孔,阻抗会突变,引起振铃。对125MSPS系统来说,这个振铃在时域上看可能只是一点点过冲,但反映到SNR上就是几个dB的损失。解决方法是差分对换层处,在换层区域两侧各加一个地过孔,给回流电流提供低阻抗路径。还有一个容易被忽略的:不要为了“整齐”,把时钟走线拉成90度直角或45度锐角,能用45度钝角或圆弧就走圆弧,减少不必要的寄生电容不均。

6. 数字接口与数据通路:采到的数据别死在传输上

ADC模拟前端做得再完美,数据搬运出问题,整个系统照样是废的。125MSPS 16bit意味着原始数据率是: 125 × 16 = 2Gbps

如果用单端CMOS并行输出,这个速率不仅引脚多,而且对EMC极其不利;高速ADC现在主流输出是DDR LVDS,数据位宽通常是2的倍数。比如ADS5263是16bit DDR LVDS输出,在125MSPS采样率下DDR时钟频率是125MHz,数据总速率就是2Gbps。

6.1 LVDS数据与时钟的对齐

DDR LVDS接口的调试要点就一个字:对齐。ADC会输出一个DCLK(数据时钟)和FCLK(帧时钟),FPGA用DCLK的上下沿去采样16bit数据,FCLK用来区分一个采样点的两个半字节。很多项目调不通,问题都出在PCB走线等长或FPGA的IODELAY没调准上。我的建议是,FPGA里给每个bit lane都加上IODELAY,通过训练函数动态调整delay值,找到每个bit的最佳采样窗口。不要指望“等长做了就一定能采到”,不同lane间的skew往往超出预期。具体方法是发斜坡测试信号,FPGA收到数据后检查码值是否严格递增;如果某一位跳变错误,说明对应lane的delay偏了。

6.2 数据缓存与DMA的坑

在实际嵌入式系统里,ADC数据终归要落进DMA或FIFO。这里要特别提醒一个STM32/GD32等MCU做高速ADC采集时的常见问题:DMA“数据紊乱”。GD32E230这类MCU的ADC配置DMA时,如果开启扫描模式且通道数较多,而DMA配置的传输总长度和ADC的转换通道数不匹配,会出现数据错位。比如四通道用DMA搬运,DMA传输数量设成单个通道的长度而不是四个通道的总长度,就会导致每轮数据里只有第一个通道是准的,后面通道的数据全乱了。这属于配置参数不匹配,不是芯片坏了。另外,DMA搬运16bit数据时,目标缓冲区地址必须对齐,否则部分内核会触发总线错误或性能骤降。

STM32如果使用三重ADC模式,三个ADC轮流或同步采样后会有专门的通用规则数据寄存器ADC_CDR。读这个寄存器的时机很关键:如果程序在ADC还没转换完就去读,读到的可能是旧数据。正确做法是等DMA传输完成中断或等状态标志位置位后,再一次性读出所有通道数据,不要边转换边读,否则在高速采样时很容易读到尚未更新完的半个结果。

6.3 采样时刻点与PWM联动

在电机控制或电源控制场景里,经常需要让采样的时刻和PWM的开关点严格对齐,否则电流采样会采到开关噪声。STM32的高级定时器有很多人把中心对齐模式和触发ADC的功能配置到一起:中心对齐模式下,定时器计数器在向上计数和向下计数两个方向都产生更新事件,可以让ADC在PWM载波的中心点或边沿点采样。采样的关键是设置好TIM的触发输出(TRGO)和ADC的触发源、采样周期参数,让ADC的采样时序落在PWM开关瞬态之前或之后的稳定区间,避免电感和MOS管的dv/dt噪声进入采样窗口。这块的时序冲突很难在仿真中发现,建议直接在示波器上同时观测PWM输出和ADC的采样触发信号,肉眼确认触发沿的相对位置。

7. 校准、滤波与动态指标验证:样机性能不等于整机性能

ADC模块设计不是原理图评审过了就万事大吉,真正体现水平的都在调试和验证阶段。高速高精度ADC在实验室测出来的性能,和装进整机后的实际表现之间,隔着温度漂移、通道串扰和基准源长期稳定性的多重差距。这一节说说怎么把这些差距补回来。

7.1 三点校准与通用校准思路

因外部ADC增益误差和失调误差的存在,即使设计完全正确,直接读到的码值也未必是“真值”。最简单的单点校准只能修真失调误差,更进一步的两点校准可以修正增益和失调,但如果ADC的INL曲线上有明显的非线性区,两点校准就无能为力了。工程上比较实用的是“三点校准”:选取零点和两个非线性区附近的标准电压(比如满量程的25%和75%),对这三个点分别代入线性拟合公式,求出分段校正系数。具体实现时,用精密电压源产生多个标准电压,记录ADC输出码值,再用最小二乘法拟合出电压-码值直线或分段直线。16bit系统不建议只用一个截距和斜率做全量程校正,因为高速ADC在大信号输入时的INL往往比小信号时差,分两段或三段校正效果更明显。

还有一种被忽略的校准方向——ADC的数据漂移问题。16bit系统里,温度和电源电压缓慢变化会带来码值漂移。漂移来源可能是基准源温漂,也可能是采样电容的介质吸收效应。这种漂移无法通过前置电路完全消除,只能在软件里加补偿。建议定期(例如上电自检时)采集内部校准源或固定的基准电压,动态修正当前工作点的偏差。这在BMC读取电压的应用里尤其常见:BMC通过ADC采样系统电压,如果只做单次校准,整个生命周期内的温漂累积误差会相当明显,必须配合周期自校准流程。

7.2 C语言实现滑动平均滤波

实际采集的数据,高频噪声无法完全靠硬件滤除。对16bit ADC输出做软件滤波,我的首选不是简单的N点平均,因为它对尖峰脉冲毫无抵抗力,而是滑动中值加滑动的组合:先做3点或5点中值滤波剔除粗大误差,再做滑动平均平滑高频噪声。下面给出一个可直接用的16bit滑动平均滤波C代码:

#define ADC_FILTER_N 16 uint32_t adc_filter_buf[ADC_FILTER_N] = {0}; uint32_t adc_filter_sum = 0; uint8_t adc_filter_idx = 0; uint16_t adc_filter(uint16_t new_value) { adc_filter_sum -= adc_filter_buf[adc_filter_idx]; adc_filter_buf[adc_filter_idx] = new_value; adc_filter_sum += new_value; adc_filter_idx = (adc_filter_idx + 1) & (ADC_FILTER_N - 1); return (uint16_t)(adc_filter_sum >> 4); }

注意点:ADC_FILTER_N必须是2的幂,这样求模和除法的位运算才成立;累加器adc_filter_sum要定义成uint32_t,否则16bit数据累加16次,最大值接近65536 × 16 = 1,048,576,16bit的uint16_t直接溢出。这段代码看起来简单,但如果直接在中断服务函数里调用,务必注意芯片的位操作效率,STM32的32位除法指令虽然不慢,但用移位代替除法是嵌入式开发的低保操作。

7.3 动态参数测试与ENOB验证

最后,整个模块设计是否达标,唯一的裁判是实测动态参数。不要在缺少频谱仪和信号源的情况下拍脑袋说“性能很好”。我的测试步骤是:

  1. 用低相噪信号源产生10MHz或20MHz单音正弦波,幅度调至满量程的-1dBFS。
  2. 信号经过带通滤波器后输入ADC模块,滤除信号源本身的谐波分量。
  3. 采集至少128K个采样点,送入PC端用Hamming窗或Blackman-Harris窗做FFT。
  4. 对数坐标下观察频谱,SNR是信号功率与除直流和谐波外所有噪声功率之比,SFDR是信号功率与最大杂散分量功率之差,ENOB = (SNR - 1.76) / 6.02。

125MSPS 16bit模块,比较理想的测试结果是:中频10MHz时SNR在82到85dB,SFDR在95dB以上,对应的ENOB大约在13.5到14bit。注意,这是“实用动态有效位”,不是数据手册的分辨率。有些人拿静态INL和DNL就号称“16bit”,那只是线性度好,动态范围完全不是一回事。如果你测试出来的SFDR在某个频率点出现一条斜率极陡的毛刺,十有八九是时钟或电源的杂散分量耦合进模拟通路了,回头检查这两个部分的滤波和布局,比继续调软件有效得多。

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

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

立即咨询