☰
R-2R电阻网络DAC详解:原理、精度与STM32实战
2026/10/7 1:33:20 网站建设 项目流程

R-2R电阻网络DAC,很多人第一次看到会觉得这玩意太古老了,实验室里拉一堆电阻焊起来,精度又不高,现在随便一颗芯片都带16位DAC,何必费这个劲。但我要说的是,如果你真的把R-2R网络吃透了,你等于一次性把电阻分压、戴维南定理、电流堆叠、波形合成、DAC静态指标这些东西全部打通了。尤其是你手上正好有STM32F4这类MCU,想用DAC输出波形、想搞个简易信号源,或者纯粹好奇DAC内部是怎么把数字量变成模拟电压的,这篇文章就是给你准备的。

我会从最基本的电阻网络怎么分压讲起,一直聊到精度怎么估算、运放怎么配、PCB怎么布,再穿插一些在STM32上配DHR寄存器、用定时器触发DAC输出波形这些实操经验。全程没有晦涩的公式堆砌,但关键推导我会给出来,保证你读完能自己搭一套能用的R-2R DAC出来。

1. 内容整体设计与思路拆解:为什么要选R-2R而不是别的结构

先解决一个最基础的问题:DAC的核心任务是什么?就是把一个二进制数字比如0b1010,转成一个对应的模拟电压。实现这个目标有好几条路,最常见的是三种:权电阻网络、R-2R梯形网络、以及芯片内普遍采用的电阻串加开关阵列结构。

权电阻网络是最直觉的思路。一个8位DAC,用8个电阻,阻值分别是R、2R、4R、8R……一直到128R,每个电阻连接到对应的位开关,然后所有电阻另一端汇总到运放的求和点。这个方案的问题很明显:最高位和最低位电阻差了128倍,要做到8位精度,最高位电阻的误差必须小于0.39%,最低位电阻的实际阻值理论上要接近25.6kΩ,这会带来两个麻烦——电阻阻值跨度太大,温漂特性很难保持一致;而且最低位电阻阻值过大会引入较大的噪声。

R-2R网络就聪明在这:它只用R和2R两种阻值。整个网络由T型结构重复级联组成,每个节点往外看,等效阻抗都是2R。这句话是理解R-2R网络最关键的钥匙。不管网络有多少级,从任意节点向左、向右、向上看进去的阻抗全都是2R,这个“阻抗恒定”的特性,让每一级的电流分配比例严格遵循二进制权重,而且不需要大跨度电阻,温度特性也容易做得一致。

你可能要问,现在芯片里DAC那么多,为什么还要自己用电阻搭?几个很实际的理由:第一,学习和教学价值极高,你亲手焊一版就能直观理解DAC内部工作原理,这是看一百页datasheet都换不来的;第二,某些特定场合需要高电压输出或者特殊量程,商用DAC芯片的输出范围往往被内置基准和运放限制死了,自己搭R-2R可以灵活设计;第三,成本极低,一颗精密运放加一堆电阻,十几块钱就能搭一个12位级别的DAC,虽然不能和专门的DAC芯片比综合性能,但做教学实验、低速信号源完全够用。

还有一个很现实的场景:你用的是带有DAC外设的MCU,比如STM32F4系列,但你觉得内置DAC输出能力不够(比如驱动能力弱、输出范围受限),或者你想了解内部DAC的本质——其实很多MCU内置DAC就是用R-2R架构加上输出缓冲级实现的。你搞懂了R-2R,就等于搞懂了MCU内部DAC的基本骨架,这时候再去操作DHR寄存器、触发方式这些东西,你就知道每个寄存器控制的是哪一个环节,而不是只会抄初始化代码。

2. 核心细节解析与实操要点:R-2R网络怎么把数字变成电压

2.1 从一级网络看起:戴维南定理是万能钥匙

别一听戴维南就犯怵,这里只需要最简单的版本:任何一个线性有源二端网络,对外部电路来说,都可以等效成一个电压源串联一个电阻。R-2R网络就是靠着这个定理一步步“吃”出来的。

