尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

多通道DAC设计实战:从R2R架构到FPGA同步与过冲消除

多通道DAC设计实战:从R2R架构到FPGA同步与过冲消除 这年头再做多通道DAC很多人第一反应都是“这不是芯片原厂都替你做完的事吗选个型号不就得了”。但真把“8通道、16位、每通道更新率不低于1Msps、通道间同步误差控制在百纳秒以内、输出方波还不能带明显振铃”这类需求一并摆到桌面上时你会发现从架构选型、电源设计、PCB布局到FPGA控制逻辑每个环节都藏着一堆坑。这篇文章整理的是我参与的“Next-Gen Premium Multichannel DAC Series”第三代原型机的完整设计与调试记录。我们最终提交的方案是FPGA作为主控搭配16位多通道R2R架构DAC核心外置高精度基准源和低噪声运放输出级实测有效位数做到15.4bit左右8通道同步误差压到20ns以内。文章不打算复读芯片手册重点放在几个特别容易翻车的环节为什么选R2R而不是Delta-Sigma方波过冲振荡到底怎么削掉多通道同步为什么靠软件写没用以及PWM DAC这种看似便宜的多通道方案为什么到不了16位精度。做仪器仪表、多声道音频、工业模拟输出卡的朋友应该都能用得上。1. 这个系列到底要解决什么问题1.1 多通道DAC的真实应用场景DAC本身是个老器件但“多通道”这三个字把它从简单的数模转换变成了系统级设计。音频领域是最典型的多通道需求。杜比全景声、Auro-3D这类沉浸式格式动辄就是7.1.4、9.1.6每一路扬声器都需要独立的DAC通道。你可以堆8颗单通道DAC也能用一片8通道DAC搞定后者的优势不只是省面积和成本更关键的是所有通道共用参考电压和时钟源通道之间的增益误差和时序漂移要小得多。再比如车载主动降噪一个系统里往往要同时处理发动机谐波、路噪、风噪多路参考信号每个麦克风采集后都要实时生成一路反相声波DAC通道不够就只能降级处理。工业控制领域同样离不开多通道模拟输出。数控机床的多轴伺服驱动、半导体测试设备里的多路偏置电压、实验室自动化里的多路阀门控制都需要在一块板卡上同时输出多路精度一致的模拟信号。这类设备通常按通道密度来定价8通道、16通道模拟输出卡是PXI/PXIe生态里的主力产品。值得注意的是工业场景对“同步”的关注往往比音频还苛刻多轴联动时每轴信号到达相差几个微秒加工轨迹就会变形。测试测量领域则是另一个重头戏多通道任意波形发生器、多通道光电探测器的偏置扫描、生物医学里的多通道电刺激都需要高速、同步、低噪声的模拟输出。FPGA加DAC几乎是这个领域的标准组合。这里插一句我见过有人用ESP32自带的两路8位DAC做简易“视频输出”演示8位分辨率加上只有2个通道做做实验还行一旦想输出三路模拟RGB加同步信号就完全不够用了更别说8位DAC连基本的无梯度灰阶都保证不了。这个系列最初立项时需求就是综合了上面几类场景做一块通用型8通道16位模拟输出模块既能当多声道音频声卡用也能当低中速任意波形发生器用还能塞进工业控制柜里当模拟量输出卡。这个“什么都能干”的定位虽然听起来很贪婪但恰恰是推动我们在架构上做取舍的核心动力。1.2 核心指标是怎么定出来的很多项目一开始容易犯“指标越高越好”的毛病但每一档参数背后都是成本、面积和调试难度的博弈。这个系列的核心指标是开会吵架吵出来的最终落在了这样一组数值上参数目标值定值理由通道数8覆盖主流音频7.1声道/工业8路模拟输出分辨率16 bit音频端对应约96dB动态范围工业端对应约0.0015%步进通用性最好每通道更新率≥1 Msps能输出100kHz正弦波且每周期保证10个采样点通道同步偏差≤100 ns满足多轴伺服和音频声道对齐的硬要求通道串扰≤-100 dB 1kHz参考中高端音频DAC和工业模拟输出卡规格输出范围0~10V / ±5V可配置覆盖常见工业信号和音频线路电平范围为什么不是24位原因很现实。24位Delta-Sigma DAC在音频里确实是高端标准但它的数据吞吐量、延迟和成本都明显更高而且很多24位DAC的更新率上限并不高。对一台需要兼顾任意波形发生和工业控制的模块来说16位是精度与速度都很平衡的甜点。至于更新率1Msps这个数字同样有讲究音频DAC通常工作在44.1kHz到192kHz工业上不少波形发生需求在几十kHz以下1Msps留足了三倍的余量也给将来做中频信号源留了可能。1.3 为什么“软件同时写”解决不了同步问题“我们要8通道同步输出简单代码里把8个DAC挨个写一遍不就行了。”这是项目初期最容易听到的一句话。理论上看每条指令之间只差几微秒普通应用确实感知不到但放到多通道DAC这个场景里这条路完全走不通。问题出在三个层次。第一无论是I2C还是SPI数据都是一个字节一个字节传的8个DAC依次片选写入最后一个通道收到的数据比第一个通道晚了至少几十微秒。第二很多DAC芯片内部有数字滤波或数据锁存从收到数据到模拟输出真正更新内部处理延迟并不一致尤其在Delta-Sigma架构里数字插值滤波会引入几十到上百个采样周期的固定延迟。第三如果DAC的更新时钟不是共享的各通道的采样时刻本身就有相位差。一个很直观的例子是多轴机器人画圆弧。X轴和Y轴都收到目标位置指令如果X轴的DAC提前几十微秒把指令变成了电压Y轴还在等待数据那电机实际走出的轨迹就不是圆弧而是一段段折线拼接出来的“多边形”低速时还能勉强接受高速加工时直接报废工件。这就是为什么所有专业多通道DAC系统都在硬件上做了同步机制数据全部先写入每个通道的缓冲寄存器然后通过LDACLoad DAC这类专用引脚统一触发更新让所有通道在同一时刻刷新输出。这个原理是这个项目所有架构决策的基石。从第一块测试板开始我们就要求FPGA控制每一片DAC的LDAC引脚全系统时钟同源。软件上无论怎么配置寄存器永远不允许直接通过单独写数据来更新通道输出。2. 架构选型R2R、Delta-Sigma还是PWM2.1 三条技术路线的本质差异定完指标第一个大坑就是DAC架构选择。市面上的DAC芯片基本可以归为三类R2R电阻网络型、Delta-Sigma过采样型、PWM积分型。它们的工作原理天差地别适合的场景也完全不同。R2R DAC的核心是一个简单的电阻分压网络数字输入码的每一位控制一个模拟开关把对应权重的电流或电压叠加到输出端。它的特点在于并行结构数据进来后很快就能在输出端看到结果建立时间可以做到几百纳秒甚至更快而且没有内部数字滤波输出信号天然就是“原汁原味”的非常适合任意波形发生和方波输出。Delta-Sigma DAC走的是另一条路线。它用很高的内部采样率几MHz到十几MHz输出1bit或低比特位码流再通过噪声整形技术把带内量化噪声推到高频段最后靠模拟低通滤波器把高频噪声滤掉。这种“牺牲速度换精度”的思路让它在音频领域大杀四方轻松做到120dB以上的信噪比但代价是内部数字插值滤波引入了不小的延迟多通道做同步时处理起来相当麻烦。PWM DAC最朴素就是让单片机定时器输出固定频率、占空比可调的方波再用RC低通滤波取平均值。成本低到可以忽略软件实现也很简单但分辨率和速度互相制约。想提高分辨率就得用更高的PWM位数在时钟频率不变的情况下PWM周期会变长滤波就越来越难。2.2 R2R DAC的精度瓶颈与破解思路既然这个系列的定位是“Premium”我们首先排除了PWM路线在一代原型里做过测试发现PWM做直流调压可以做波形和音频完全不行这个后面单独说。剩下就是R2R和Delta-Sigma之间的选择。从纯粹的技术理想出发R2R是这种多功能模块的最佳架构。它没有数字滤波延迟多通道同步天然友好没有过采样噪声整形输出频谱干净建立时间短方波输出漂亮。但R2R有一个致命软肋精度完全取决于电阻网络的匹配度。我来算一笔账。16位DAC的1LSB相当于满量程的1/65536也就是大约15ppm。要让DNL微分非线性误差小于0.5LSB电阻网络的匹配误差至少要做到几个ppm的量级。普通0402薄膜电阻的精度不过±0.1%到±0.5%温漂几十ppm/°C用分立电阻搭一个16位R2R网络精度只能做到12到14位再往上全是噪声和误差。这也是为什么市面上几乎看不到用分立电阻做16位R2R的量产产品。解决这个问题有两条路。第一条是直接用集成R2R DAC芯片芯片内部用激光微调的薄膜电阻网络匹配度可以做得很高。ADI、TI、Maxim这些厂商有不少16位并行/串行R2R DAC比如AD5541/AD5641系列性能相当不错。第二条路是在FPGA内部做数字校准用校准DAC或修调算法补偿电阻失配但这属于高阶玩法开发周期长我们留给了下一代。这个系列最终选型是片外集成R2R DAC核心加FPGA控制。理由不复杂R2R的同步性能和方波性能正是我们需要的集成芯片补足了精度短板FPGA负责把所有通道的更新时刻牢牢钉在同一条时钟线上。2.3 多通道系统中的参考电压与电阻网络设计很多人设计多通道系统最容易忽视的地方是参考电压。但参考电压才是整个DAC系统的“心脏”它的噪声和温漂会直接折算到每一个通道的输出上而且是1:1的关系。比如一个0~10V输出范围的16位DAC1LSB约等于152μV如果参考电压源自身有1mV的纹波那输出就会额外抖动6个多LSB普通系统直接报废。我们在这代板上做了三层处理。第一层选高精度基准源温漂系数做到3ppm/°C以下输出噪声控制在10μVpp以内。实测下来ADI的ADR4540和TI的REF5040都符合要求区别不大。第二层基准输出先经过一级低噪声运放做缓冲再通过RC低通分别馈入每一片DAC的REF引脚避免多片DAC之间通过REF引脚互相干扰。第三层在每片DAC的REF输入引脚附近加0.1μF和1μF的去耦电容滤掉高频干扰。R2R DAC的输出非线性还有一个容易被低估的因素模拟开关的导通电阻。即便电阻网络本身匹配得很好开关导通电阻和温度漂移也会影响分压比。集成DAC芯片在内部已经处理了这个问题但如果你打算用FPGA自己驱动外部开关阵列搭R2R一定要选导通电阻小且平坦的模拟开关并且要算清楚它在整个温度范围内的变化对上文几个ppm指标的影响。这一块我们吃了不少亏后面在调试章节再细说。3. 电路与PCB设计把过冲和噪声扼杀在源头3.1 DAC输出方波上的过冲振荡是怎么来的项目进展到第二版硬件时我们遇到一个非常头疼的问题DAC输出1kHz方波示波器上看上升沿先冲上去超过目标电压20%多再掉回来来回振荡好几下才稳定。这个现象在搜索热词里被描述为“dac输出方波上升有过冲振荡下冲振荡”几乎是每个做DAC驱动电路的人都会撞上的问题。过冲和振铃产生的原因主要有三类排查时最好按顺序处理。第一类是测量伪影。示波器探头的地线夹如果用的是那种十几厘米长的鳄鱼夹引线它本身就是一个电感和探头的输入电容一组合在测量高频边沿时就会形成谐振你看到的过冲可能是探头自己振出来的不是DAC真实输出。鉴别方法很简单把探头换成接地弹簧针式接地输入端用短线直连测试点再测一次波形。我们第一次发现过冲问题时先做的就是这个操作结果过冲从20%降到了8%剩下的才是电路真实存在的问题。第二类是寄生电感和负载电容构成的LC谐振。PCB走线本身有寄生电感大约每毫米1nH量级如果输出走线较长加上后续电缆和运放输入电容就会形成一个谐振回路。谐振频率粗略估算可以用f1/(2π√(LC))假设走线电感100nH、负载电容50pF算出来大约71MHz这正好是示波器上看到的那种高频衰减振荡。第三类是运放驱动容性负载的问题。如果把DAC输出直接接一个宽带运放运放输出端再接同轴电缆或大电容反馈环路的相位裕度会下降导致瞬态响应出现振铃甚至自激振荡。这个原因最常见也最容易漏查因为高速运放在小信号状态下看起来一切正常一旦驱动大阶跃方波就原形毕露。3.2 消振措施串阻、Snubber与PCB布局解决过冲振铃我的经验是优先用最简单的办法不要一上来就堆大电容。第一步在DAC输出端和下一级电路之间串一个电阻阻值取33Ω到100Ω这个范围。串阻会和负载电容构成一个RC低通把高频振铃压下去。代价是信号带宽下降比如100Ω串阻加50pF负载电容截止频率约32MHz对1Msps更新率的信号来说完全够用但如果想输出更高频率的方波就要权衡了。第二步如果串阻还不够加RC Snubber吸收网络。Snubber是在输出节点对地接一个串联的电阻和电容通常R取几十欧C取几十到几百皮法。它的作用是像一个“海绵”一样吸收振铃能量。阻容值怎么选我的经验是先实测振铃频率比如在示波器上看到100MHz的衰减振荡周期就是10ns那么Snubber的RC时间常数取10ns左右R选50Ω的话C就是200pF然后在这个基础上微调。注意电容不要贪大过大的C会让方波上升沿变缓波形从一个极端走向另一个极端。第三步回到PCB本身。所有模拟输出走线尽量短而直远离数字信号线过孔能少就少。DAC输出到运放输入如果距离超过1厘米我会建议在中间预留一个串阻焊盘位方便调试时焊接。多通道系统中相邻通道的输出走线要保持距离中间铺地铜皮隔离能有效降低串扰。从实测数据看第三版板子只靠串阻加Snubber就把方波过冲从最初版本改版前的22%压到了2%以内振铃完全消失。但这里也要提醒一句Snubber只能解决电路层面的振铃如果是电源层设计导致的地弹噪声问题远不止这点还得靠下面的电源分区来解决。3.3 多通道供电与地平面分区多通道DAC的电源设计基本决定了你能走到多高的有效位数。16位DAC对电源噪声的敏感程度我用一个数字来说明满量程5V时1LSB约76μV。电源纹波如果直接耦合到输出哪怕只有500μV也等于白白丢掉了两三位的有效精度。所以不管宣传页上写多少位实际系统能到多少位看电源和基准就知道大半了。我们这一代板子采用了比较严格的做法模拟电源和数字电源完全分离每一路都是独立的LDO输出模拟LDO输出后加磁珠和LC滤波再进DAC。之所以不用DC-DC直接给模拟部分供电是因为DC-DC的开关噪声虽然幅度不大但频率成分复杂容易和DAC时钟产生混频落到带内。如果板面积紧张不得不用DC-DC也一定让开关频率避开DAC采样频率的整数倍并在输出端做好LC滤波。地平面处理上这个项目经历了两次改版。第一版把模拟地和数字地简单分成两个区域再用一个0Ω电阻单点连接结果发现多通道同时更新时数字开关噪声顺着地平面跑到了模拟区域。第二版干脆把DAC芯片摆放在模拟区和数字区的交界线上模拟引脚和数字引脚各占一边地平面在芯片下方自然断开所有模拟信号完全不出模拟区。这样改完输出端观察到的数字噪声毛刺下降了差不多一个数量级。去耦电容的摆放位置同样重要。每片DAC的电源引脚附近都要放0.1μF高频瓷片电容和10μF钽电容高频电容离电源引脚越近越好最好放在同一层且靠近芯片过孔直接打到地平面上。多通道同时更新时所有通道的模拟开关一起动作瞬态电流很大如果去耦电容离得太远回路电感会抵消掉电容的效果地弹噪声照样压不住。3.4 输出运放选型与压摆率计算DAC裸输出通常带载能力不强直接接负载会导致精度飘移所以每通道都要加一级运放缓冲/放大。这级运放看着不起眼实际选型踩坑最多。核心参数是压摆率。方波输出的上升边沿有多快完全取决于运放能多快把输出电压从低拉到高。压摆率计算公式是SRΔV/Δt。假设输出范围是±5V上升时间要求做到100ns那压摆率至少要100V/μs。这已经排除了很多通用精密运放别看有的运放带宽几MHz很唬人压摆率只有几V/μs遇到方波瞬间就露馅。我给出的选型经验是三步走。第一明确目标上升时间通常取信号最高频率对应周期的1%以下比如要输出1MHz方波周期1μs上升时间压到100ns以内SR就得超过100V/μs。第二按SR公式反推运放需要的压摆率再乘以2倍以上做余量。第三查GBW增益带宽积保证GBW至少是信号最高频率的10倍以上否则小信号增益不够。我们最终选择的是AD8065压摆率180V/μs带宽145MHz驱动几十pF负载很轻松。音频测试场景换成OPA161227V/μs的压摆率虽然不高但噪声和失真指标更优秀。这种“不同场景换不同输出级”的思路也让我们的板子能快速适配不同应用。4. FPGA控制、时钟分配与数据流实现4.1 为什么是FPGA而不是单片机这个项目到了需要真正驱动8通道信号时我们很快意识到STM32这类单片机扛不住。STM32F103驱动单通道DAC做音频播放没问题但多通道就麻烦了。一方面GPIO数量和SPI外设不够用8个通道要分时访问同步性无从谈起另一方面单片机的中断延迟和DMA调度不确定性很大即使把采样率压到每通道50kHz多通道之间也会出现几十微秒的随机抖动这在前面提到的“圆弧变形”场景里是绝对不可接受的。FPGA的天然优势在于“并行”。它是硬件逻辑所有通道的数据通路可以同时工作不存在“逐通道处理”的概念。而且FPGA可以把所有DAC的LDAC引脚连到同一根内部信号线上需要同步更新时一条指令在同一个时钟沿把所有通道的输出寄存器同时加载。当然FPGA也有学习成本和开发周期的问题。但如果目标就是多通道、高同步、任意波形发生器那这个成本是省不掉的。单片机和FPGA的分工可以这样设计MCU负责上位机通信、用户配置解析、系统监控FPGA负责高速数据流和DAC时序控制。两者之间用SPI或并口连接各干各的活。4.2 多通道数据通路与FIFO设计数据通路是另一个容易被低估的设计点。8通道、16位、每通道1Msps意味着DAC端的数据吞吐量是8×16×1M16MB/s。如果通过USB2.0从PC连续传输带宽是够的但也绝对不算宽裕一旦PC有调度抖动或者USB仲裁延迟DAC就会断流输出波形出现瞬间毛刺。解决断流问题的标准做法是在FPGA内做FIFO缓冲。我们为每个通道分配了独立的FIFO深度设为4096采样点相当于每通道约4ms的数据缓冲。为什么不用共享大FIFO因为独立FIFO能避免一个通道的突发数据影响其他通道的读取节奏同步性更好。理论上深度越大越安全但会牺牲延迟对于需要实时响应的工业控制场景延迟几十毫秒是不可接受的所以这个项目在缓冲深度和实时性之间取了一个平衡。给一段简化版的Verilog示意展示多通道数据从FIFO读出并同步加载到DAC的流程module dac_sync_8ch #( parameter DATA_W 16 )( input wire clk, input wire rst_n, input wire [7:0] fifo_empty, input wire [DATA_W-1:0] fifo_data [0:7], output reg [DATA_W-1:0] dac_bus [0:7], output reg ldac_n ); always (posedge clk or negedge rst_n) begin if (!rst_n) begin ldac_n 1b1; end else begin // 当所有FIFO非空时同一拍加载并同步更新 if (fifo_empty 1b0) begin dac_bus[0] fifo_data[0]; dac_bus[1] fifo_data[1]; // ... 其他通道同理 ldac_n 1b0; end else begin ldac_n 1b1; end end end endmodule实际工程中还会加上FIFO读使能、状态机、错误恢复等逻辑但核心思想就一句话所有通道的数据必须在同一个时钟沿到达DACLDAC同步拉低输出整体更新。4.3 时钟分配与通道对齐如果说数据通路决定DAC能不能正常工作时钟分配就决定DAC能不能高质量工作。这个系统里所有DAC的时钟必须同源。我们用的方案是板上放一颗50MHz低抖动晶振进FPGA的PLL生成DAC模块需要的100MHz时钟然后通过FPGA的全局时钟网络和引脚扇出到每片DAC。扇出的时钟走线做等长处理最长和最短的偏差控制在5mm以内换算成时间差不到0.1ns。DAC芯片如果有独立的帧时钟或左右声道时钟需求比如音频场景需要LRCK我们就在FPGA内部做分频从同一个主时钟分出来保证LRCK、BCLK、数据三者的相位关系始终锁定。这样做的好处是不管录音还是回放一旦系统锁定通道间距永远不会漂移。通道对齐的验证方法很简单但很有效让8个通道同时输出同一个方波用示波器的多通道输入同时测量看所有通道上升沿的时间差。实测我们的初版PCB在最坏情况下偏差约80ns原因是一只DAC的时钟走线绕了较大弯修正等长后偏差降到15ns以内。这在100ns的指标线附近留足了余量。5. 实测调试记录问题现象、原因与解法5.1 方波过冲振铃的现场排查第三版样机焊好第一台上电测试方波看到的现象是上升沿先冲到3.6V随后掉到2.4V附近振荡两三个周期才稳定目标电平3.3V。过冲幅度约18%。排查流程完全按前文提到的顺序来。第一步换短地线探头过冲降到8%排除测量伪影。第二步断开输出接插件直接在DAC芯片输出引脚上测过冲进一步降到5%说明有很大一部分振铃是同轴电缆连接导致的。第三步接入33Ω串阻过冲降到2.5%以内基本可以接受。为了彻底干净又在输出节点加了一组33Ω100pF的Snubber实测过冲降到1%出头波形已经很干净了。这里特别提醒一个新手很容易犯的错误不要为了追求过冲为0而无限加大Snubber电容。我们试验过把C加到1nF振铃确实彻底没了但方波上升沿从30ns变成了300ns一个方波发生器变成积分器直接废掉。过冲压到2%以内工程上已经是很健康的状态没必要为指标好看牺牲带宽。5.2 通道串扰与噪声低位跳动第二版板子测试通道串扰时给CH0输出10kHz满幅正弦波其他通道输出0V测CH1输出端竟然能看到约60dB衰减的泄漏信号。那时候已经达到串扰-60dB的水平勉强能看但离目标-100dB还差得远。排查过程分两步。第一步是测量定位把CH0的输出断开只保留走线发现CH1的泄漏信号依然存在说明不是通过运放供电耦合而是PCB走线之间的空间耦合。于是把CH0和CH1的模拟走线间距从0.5mm扩到1.5mm并在中间加了一条接地隔离铜皮串扰一下降了10dB。第二步是发现共用的电源走线也有问题从LDO出来一条线穿过所有DAC
返回列表