
在嵌入式里选ADC我经常跟身边的人说一句话指标好查难点全在那些数据手册不会主动提醒你的地方。AD7680这颗16位逐次逼近型SAR模数转换器就是很典型的例子。它来自ADI速度和功耗都控制得不错适合做电池供电的便携仪器、电压电流监测、传感器采集这类对精度有要求但又不想把整套模拟链路搞得太复杂的场景。这篇文章我会把SAR ADC的逐次逼近原理、AD7680的关键参数怎么理解、硬件上电源和PCB布局要注意什么、SPI驱动时序怎么配合再到软件校准和滤波的落地方法按实际做项目的顺序一次讲清楚。看完之后你可以直接拿它来评估自己的设计是否合适。1. 逐次逼近的原理AD7680是怎么测出16位精度的1.1 从一次天平称重说起逐次逼近寄存器型ADC英文叫Successive Approximation Register ADC常简称为SAR ADC。要理解它的工作方式最直观的办法是用天平称重来类比。你想称一袋米手上有一套标准砝码128克、64克、32克、16克、8克、4克、2克、1克。称量过程是先放128克砝码如果比米重就把它拿掉如果是米更重就保留。接着放64克砝码同样比较重则拿掉轻则保留。这样一轮一轮下来八个砝码每枚都尝试一遍最终所有被保留砝码的重量之和就是米的重量。SAR ADC做的事情完全一样只不过它用的“砝码”是一组二进制权重这些权重由内部的电容阵列和DAC产生。如果ADC是16位的它就有16个二进制权重从最大位MSB到最小位LSB依次试探。整个过程分两个阶段采样阶段先让采样电容跟踪输入电压转换阶段再由比较器配合DAC逐位逼近。每一轮都只有一个比较动作结果非0即1所以SAR ADC的转换周期很短而且权力分明一次转换结束输出就是这一时刻的真实电压数字码不存在跨周期的累积效应。1.2 电荷再分配型SAR的内部工作过程如果拆开AD7680这类电容型SAR ADC的内部模型它大致由四部分组成采样保持电路、比较器、SAR逻辑寄存器、以及一个电荷再分配型电容DAC。在采样阶段开关会接通输入信号让内部一排电容充电电容上的电荷大小正比于输入电压。接下来开关断开输入被“冻结”在这个电容阵列上。转换开始后SAR逻辑先把最高位置1控制电容DAC输出一个相当于一半满量程的电压跟输入信号在比较器里比一下。如果输入大于这个试探电压最高位就保留1反之这一位清零。接着再置下一位继续比较。这个过程进行16次内部一个16位的数字码就一点一点“逼近”了真实输入。因为这样的结构天然不需要时钟去等待一串数据的建立所以每次转换得到的都是独立结果俗称“无流水线延迟”。这就带来一个很实用的好处如果你是做多通道扫描采集可以一路采样、一路转换、一路读结果不需要像某些ADC那样等现象稳定。AD7680对单点采样、快速切换通道这类使用方式非常友好这也是它在一些测试测量前端里频繁出现的原因。1.3 AD7680在整个SAR家族中的定位ADR家有很多SAR ADCAD7680属于里面比较有代表性的一颗入门级精密器件。很多工程师会拿它做高精度电池电压监测、便携数据记录仪或者工业传感器采集。它的典型特征是单通道、16位、最高100kSPS左右吞吐率接口是完全兼容SPI的串行接口封装很小QFN或MSOP规格都有板子上不太占地方。我个人的感受是AD7680并不是那种“装上去就能出奇迹”的芯片它的好结果完全依赖你对电源、参考电压和输入驱动的理解。如果你之前只用过MCU内置的12位ADC第一次切换到这颗芯片时反而可能会觉得“怎么这么多讲究”。但只要把这几块理顺了它稳定工作起来的上限是内置ADC很难比得上的。把普通ADC和精密ADC之间的这道门槛迈过去AD7680是个很好的练手对象。2. AD7680的核心亮点参数背后的价值判断2.1 16位分辨率与量化噪声阈值先看一个基本概念。理想N位ADC的理论信噪比SNR等于6.02N1.76dB。按这个公式16位ADC的理论SNR约为98dB而12位内置ADC的理论SNR只有74dB左右。看起来只差了4位换算成动态范围差不多是24dB也就是电压分辨能力差了16倍。量化噪声的均方根有效值可以表达为LSB除以根号12而LSB等于满量程除以2的N次方。拿3.3V参考电压举个例子16位ADC的LSB是3.3/65536大约50μV。这意味着如果你想把测量误差控制在1mV以内整个模拟链路里任何一个环节的噪声都不能超过几十微伏的量级。这个数字放在12位ADC上完全不是事放在16位ADC上就成了硬指标。我在这里想强调一点选16位ADC不是因为“位数大听起来厉害”而是因为你的测量需求真正到了毫伏甚至微伏级别。判断方法很简单——你先算算自己系统里最关心的最小信号变化是多少再把这个值除以满量程看需要几位才能分辨出来。算完之后该用12位还是16位自然就清楚了。2.2 100kSPS吞吐率与采样建立时间AD7680的吞吐率达到100kSPS级别也就是说每秒钟能完成十万次转换。对很多传感器采集场景来说这个速度已经非常宽裕。不过这里我要提醒一个容易被忽略的概念采样周期不等于转换时间。SAR ADC在每一次真正转换之前都有一个采样时间这个时间内采样电容要完成对输入信号的“充电”。如果输入信号源的输出阻抗很高或者前端RC滤波器的电阻选得过大采样电容在采样窗口内可能还没来得及建立到足够精度芯片就开始做逐次逼近了。这种情况下读到的数据即使ADC本身是好芯片也会出现不可预测的偏差。一个工程上的经验是信号源阻抗尽量控制在几百欧到一两千欧以内如果信号源内阻高最好在ADC前面加一级运放缓冲或者使用大一点的采样电容搭配合理RC。很多初次接触SAR ADC的工程师拿到AD7680测不准数据第一反应是怀疑芯片坏了最后查来查去发现是输入驱动没做好。2.3 低压低功耗2.3V到5.5V的适用性支持2.3V到5.5V的宽供电范围这是AD7680一个很大的实用亮点。现在大量嵌入式系统主电源是3.3V也有不少电池供电设备工作电压在2.5V到4.2V之间这颗芯片可以直接挂在这些电源轨上使用省掉了额外生成基准电压的麻烦。功耗方面AD7680的典型功耗在毫瓦级别甚至更低。在100kSPS满速跑的时候耗电也不大如果采用间歇采样或者待机模式功耗还能进一步压下去。这一点特别适合便携式仪表和电池驱动的数据记录仪长时间挂机采集的时候功耗优势会直接体现在续航里。还有一个容易被忽略的点是AD7680内部带有自己的转换时钟外部主控只需要提供SPI读取用的SCLK时钟。转换过程本身不依赖SCLK来计时这样SCLK上的时钟抖动不会直接影响转换精度对布线和使用要求都宽松了一些。2.4 参考电压复用省出来的BOM与引入的挑战AD7680有个特别有意思的设计它的输入范围直接做到0到VDD基准电压的参考源也取自VDD。也就是说这颗芯片并没有单独的参考电压引脚电源电压同时充当了参考电压。这样设计最大的好处是省掉了一颗独立基准源芯片和相关去耦电路BOM成本降低了电路结构也简单了很多。当然任何简化都是有代价的。参考电压等于电源电压就意味着电源上的任何纹波都会以参考电压的形式直接进入转换结果。如果你用的是DC-DC供电开关频率附近如果有几十毫伏的纹波16位精度很容易被打回原形。实际设计中我通常会在VDD前面加一级低噪声LDO或者至少用合适的磁珠配合大电容把DC-DC的高频毛刺隔离掉再给AD7680供电。3. 硬件设计从电源去耦到PCB布局的关键细节3.1 电源与参考电压的去耦方案对于AD7680来说VDD既是电源也是参考源去耦设计属于重中之重的环节。常规做法是先在VDD引脚附近放一个10μF左右的钽电容或陶瓷电容稳住低频能量再用一个0.1μF的低ESR陶瓷电容紧贴芯片电源引脚解决高频阻抗。陶瓷电容建议选X7R或C0G材质容值受温度和电压影响小不容易出现“标称10μF实际只有几μF”的尴尬情况。如果系统里同时存在数字电路和模拟电路我强烈建议把AD7680的电源单独从主电源轨分出来中间串一个磁珠或者用一个低噪声LDO供电。这样开关电源的高频噪声会被磁珠吸收一部分LDO再对低频纹波做一次抑制。AD7680这种电源即基准的芯片你给它喂多干净的电它就能回你多干净的数据。还有一个小技巧是如果你测得的数据低位总是跳动优先改造电源而不是盲目加大软件滤波。软件滤波治标不治本电源脏这个根子不解决加大滤波窗口只会让系统响应变慢但底噪还是在。我踩过很多次这样的坑最后都是回头处理供电才真正解决问题。3.2 规避时钟抖动与电源噪声的三个PCB布局要点这部分我直接给出三个经过多次验证的PCB布局要点照做能省掉很多后期调试时间。第一模拟地与数字地单点连接。AD7680的AGND和DGND引脚要分别走线到“同一个”地平面汇合点而不是让数字电流绕一大圈从模拟区域回流。一个实用的做法是在ADC芯片下方开一个干净的地岛所有模拟地线上到地岛然后通过一个狭窄的通道和数字地连接相当于只留一个汇流点这样数字开关噪声就不会在整个地平面到处乱窜。第二SPI信号线一定要和模拟输入、参考走线拉开距离。SCLK边沿很陡上升下降过程中会产生很强的容性耦合如果SCLK长时间贴着输入信号线平行走线几毫米的长度就能把毛刺耦合到模拟端。实在无法避开的时候可以在SCLK和模拟线之间铺一条接地铜皮做隔离。第三去耦电容和RC滤波电容的回路面积要尽量小。每个电容的地端应该就近打过孔到地平面不要绕远路。回路面积小则环路天线效应弱外部电磁干扰不容易被收进来反之即使电源本身干净回路面积大了也照样能把噪声采进来。我见过一些板子明明电源滤波做得很好最后因为电容摆放太远高频干扰把16位精度直接拉垮改成贴近引脚后立刻恢复正常。3.3 输入驱动电路与RC滤波取值AD7680的输入属于典型的SAR型输入结构采样瞬间会产生一个瞬态反冲然后靠RC网络里的电容把电压稳定住。通常设计是在ADC输入端前面加一个RC低通滤波器再接一颗运放做缓冲。RC滤波的取值要在噪声抑制和信号建立之间找平衡。R选得太大会拉长建立时间特别是在采样窗口比较短的场景下容易出问题R选得太小过滤高频噪声的能力又会变弱。实际项目中常见的组合是R取几十欧到几百欧C取1nF到10nF然后在具体采样率下根据数据手册推荐的驱动电路去仿真验证。如果信号本身是电池电压这样变化很慢的信号R和C可以稍微取大一点因为对带宽的要求不高。运放的作用不能省。用轨到轨输出、单位增益稳定的运放做电压跟随器把传感器或前级电路的输出阻抗降下来然后再驱动ADC输入端这样ADC的采样反冲由运放来承担信号源本身不会被干扰。带隙基准、热电偶这类高阻信号源如果直接接到AD7680上基本不可能得到稳定的16位数据。3.4 多通道复用时要注意的串扰问题如果AD7680前面接了模拟开关或者多路复用器比如用一片8选1模拟开关来轮流采集8路电压就要特别注意通道间的串扰。SAR ADC采样瞬间会有反冲电流从这个通道的采样电容反向流向信号源如果各路共用一个前端很容易把这个反冲串到相邻通道上导致测量结果互相污染。解决办法有两个方向。一是每个通道都部署独立的RC滤波网络让反冲电流先被本通道的电容吸收不至于到处乱跑二是软件上在切换通道之后特意丢弃第一次或前两次转换结果等前端稳定后再读取有效值。这两招配合使用多通道采样的首点毛刺基本能解决。对BMC或者电源监控这类需要轮询多路电压的系统这个经验尤其有价值。4. 软件驱动SPI时序、校准与滤波的落地实现4.1 读懂AD7680的SPI读取时序AD7680的串行接口和教科书版的SPI不完全一样。它不需要复杂的寄存器配置每次转换就是把CS拉低然后用SCLK把数据从SDO引脚一位一位读出来。问题是具体的数据位排列、CS拉低的时机、SCLK是上升沿采样还是下降沿采样、一次完整转换需要几个时钟周期这些都藏在数据手册的时序图里。我吃过一次亏第一版固件按普通SPI模式读写结果读回来的数据总是不对。后来用示波器抓了CS、SCLK和SDO三根线发现我的片选时机提前了整整一个时钟周期。所以拿到这颗芯片第一件事建议先写一个最简单的循环读取代码每次CS拉低、读16位、CS拉高把数据打印出来再和输入电压比一比。用MCU的硬件SPI外设去对接时需要根据手册帧格式选模式。如果帧格式特殊硬件SPI不好配合用GPIO模拟时序可能更省心。100kSPS的吞吐率下GPIO模拟SPI的速度完全够用而且时序可控性更强调试起来也比较直观。4.2 采样周期、转换周期和BUSY的正确处理SAR ADC启动一次转换后需要等待一个固定的转换时间之后才能安全地读取结果。AD7680没有独立的EOC引脚但有一个机制在转换进行期间SDO会维持一个忙状态电平等转换完成后才返回可以正常读数的状态。更准确的说法要看手册里具体的帧格式不同CS工作模式下表现会有差异但一个共同点是你必须在正确的时隙里给SCLK读到的数据才有效。软件上最容易犯的错是刚拉低CS就去读芯片还没转换完SDO上根本没有有效数据读回来的只是乱码或者上一位的残留。实际工程经验是在输出SCLK之前先预留足够的延时或者通过查询SDO状态来判断转换是否结束。Stm32这类MCU上用硬件SPI时如果DMA访问总线太急也可能在转换还没完成时就把数据采走了所以用DMA读AD7680时要对DMA启动时机和CS时序做仔细规划。4.3 用三点校准修正系统误差任何ADC都有失调误差、增益误差外部还有电阻分压误差和参考电压偏差。两点校准可以修正一条直线但它假设ADC和前端电路是完全线性的现实里并不是这样。如果你想在某个量程内榨出更好的精度我推荐用三点校准。三点校准的做法分别给ADC输入三个已知电压比如零点、满量程附近、中间某个电压把对应的ADC原始读数记下来。然后做分段线性插值把原始码映射成修正后的实际电压值。当采样值落在第一段时用第一个点和第二个点连线去计算当采样值落在第二段时用第二个点和第三个点连线去计算。这套校准方法对16位ADC很适用因为它的非线性通常比较平缓用三段折线去逼近已经能获得比较理想的效果。尤其当你通过电阻分压把高电压降到ADC量程内分压电阻本身有精度误差和温漂软件校准几乎是必须做的一道工序。需要注意的是校准只对你固定的采样链路有效改变量程电阻、参考电压或换了运放之后要重新校准。4.4 几段C语言滤波代码的实战选择AD7680输出的16位原始数据在没有任何滤波的情况下总会带一点白噪声。我之前做过一个采集板最后数据低两位一直跳后来用滑动平均把噪声压了下去。下面这段是嵌入式里最常用的滑动平均滤波代码适合有实时性要求但不希望信号滞后的场景。#define ADC_FILTER_LEN 16 static uint16_t buf[ADC_FILTER_LEN]; static uint32_t sum 0; static uint8_t idx 0; uint16_t adc_filter(uint16_t new_val) { sum - buf[idx]; sum new_val; buf[idx] new_val; idx (idx 1) % ADC_FILTER_LEN; return (uint16_t)(sum / ADC_FILTER_LEN); }注意累加变量必须是uint32_t因为16个16位数据的最大累加值接近1,048,560已经超过uint16_t的范围了。窗口长度16意味着系统响应会有一定滞后如果你需要快速响应可以把窗口缩短到8如果噪声很大可以加长到32具体在滞后和噪声之间做取舍。还有一种常用的一阶低通滤波代码更短延迟更可控。static float filtered_val 0.0f; float adc_lpf(float new_val, float alpha) { filtered_val alpha * (new_val - filtered_val); return filtered_val; }alpha一般取0.1到0.5之间。值越小滤波越强但响应越慢值越大响应越快但噪声抑制变差。实际使用的时候我习惯先把ADC原始码转成实际电压值再滤波这样alpha的含义也更直观。想再稳一点还可以先用中位滤波剔除异常毛刺再做一次滑动平均对付工业现场脉冲干扰效果很好。5. 应用场景与选型建议5.1 哪些项目更适合外扩AD7680外扩一颗AD7680最典型的理由是“内置ADC不够用但Σ-Δ又太慢太复杂”。比如便携式红外测温仪传感器输出电压需要精确放大后用16位精度采样MCU内置12位ADC的量化噪声太大Σ-Δ型的转换延迟又会让测温响应变慢这时候AD7680这种100kSPS、无延迟的SAR ADC就非常合适。再比如电源管理里的电压监控BMC通过外部ADC读取多路电压时通常需要够快的采样速度和不错的精度同时功耗还不能大。用AD7680配一个模拟开关做轮询既能保证精度又不会占太多主控资源。还有电池内阻测试、称重传感器前端、精密仪器仪表后端采集这些都是很典型的应用。如果系统的采样率只需要每秒几十次信号又是缓变类型那我可能更倾向于推荐Σ-Δ ADC而不是AD7680。选型不能只看分辨率还得看你的信号特性和实时性要求。5.2 AD7680与内置ADC、Σ-Δ ADC的对比这里把三类常见的ADC放在一张表里对比方便选型。项目AD7680这类SAR ADCMCU内置12位ADCΣ-Δ ADC分辨率16位精度明显更高12位常规够用16~24位超高精度转换方式逐次逼近一次转换即完成逐次逼近或过采样过采样数字滤波输出延迟无延迟适合多路复用较低具体看MCU实现有群延迟不适合快速切换信号功耗毫瓦级甚至更低较低相对较高外围需求需要干净电源和输入驱动集成度高但精度受限需要高性能时钟和数字滤波算法适合信号快速变化、多通道轮询常规控制和简单采集低频高精度如称重、温控做项目时我会这样选信号频率高、要多通道扫描、精度要求16位左右用SAR信号变化慢、对精度要求极苛刻、可以接受延迟用Σ-Δ只是做个阈值检测或者简单显示直接拉个MCU内置ADC就行但别指望它测微伏级信号。5.3 常见问题排查速查表做AD7680周边设计时有几个问题出现的频率特别高我整理成速查表方便你定位。现象可能的根因处理方式读回数据全是0或者满量程SPI时序不对、输入电压超出范围、CS控制错误用示波器抓CS/SCLK/SDO波形对比手册时序图检查VDD与输入电压低几位持续跳动VDD纹波大、参考噪声高、输入源阻抗过大加强VDD去耦、串磁珠或加LDO增加RC滤波必要时加运放缓冲数据随温度明显漂移参考电压温漂、分压电阻温漂、运放失调温漂使用低温度系数电阻和低温漂基准软件定时校准多通道切换后第一个点异常采样建立时间不够、通道间串扰丢弃首点数据、增加前端RC建立时间、通道间用独立RC滤波读数有周期性突变开关电源纹波耦合、数字总线噪声检查VDD纹波、重新布局SPI走线、模拟区域与数字区域隔离如果问题不在上表里最直接的排查办法是先短接ADC输入端到GND看读数是否稳定在零点附近再把输入端接到VDD看是否稳定在满量程附近。两步都正常问题大概率在前端电路两步不正常再回头查供电和时序。做AD7680这类外置SAR ADC的驱动我个人的体会是不要试图把软件滤波当成万能补丁。电源做干净、参考电压稳住、输入阻抗匹配好这三件事做好数据自然就漂亮了。好多时候我一开始怀疑软件写得不对最后发现都是硬件细节埋了雷。如果你正准备拿这颗芯片做设计建议先把供电和输入驱动想清楚再写代码这样能省下大量的调试时间。等这一套流程走顺了再去看更大分辨率的Σ-Δ ADC或者更高速度的SAR ADC你会发现整个模拟设计的方法论都是通的。