先看最简单的一级情况。一个R-2R网络的基础单元长这样:左边输入一个参考电压Vref,经过一个电阻R,到达节点A,节点A向下接一个2R电阻到地,向上或者向右再接下一级。如果只有这一级,节点A的电压就是Vref经过R和2R分压,得到Vref * 2R / (R + 2R) = Vref * 2/3。此时从节点A向右看进去的等效电阻是R加上2R并联地的结果,也就是 R + 2R = 2R,注意,这里刚好又得到2R。

这就是R-2R结构的自相似性。于是我们可以做这样的递推:不管后面接了多少级,每一级从节点向右看进去的电阻恒等于2R。那么这一级的节点电压,就等于上一级传来的电压经过R和2R(等效阻抗)分压,又一次是2/3倍。

有了这个递推关系,我们就能把多级网络的每一位贡献分开算。第0位(最低位)贡献的电压是 Vref * (1/2^N) 这个量级,第1位贡献的是它的两倍,每一位的权重严格按二进制递减。最终运放求和点得到的电流,正好等于 Vref / R * (b0/2^N + b1/2^(N-1) + ... + b(N-1)/2),各位的系数就是数字量对应的二进制位。

2.2 为什么输出电阻恒定这一点如此重要

很多刚开始接触R-2R的人会纠结一个问题:那我把每一位开关接到运放求和点,网络内部会不会互相影响?答案是“几乎不会”,根本原因就是每个节点看进去都是2R。

用一个生活化的类比:想象一根水管,每隔一段距离就有一个出水口,每个出水口装了一个恒流阀门。因为主管道每一段的水压(等效电压)都被“钳住”了,每个阀门出多少水只跟自己的开关状态有关,不会因为旁边阀门开没开而变化。R-2R网络的节点电压就是被前后级“钳位”住的,每一位的开关电流彼此独立,所以能保证低位的电流不会跑到高位支路里去,这就是“权重独立”的物理来源。

这个特性带来一个直接的好处:R-2R网络可以不用运放,直接在输出端接一个电阻到地,用电压输出模式工作;也可以用运放做电流求和,用电流输出模式工作。输出端的等效阻抗恒定,意味着不管输入数字量是多少,DAC的输出阻抗都不变,这给后级电路的匹配带来了极大便利。相比之下,权电阻网络的输出阻抗随数字码变化,这是它天生劣势的另一个侧面。

2.3 两种常见接法:电压模式和电流模式

实际操作中,R-2R DAC有两种标准用法。

第一种是电压模式(Voltage Mode)。R-2R网络输出端直接得到一个电压,这个电压等于 Vref * (D/2^N),其中D是输入数字量。你可以直接用万用表测量这个输出节点,但问题在于网络输出阻抗是R,你要测准确,测量设备的输入阻抗必须远大于R,而且后级电路的负载效应会直接影响精度。所以电压模式通常还是要接一个高输入阻抗的缓冲器,比如电压跟随器。

第二种是电流模式(Current Mode)。R-2R网络中每一位的开关把电流导向运放的虚地端(求和点)或者地。运放反相输入端是虚地,两个2R支路的电流在这里汇合,通过反馈电阻Rf转换成电压。市面上很多DAC芯片,比如经典的AD7541就是电流输出型,需要外部运放做IV转换。自己做R-2R时,电流模式更常见,因为运放的虚地隔离了负载影响,而且线性度更好。

我在实际项目中习惯先把电压模式和电流模式都算一遍。公式上,电压模式每个节点电压是Vref/2^k,电流模式每个支路电流是Vref/(2R * 2^k)。两种模式本质一样,但电流模式对运放的偏置电流、失调电压要求更高,后面我会详细说。

2.4 位数扩展时的开关设计

如果你用跳线帽或者拨码开关来模拟数字输入,那很简单,每一位就是一个单刀双掷开关:拨到一边接Vref,拨到另一边接地。但如果你想做动态信号源,就得用模拟开关,比如CD4066、DG403这类芯片,或者直接用MCU的GPIO加逻辑电平去控制一个模拟开关。

这里容易犯的一个错误是:直接用MCU的GPIO去驱动R-2R网络的开关,GPIO的导通电阻不是恒定的,不同引脚的驱动能力和内阻不一样,加上输出电压随负载变化,会让高位权重漂移。正确做法是选导通电阻远小于2R的模拟开关,并保证导通电阻平坦度在容差范围内,或者用MOS管做切换,把导通电阻的影响折算到电阻误差里去。

3. 实操过程与核心环节实现:从原理到一把烙铁焊出真实DAC

3.1 先定规格:你想要的DAC是多少位

在动手之前,先算清楚你需要的位数,这决定了电阻选型和网络复杂度。一个8位R-2R,只需要16个电阻(8个R,8个2R),加上反馈电阻,焊起来很快。一个12位R-2R需要24个电阻,虽然多一点,但手工焊接完全可以胜任。

位数和精度的关系要理解透彻。理论上N位DAC的分辨率是1/2^N,12位就是1/4096。但实际能达到多少精度,取决于电阻的匹配度。电阻误差会直接转化成输出非线性。工程上有个经验公式:要让INL(积分非线性)不超过±0.5LSB,电阻匹配精度大约需要优于1/2^(N+1),也就是12位需要约0.012%的匹配度。这个精度级别普通的1%贴片电阻完全不行,得用0.1%甚至0.01%的精密电阻网络。

不过也别被这个数字吓到。真实世界里的R-2R网络存在一定的误差抵消效应,而且你可以加上校准。我的建议是:做8位用1%的金属膜电阻绰绰有余;做10位建议0.1%起步;做12位就必须用0.01%精密电阻,或者更常见的组合:电阻网络模块(比如Bourns的R2R网络排阻)加上软件校准。校准的思路是测出每个位的实际权重,在软件里补偿,后面会展开讲。

3.2 电阻选择与网络焊接:决定成败的细节

电阻选型有一个常被忽略的点:不仅阻值要准,温漂要匹配。如果R和2R用的是不同温度系数的电阻,温度一变,比值就飘。理想情况是同一批次、同一种材质、同一种封装,甚至同一个排阻。所以强烈推荐使用厚膜排阻或者集成电阻网络,它们内部是同一基片上激光微调的,匹配度和温漂一致性远好于普通贴片。

焊接时注意,电阻引脚长度尽量保持一致,不要一个贴片远离另一个。我自己吃过大亏:有一次搭12位R-2R,高位电阻用的是0805贴片,低位用的是0603,结果不仅阻值偏差超过了1%,而且焊接时烙铁停留时间不同导致残余应力不同,温漂出来后低位漂移特别明显,最后只能重新焊。

焊接完成后,先别急着接运放,用万用表逐点量电阻值。重点检查每个节点到地的等效电阻是不是约等于2R。这一步能在通电前发现大部分焊接问题。量的时候仪表探针接触电阻也会影响读数,所以建议用四线制测电阻,或者多测几遍取稳定值。

3.3 运放选型与反馈电阻计算

电流模式R-2R DAC需要一个运放做电流电压转换。运放的选型有几个硬指标:输入偏置电流要小(失调电流会直接叠加到信号电流里,形成固定偏移和温漂);失调电压要低(它会产生输出电压偏移);开环增益要足够大(保证虚地基本为0V,否则虚地不准会破坏节点阻抗关系)。

举个例子,12位DAC,Vref=5V时,一个LSB大约1.22mV。在输出端,如果运放失调电压是0.5mV,那就相当于0.4LSB偏置,还没算偏置电流的贡献。普通LM358在这种场景下会比较勉强,建议至少用OP07、OPA2277这类精密运放,偏置电流是nA级别,失调电压在uV到几十uV级别,不会成为明显误差源。

运放反馈电阻的取值决定了增益。如果想让满量程输出等于Vref,就取Rf = 2R。因为网络最高位的电流是Vref/(2R),这个电流乘以2R后就是Vref。如果你想输出范围更大,可以放大反馈电阻,但注意输出摆幅受运放供电电压限制,不能无限放大。

计算输出公式:Vout = - (Vref * D) / (2^N) * (Rf / R_网络)。更直接一点,Vout = - Vref * D / 2^N * (Rf / (2R) * 2) 等化简。很多文章写R-2R时会省略这个负号,因为反相放大器输出是负的,你后级可以加一级反相或者用正基准调过来。我自己习惯加一级反相跟随,顺便做阻抗隔离和驱动增强。

3.4 在STM32F4上如何对接:DHR寄存器、DMA与定时器触发

搞清楚了电阻网络,咱们把话题拉回MCU。STM32F4自带DAC,手册上说它就是采用R-2R结构的电阻网络把数字转换成模拟电压,内部还有输出缓冲器和校准逻辑。很多人在使用STM32 DAC时,只知道填“看门狗”式初始化代码,却不清楚DHR寄存器的作用。其实DHR就是“数据保持寄存器”,你往DHR12R写12位数据,内核会自动把数据搬运到DOR(数据输出寄存器)并触发DAC转换。理解这点之后,你会发现DAC波形生成本质上就是不断更新DHR12R的过程。

用定时器触发DAC是STM32上非常实用的技巧。典型配置:定时器TIM6的更新事件映射到TRGO,然后DAC选择定时器触发模式。这样DAC转换的频率完全由定时器控制,你可以精确输出正弦波、三角波。配合DMA,把波形表循环搬运到DHR12R,MCU内核可以解放出来处理别的事。

下面是一个精简的初始化片段,完成GPIO、定时器、DAC、DMA的配置:

// 初始化DAC通道1输出引脚 PA4 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_DAC_CLK_ENABLE(); __HAL_RCC_TIM6_CLK_ENABLE(); __HAL_RCC_DMA1_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 定时器6配置:72MHz/72/1000 = 1kHz触发 TIM_HandleTypeDef htim6 = {0}; htim6.Instance = TIM6; htim6.Init.Prescaler = 72 - 1; htim6.Init.Period = 1000 - 1; HAL_TIM_Base_Init(&htim6); HAL_TIM_Base_Start(&htim6); // DAC配置:使用定时器触发,关闭输出缓冲(接外部运放时通常关) DAC_HandleTypeDef hdac = {0}; hdac.Instance = DAC; HAL_DAC_Init(&hdac); DAC_ChannelConfTypeDef sConfig = {0}; sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE; sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO; sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE; HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1); HAL_DAC_Start(&hdac, DAC_CHANNEL_1);

这段配置里有几个提请注意的地方。输出缓冲关掉之后,DAC引脚输出阻抗变大,驱动能力弱,后级必须接高阻抗缓冲器;如果你把内部缓冲打开,虽然驱动能力强了,但内部缓冲带来的非线性会变差。自己搭R-2R时,同样要统一考虑:你的R-2R网络输出阻抗是已知的,后级用运放隔离是最稳当的。

如果不想用定时器触发,直接调用HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dhr_data)写入DHR寄存器,DAC会按软件触发立即更新。这个函数里的第二个参数DAC_ALIGN_12B_R表示数据右对齐,写入DHR12R。理解了DHR寄存器之后,这里就不会再犯“左对齐右对齐搞混”这种低级错误——12位数据放在16位寄存器的高位叫左对齐,放在低位叫右对齐,只看你怎么接线。

3.5 用自己搭的R-2R替换MCU内置DAC:外部扩展方案

你会问,既然MCU有内置DAC,为什么还要外搭R-2R?答案是你可能想要更高的输出范围,或者更低的噪声,或者只是想在分立元件上理解原理。外接R-2R时,MCU的GPIO负责输出数字码,每个GPIO通过一个开关控制R-2R网络的对应位。

这种方式有一个重要问题:GPIO的输出高电平电压并不严格等于Vref,而且随负载变化。5V供电的STM32F407在GPIO输出高电平时,带上负载后电压会有点下垂,不同位引脚的驱动能力和下拉程度不同,导致权重漂移。比较可靠的方案是:GPIO驱动一个74HC574或74HC595这类锁存器,锁存器输出接R-2R网络,锁存器的高电平由同一基准电压源供电,这样保证每一位的高电平一致性。或者直接用模拟开关如DG408,把Vref精确切换到网络节点上,隔离GPIO电气特性带来的影响。

如果你只是做低速实验,可以直接用GPIO驱动,但要用万用表测一下每一位的实测电压,记录下来做软件校准。我自己试过直接用GPIO驱动8位R-2R,焊接完后偏差大约2.5%,用软件校准后可以压到0.2%以内,但这个精度已经到极限了,想再往上就需要外部门电路或者模拟开关。

4. 常见问题与排查技巧实录:从毛刺到非单调,逐一拆解

4.1 输出非单调:数字加大电压反而变小

现象:代码从0x7FF加到0x800时,输出电压没有增加,反而掉了一截。这是典型的高位权重误差过大问题。0x800是最高位单独导通,0x7FF是低11位同时导通。如果最高位的实际权重低于其他11位权重之和,就会出现这种“隆起-塌陷”。原因往往是最高位的2R电阻实际值偏高,或者Vref到位开关的线路压降偏大。

排查方法:先静态测量每一位的电压贡献。把其他位开关全部置0,只拨某一位为1,测输出,记录数据;然后清掉该位,拨下一位。把测出来的权重和理论权重(Vref/2^k)对比,找出误差最大的位。修复方式要么换更精密的电阻,要么做权重校准。

这里要特别提醒:输出非单调在某些闭环应用里会导致振荡或者控制失效。如果你的DAC是8位以上,务必测一下单调性。最简单的测试方法:从0开始逐步加1,同时用万用表记录电压,确保每一步电压都是增加的。如果万用表分辨率不够,就在后级接一个差分放大器放大LSB步进,再观察。

4.2 输出毛刺:数字切换瞬间产生的尖峰

R-2R DAC在数字码变化瞬间,每个开关的导通/断开时间不可能完全一致,尤其是高位开关和低位开关的不同步,会产生短暂的过渡状态。这个过渡状态会在输出端表现为尖刺(glitch),专业术语叫毛刺能量。

降低毛刺的常用方案:一是在输出端加一个低通滤波电容,把高频毛刺滤掉,但电容太大会影响建立时间;二是选用先断后合的模拟开关(make-before-break的反面),保证在切换时不会短暂接通两个通路;三是在数字信号进入模拟开关前,加一级寄存器锁存,让所有位同时变化。后者是我最推荐的方式,用一个74HC574锁存器,所有数据位由同一个时钟沿驱动,可以大幅减少位间时差。

还有一个很容易忽略的点:Vref的走线噪声。数字码切换时,开关电流瞬间变化,如果Vref走线电感大,会产生一个尖峰电压,这个尖峰耦合到输出端,看起来跟上文说的一样。解决方法是在Vref引脚对地加一个高质量的去耦电容,比如10µF钽电容并联0.1µF陶瓷电容,走线尽量短粗。这个问题在MCU内置DAC上同样存在,所以你在用STM32 DAC时,VREF+引脚一定不要省去去耦电容。

4.3 输出电压总偏差:基准电压和运放抬高的锅

如果直观上感觉输出电压总是比理论值高一截或者低一截,先别急着怀疑电阻。很大概率是基准电压Vref精度不够,或者运放失调电压太大,还有一个常见原因是电流模式下的虚地不是精确的0V,导致某些电阻支路两端电压不是理论值。

检查方法:用高精度万用表直接量Vref,确认是否和设计值一致。然后量运放反相输入端对地电压,在正常工作状态下应该接近0V,一般小于1mV。如果反相端有零点几伏电压,说明运放没有正常工作,检查反馈回路是否接对、运放是否饱和、供电是否正确。

还有一个容易忽略的坑:Vref引脚的电流供应能力。R-2R网络的等效负载就是R级别的电阻,从Vref抽取的电流可以达到毫安级。如果你的Vref来自一个简陋的稳压二极管电路,带载能力不足,那么在不同输出码下Vref会被拉低,导致整个DAC的非线性大增。必须用低输出阻抗的基准源,比如REF5025、ADR420这类专用基准芯片,或者至少用运放缓冲过的稳压电压。

4.4 测试方法:逐码扫描与INL/DNL计算

为了量化DAC的好坏,逐码扫描是最直观的测试。写一段程序或者手动切换开关,从0开始每增加1个LSB记录一次输出电压,得到一条实测转移曲线。有了这条曲线,两个指标就出来了。

DNL(微分非线性)指两个相邻码之间的实际步进和理论LSB之差。如果某两个码之间的步进只有0.6个LSB,DNL就是-0.4LSB。INL(积分非线性)指实际输出曲线和理想直线之间的最大偏差。计算时先找到实测曲线的端点和零点,画一条端点拟合直线,然后看每个码和直线的最大差值。

如果你用的是STM32内置DAC,逐码扫描就是循环写DHR寄存器并读取ADC采样值(ADC可以采自己输出的电压)。注意,用ADC测量DAC会引入ADC自身的量化误差和线性误差,要测准需要更高精度的外部万用表。我通常用的办法是:DAC输出接一个精密电阻分压,再用6位半台式万用表量,最后数据导入表格软件算DNL/INL。8位R-2R网络配合1%电阻,实测DNL大约在±0.3LSB附近,INL大约±0.5LSB;换0.1%精密电阻后,INL能压到±0.2LSB之内。

4.5 关于STM32 DAC与外部R-2R的对照排查

有一类问题看起来像是硬件故障,其实是配置问题。比如STM32 DAC输出始终是0,或者始终是满量程。排查时先确认GPIO是否被复用成模拟模式,如果复用错误,引脚根本不会输出模拟量。第二确认DAC通道是否使能了输出缓冲,如果外部阻抗很低,缓冲器可能拉不动,输出电压异常。

再比如用定时器触发DAC却没有波形,优先检查两件事:定时器有没有真正启动,TRGO是否映射为更新事件。TIM6的TRGO被DAC用作触发源,但如果你只初始化定时器不调用HAL_TIM_Base_Start,定时器根本没跑起来,DAC自然就静静躺着。这种“配置代码看起来全对但就是不工作”的情况,十有八九是启动顺序问题。我自己的调试习惯是:先用软件触发方式调通DAC输出,再用定时器触发替换,这样能把问题隔离到触发链路而不是DAC本身。

5. 扩展思路:R-2R之外的DAC进阶用法与校准技巧

5.1 软件校准:让普通电阻实现高精度输出

前面反复提到校准,这里给一个实际可用的思路。电阻的初始误差是固定的,那么每一位的实际权重也是固定的。你可以在出厂前或者开机初始化时,做一次全码扫描,把每个码对应的实际电压记录下来,存成校准表。实际使用时,你想输出某个目标电压,用二分查找在校准表里找到最接近的码值输出。

这个方法能把硬件精度压力转移到存储上。比如用0.1%电阻搭的12位R-2R,原始INL可能达到±2LSB,做了逐点校准后,可以压到±0.5LSB以内,甚至更好。缺点是校准表体积大——12位需要4096个点,每个点两个字节就是8KB,在STM32F4上完全没问题,放到8位单片机就有点紧张。折中方案是只校准高位部分,比如只对高6位做全码校准,低6位用线性插值,这样可以显著减小表体积而精度损失有限。

5.2 与DAC插值/滤波器的关系:为什么信号需要后处理

热搜词里有个和DAC相关的“DAC插值数字滤波器”,这是另一个维度的DAC话题。如果你用STM32 DAC加定时器触发输出正弦波,当输出频率接近采样率时,波形会呈现明显的阶梯状,这就是零阶保持效应。插值数字滤波器的任务就是在DAC输出后或者数字域内,把阶梯之间的跳变平滑掉,让频域的镜像频率落到更远的地方,后端模拟低通滤波器的要求就能降低。

R-2R DAC也一样,如果你用数字码流快速驱动它输出波形,输出端同样会出现阶梯,加一个截止频率合适的无源RC滤波或者有源滤波器,是所有DAC输出链路的标配。需要注意的是,滤波电容会直接影响建立时间,RC时间常数不能太大,否则高频波形会被削掉。从MCU DAC输出1kHz正弦波,用1kΩ串10nF电容(截止频率约16kHz)是一个比较通用且安全的起点。

5.3 从R-2R到现代DAC:同一个思想的不同演化

现在的高精度DAC芯片内部不全是R-2R,很多采用了电阻串(segmented)加R-2R混合结构。高几位用电阻串分段,低几位用R-2R细化,这样既保证了权重精度,又减少了开关数量。理解R-2R网络后,你看这些芯片的datasheet内部框图,会发现结构熟悉多了。

而且,很多ADC芯片内部的DAC核心也用了类似结构。比如逐次逼近型ADC(SAR ADC)内部有一个DAC用于产生比较电压,常见的就是电容型电荷重分配DAC,但原理上也是二进制权重网络,只不过电容代替了电阻。从这个角度说,R-2R的分析方法,包括阻抗恒定、权重独立、开关串扰这些概念,在电荷重分配DAC里同样适用,只是把电阻换成了电容。工程技术就是这样,底层思维方式一通,换一个器件载体,思路完全照搬。

6. 调试心得与经验总结:这些坑我替你踩过了

写到最后,分享几个我在实际搭建R-2R DAC过程中反复遇到的教训,也是我认为最有价值的经验。

第一条关于基准和供电。任何DAC的精度上限都不会超过它的基准源。我在一个项目里用AMS1117输出的3.3V做R-2R参考电压,结果输出电压随负载变化非常明显,校准完全没法做。后来换成一颗REF3030,输出稳定了,INL一下子好了一个数量级。所以如果你想认真做,基准芯片的钱不能省。

第二条关于接地。R-2R网络是模拟电路,数字开关信号是数字部分,模拟地和数字地应该单点连接,模拟走线远离数字走线。有一次我把GPIO驱动线平行走在了R-2R网络上方超过5厘米,切换高位时输出端能看到明显串扰毛刺,后来改了布线,毛刺立刻降下去。这在面包板上做实验时尤其明显,面包板的簧片电容大,数字信号很容易耦合到模拟节点上。

第三条是测试时不要用手摸电路。人体电容和电阻会影响网络的分压比例,输出值漂移几毫伏很正常。我在给学生演示时,经常出现手一靠近R-2R网络,万用表最后一位就开始跳的情况。解决办法很简单:测量时手离开电路板,或者给电路加一个屏蔽壳,金属外壳接地。

最后说说这种分立搭建方式的价值。你买一颗高精度DAC芯片,几秒钟就能输出完美波形,但你不知道内部发生了什么。你亲手搭R-2R,会真切感受到电阻匹配的重要性,知道一个LSB意味着多少伏,也明白了为什么datasheet上要强调INL和DNL这两个指标。以后你做任何涉及DAC的项目,比如音频输出、可调电源、波形发生器、自动测试设备,你脑子里会有一张“电压是怎么变出来的”地图,排查问题的时候,你能直接画框图定位到具体环节。这是我觉得这篇文章最想传递给你的东西。

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

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

立即咨询