news 2026/10/21 20:00:57

12位并行R-2R乘法DAC AD7945原理、时序与实战设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
12位并行R-2R乘法DAC AD7945原理、时序与实战设计

1. 从一颗老芯片说起:为什么12位并行R-2R乘法DAC至今还有人用

搞硬件的人大概都有这种经历:翻看某个工业控制板或者老式仪器的原理图,发现一颗标注着“AD7945ARSZ-B”的芯片,封装不大,引脚不少,翻数据手册一看——12位、并行接口、R-2R架构、乘法DAC。心里第一反应可能是:这年头谁还用并行接口的DAC?SPI/I2C不香吗?

但如果你真的在产线上待过,或者做过需要高速、确定性响应的闭环控制系统,就会明白这类器件为什么一直没被淘汰。AD7945ARSZ-B这颗芯片,核心定位非常清晰:12位分辨率、并行数据接口、R-2R梯形电阻网络、乘法型DAC。它解决的不是“随便输出个模拟电压”的问题,而是“在确定的时钟周期内,把数字码快速、可预测地转换成模拟量,并且支持交流信号乘法运算”的问题。

我第一次接触这类乘法DAC是在一个波形发生器的项目里。当时用SPI接口的DAC做任意波形输出,发现更新率上不去,而且每次写寄存器带来的延迟抖动让输出波形边沿很不干净。后来换成并行接口的乘法DAC,数据直接挂在总线上,片选和写信号一拉,模拟输出立刻响应,确定性好了很多。AD7945ARSZ-B就是这类场景下的典型选择。

这篇文章适合谁看?如果你是电子工程相关专业的学生,正在学DAC原理但搞不清R-2R和乘法DAC到底怎么回事;如果你是嵌入式工程师,第一次拿到这颗芯片不知道怎么下手;或者你是硬件老手,想回顾一下并行DAC在高速场合的用法和坑点——那这篇内容应该能帮到你。我会从架构原理、引脚定义、时序设计、实操电路、代码驱动到常见问题排查,把AD7945ARSZ-B这颗芯片彻底拆开讲一遍。

2. 核心架构拆解:R-2R梯形网络与乘法DAC到底强在哪

2.1 R-2R电阻网络的工作原理

要理解AD7945ARSZ-B,先得把R-2R梯形网络吃透。很多教材讲DAC从权电阻网络开始,但权电阻网络有个致命问题:位数一多,电阻阻值跨度极大,12位的话最大电阻和最小电阻差4096倍,集成电路里根本没法做匹配。R-2R梯形网络用只有两种阻值的电阻(R和2R)就实现了二进制加权,这是它成为主流DAC架构的根本原因。

具体结构是这样的:从参考电压端开始,一串R-2R单元级联,每个节点对应一个比特位。每个2R电阻的一端接节点,另一端根据该位是0还是1决定接地还是接参考电压。由于梯形网络的特性,从任意节点往右看的等效电阻都是R,往左看的等效电阻也是R,这就保证了每个比特位对输出电流的贡献严格按二进制权重分布。

用生活化的类比来说:想象一排分水闸,每个闸门控制一股水流,但每个闸门下游的管道粗细不同,第一道闸门控制一半流量,第二道控制四分之一,第三道八分之一……R-2R网络就是用水管和分流器实现了这种精确的流量分配,而且只用两种规格的水管。

AD7945ARSZ-B内部就是这样的R-2R结构,12个比特位对应12个分支。输出电流公式可以写成:

I_out = (V_ref / R) × (D / 4096)

其中D是12位数字码(0到4095),V_ref是参考电压,R是梯形网络的特征电阻。注意这里V_ref可以是正也可以是负,甚至可以是交流信号——这就是“乘法DAC”名字的由来。

2.2 乘法DAC与普通DAC的本质区别

普通DAC的参考电压是固定的,输出就是数字码乘以一个常数。乘法DAC不一样,它的参考电压输入端可以接受变化的模拟信号,输出等于数字码与参考电压的乘积。用公式表示:

V_out = -V_ref × (D / 4096) (电流输出经运放转换后)

这个“乘法”特性打开了很多应用场景。比如做数字控制增益放大器:把音频信号接到V_ref,数字码控制增益,输出就是幅度可调的音频信号。再比如做模拟乘法器:一个输入接参考端,另一个输入用数字码表示,实现两路信号的相乘。还有波形合成:在V_ref端输入正弦波,数字码按另一路信号变化,输出就是调制后的波形。

普通DAC只能做“数字到模拟”的单向转换,乘法DAC做的是“数字与模拟的乘积”,这是本质区别。AD7945ARSZ-B的乘法带宽典型值在几十kHz到上百kHz量级,具体取决于输出运放的配置和负载,做音频范围内的乘法运算完全够用。

2.3 并行接口为什么在高速场合仍然不可替代

现在大部分DAC都用SPI或I2C接口,引脚少、布线简单。但并行接口有几个SPI给不了的优势:

第一是更新速率。SPI接口受限于时钟频率和协议开销,每次写数据要拉片选、发地址、发数据、拉片选,一套下来至少十几个时钟周期。并行接口把12位数据直接挂在总线上,写信号一拉,数据同时到位,更新延迟就是建立保持时间加上内部锁存延迟,通常在几十纳秒量级。AD7945ARSZ-B的并行接口支持直接与微控制器或DSP的总线对接,写入速度可以做到每秒几百万次更新。

第二是确定性。SPI的传输时间受时钟频率、中断响应、DMA调度影响,每次更新之间的间隔可能有抖动。并行接口的写操作是硬件时序,只要总线周期稳定,更新时刻就是确定的。做闭环控制或者高速波形合成时,这种确定性非常关键。

第三是多通道同步。多颗并行DAC可以共用数据总线,用不同的片选信号分别选通,所有DAC的写信号可以同时拉低,实现多通道同时更新。SPI做多通道同步要复杂得多,需要额外的同步信号或者菊花链配置。

当然并行接口的代价是引脚多、PCB布线占面积。AD7945ARSZ-B是28引脚封装,其中12根数据线、若干控制线、电源和模拟输出,对于引脚紧张的现代设计来说确实不算友好。但在需要高速、确定性、多通道同步的场合,这些引脚换来的性能是值得的。

3. 引脚功能与硬件设计要点:别让细节毁了你的12位精度

3.1 引脚定义速查与关键引脚说明

AD7945ARSZ-B采用28引脚SSOP封装,引脚功能可以分成几组:数据总线DB0-DB11、控制信号CS/WR/LDAC、参考输入VREF、模拟输出IOUT和IOUTB、电源VDD/VSS、以及模拟地AGND和数字地DGND。

数据总线DB0到DB11是12位并行输入,DB0是最低位,DB11是最高位。注意数据格式是直接二进制,不是补码,输入码从0到4095对应输出从0到满量程。控制信号有三个关键引脚:CS是片选,低有效;WR是写信号,上升沿锁存数据;LDAC是DAC锁存控制,用来把输入寄存器的数据传到DAC寄存器。这三个信号的配合方式决定了更新时序,后面会详细讲。

VREF是参考电压输入,这个引脚非常关键。乘法DAC的参考输入阻抗就是R-2R网络的等效阻抗,典型值在几kΩ到十几kΩ之间,而且随数字码变化会有轻微波动。所以驱动VREF的源必须足够低阻抗,否则参考电压会被调制,输出精度直接崩掉。我见过有人直接用电阻分压给VREF,结果输出非线性误差大得离谱,问题就出在分压电阻的戴维南等效阻抗太高。

IOUT和IOUTB是互补电流输出。IOUT输出的是与数字码成正比的电流,IOUTB输出的是互补电流,两者之和恒等于满量程电流。用运放做I-V转换时,通常把IOUT接运放反相输入端,IOUTB接模拟地或者也接运放做差分输出。AD7945ARSZ-B的电流输出建立时间很快,配合高速运放可以做到微秒级甚至更快的更新。

3.2 参考电压源的选择与去耦

参考电压源的选择直接决定输出精度。AD7945ARSZ-B本身不包含参考源,需要外部提供。选择参考源时关注三个参数:初始精度、温度系数和噪声。

初始精度影响绝对输出误差,如果做比例式应用(输出与参考成比例)可以放宽,但做绝对电压输出时至少要0.1%精度。温度系数在工业温度范围(-40到85度)内很重要,假设参考源温漂50ppm/度,温度变化60度就是3000ppm,相当于12位DAC的1.2个LSB,已经不可忽略了。噪声方面,参考源的宽带噪声会直接调制到输出上,做高分辨率应用时要选低噪声参考,并在VREF引脚附近加RC滤波。

去耦电容的配置也有讲究。VREF引脚需要0.1uF陶瓷电容紧贴引脚放置,再并一个10uF钽电容做低频滤波。电源引脚VDD同样需要0.1uF和10uF组合。注意电容的接地端要接到模拟地,不要接到数字地,否则数字噪声会通过地去耦路径串到参考端。

实操心得:我习惯在VREF走线上串一个10Ω电阻,后面跟0.1uF到地,形成一个截止频率约160kHz的低通滤波。这个电阻带来的压降可以忽略(VREF输入电流只有几十微安),但能有效滤掉参考源的高频噪声。注意电阻要用低温漂的金属膜电阻,普通碳膜电阻的温漂会引入额外误差。

3.3 输出运放的选择与I-V转换电路

AD7945ARSZ-B输出的是电流,要得到电压必须用运放做I-V转换。运放的选择要考虑几个指标:输入偏置电流、失调电压、压摆率和增益带宽积。

输入偏置电流会直接叠加到DAC输出电流上造成误差。假设运放偏置电流1nA,DAC满量程电流1mA,误差就是1ppm,可以接受。但如果用偏置电流几十nA的运放,误差就上到几十ppm,12位精度下约0.1到0.2个LSB,勉强能用但不推荐。失调电压的影响更直接,运放失调电压会直接出现在输出端,选失调电压低于100uV的运放比较稳妥。

压摆率和增益带宽积决定了输出建立时间。12位精度要求建立到0.5LSB以内,也就是满量程的0.012%。运放的建立时间要小于DAC更新周期的三分之一,才能保证每次更新后输出稳定。假设更新率100kHz,周期10us,运放建立时间要小于3us。这个要求不算苛刻,大部分通用运放都能满足,但要注意压摆率限制:如果输出跳变2V,压摆率1V/us的运放需要2us才能走完,加上建立尾巴可能就超了。

I-V转换电路的标准接法:运放反相输入端接IOUT,同相输入端接模拟地,反馈电阻R_fb跨接在输出和反相输入端之间。输出电压V_out = -I_out × R_fb。R_fb的选择要权衡:太大则输出噪声增益大、带宽低;太小则输出摆幅不够。假设满量程电流1mA,想要输出0到5V,R_fb取5kΩ。但注意运放输出不能超过电源轨,如果供电是±12V,5V输出没问题。

反馈电容C_fb用来补偿运放的相位裕度,同时限制高频噪声增益。C_fb的值根据运放增益带宽积和R_fb计算,一般取几pF到几十pF。没有C_fb的话,DAC输出电容和运放输入电容可能在环路里形成极点,导致振荡。我一般先在反馈电阻上并一个10pF电容,用示波器看阶跃响应,如果过冲大就加大电容,如果上升沿太慢就减小。

4. 时序设计与驱动实现:把并行接口用到位

4.1 写时序详解与参数计算

AD7945ARSZ-B的写时序核心是三个信号:CS、WR和LDAC。数据手册里的时序图看起来复杂,拆开看其实就两步:第一步把数据锁存到输入寄存器,第二步把输入寄存器的数据传到DAC寄存器。

第一步的时序:CS拉低,数据总线上的12位数据稳定后,WR拉低再拉高,上升沿把数据锁存进输入寄存器。关键参数是数据建立时间(t_DS)和数据保持时间(t_DH),典型值分别是几十纳秒和十几纳秒。WR脉冲宽度(t_WR)最小几十纳秒。这些参数在微控制器总线上很容易满足,只要总线周期不低于100ns就行。

第二步的时序:LDAC拉低再拉高,输入寄存器的内容传到DAC寄存器,模拟输出开始变化。LDAC可以和WR同时操作,也可以分开。分开操作的好处是可以先把数据准备好,然后在精确的时刻用LDAC触发更新,实现多通道同步。

如果不需要同步,最简单的做法是把CS和LDAC都接地,只用WR控制。WR上升沿同时完成锁存和更新,一次写操作就搞定。这种模式下更新率最高,因为省掉了LDAC的额外脉冲。但要注意WR上升沿到输出稳定的时间包括DAC建立时间,数据手册里叫t_S,典型值1us左右。

注意:WR上升沿之后,数据总线上的数据要保持至少t_DH时间才能变化,否则输入寄存器可能锁存到错误数据。很多微控制器的总线在写周期结束后立刻切换数据线,如果t_DH不够就会出问题。解决办法是在WR上升沿后加一个空操作或者延时,确保保持时间满足。

4.2 与微控制器的总线对接方案

AD7945ARSZ-B的并行接口可以直接挂到微控制器的外部存储器总线上。以常见的32位微控制器为例,把DAC的CS接到某个片选信号,WR接到写使能,DB0-DB11接到数据总线的低12位。这样DAC就映射到某个地址空间,写这个地址就等于写DAC。

地址译码要注意:DAC只用了12位数据线,如果微控制器总线是16位或32位,高位数据线悬空或者接固定电平。写操作时微控制器会把整个字写到总线上,DAC只取低12位,高位忽略。但要注意字节序问题,如果微控制器支持字节写,要确保写的是包含低12位的那两个字节。

如果微控制器没有外部总线,可以用GPIO模拟并行时序。12根数据线加CS、WR、LDAC,一共15根GPIO。模拟时序的代码很简单:先把数据写到GPIO端口,拉低CS,拉低WR,延时,拉高WR,拉高CS。更新率取决于GPIO翻转速度和延时精度,一般能做到几十kHz到上百kHz。虽然比硬件总线慢,但对于很多应用已经够了。

用GPIO模拟时有个技巧:把12根数据线分配到同一个GPIO端口的连续引脚上,这样一次写端口寄存器就能更新所有数据线,不需要逐位操作。比如用某款微控制器的GPIOA的0到11脚,写GPIOA->ODR寄存器时把低12位设成数据值,高4位保持不变。这样数据建立时间就是一次寄存器写的时间,非常短且确定。

4.3 代码实现:从初始化到波形输出

下面给出一段基于GPIO模拟的驱动代码示例,用C语言写成,方便移植到不同平台。假设数据线接在GPIOA的0到11脚,CS接GPIOB的0脚,WR接GPIOB的1脚,LDAC接GPIOB的2脚。

// 引脚定义 #define DAC_DATA_PORT GPIOA #define DAC_DATA_MASK 0x0FFF #define DAC_CS_PIN GPIO_PIN_0 #define DAC_WR_PIN GPIO_PIN_1 #define DAC_LDAC_PIN GPIO_PIN_2 #define DAC_CTRL_PORT GPIOB // 写DAC函数,data范围0-4095 void DAC_Write(uint16_t data) { // 把数据放到总线上,保留高4位 DAC_DATA_PORT->ODR = (DAC_DATA_PORT->ODR & ~DAC_DATA_MASK) | (data & DAC_DATA_MASK); // 拉低CS和WR DAC_CTRL_PORT->ODR &= ~(1 << DAC_CS_PIN); DAC_CTRL_PORT->ODR &= ~(1 << DAC_WR_PIN); // 延时,满足WR脉冲宽度 __NOP(); __NOP(); __NOP(); __NOP(); // 拉高WR,锁存数据 DAC_CTRL_PORT->ODR |= (1 << DAC_WR_PIN); // 拉高CS DAC_CTRL_PORT->ODR |= (1 << DAC_CS_PIN); // 如果需要LDAC单独控制,这里拉低再拉高LDAC // DAC_CTRL_PORT->ODR &= ~(1 << DAC_LDAC_PIN); // __NOP(); __NOP(); // DAC_CTRL_PORT->ODR |= (1 << DAC_LDAC_PIN); } // 输出正弦波示例 void DAC_SineOutput(uint16_t amplitude, uint16_t offset, uint32_t freq_div) { static uint16_t phase = 0; // 正弦表,256点,范围0-4095 const uint16_t sine_table[256] = { /* 省略具体数值 */ }; uint16_t index = phase >> 8; // 取高8位作为索引 uint16_t value = (sine_table[index] * amplitude) >> 12; // 缩放 value += offset; // 加偏置 DAC_Write(value); phase += freq_div; // 相位累加 if (phase >= 65536) phase -= 65536; }

这段代码里DAC_Write函数完成了完整的写时序。注意数据写入ODR寄存器时用了读-改-写操作,保留高4位不变,只更新低12位。如果GPIOA的高4位没有其他用途,可以直接赋值。延时用__NOP()实现,具体数量根据微控制器主频和DAC时序要求调整。假设主频72MHz,一个NOP约14ns,4个NOP约56ns,满足大多数情况下的WR脉冲宽度要求。

正弦波输出函数用了查表加相位累加的方式,这是DDS(直接数字合成)的简化实现。sine_table存的是256点正弦值,范围0到4095。amplitude控制幅度,offset控制直流偏置,freq_div控制频率。每次调用DAC_Write输出一个点,调用频率决定输出波形频率。如果定时器中断里调用这个函数,中断频率除以256就是输出正弦波频率。

实操心得:用GPIO模拟并行接口时,WR脉冲的宽度要留足余量。数据手册给的是最小值,实际调试时建议取两到三倍。我遇到过因为WR脉冲太窄导致偶发锁存错误的情况,示波器上看波形完全正常,但输出就是偶尔跳一下。后来把延时加长就稳定了。另外数据线在WR上升沿前后的保持时间也要注意,如果微控制器在函数返回后立刻改数据线,可能在保持时间内就变了,解决办法是在WR拉高后加几个NOP再改数据。

5. 典型应用场景与实战案例

5.1 可编程增益放大器中的乘法DAC用法

乘法DAC最经典的应用之一就是数字控制增益。把模拟信号接到VREF端,DAC的数字码控制增益,输出就是输入信号乘以一个由数字码决定的系数。AD7945ARSZ-B的VREF输入带宽足够处理音频信号,做数字控制音量或者自动增益控制(AGC)非常合适。

具体电路:音频信号经过缓冲运放后接到VREF引脚,注意缓冲运放要能驱动R-2R网络的输入阻抗,并且输出阻抗要低。DAC输出IOUT接I-V转换运放,反馈电阻决定满量程输出。数字码D从0到4095,增益从0到4095/4096。实际使用中增益范围可能不需要到0,可以在软件里限制最小码值。

这个电路的优点是增益控制完全由数字码决定,没有机械电位器的磨损和噪声问题,而且可以实现非常精细的增益步进(12位就是1/4096的分辨率)。缺点是DAC的乘法带宽有限,AD7945ARSZ-B的参考输入带宽在几十kHz量级,做音频全频段(20Hz到20kHz)没问题,但做更高频率的信号处理就不够了。

我在一个音频动态范围压缩的项目里用过这个方案。输入信号先经过峰值检测,微控制器根据峰值调整DAC码值,实现自动增益控制。响应时间取决于微控制器的ADC采样率和DAC更新率,做到毫秒级完全没问题。相比专用的AGC芯片,这个方案灵活得多,增益曲线可以任意编程。

5.2 任意波形发生器中的高速更新

任意波形发生器需要DAC以固定速率输出波形采样点,更新率的稳定性和确定性直接影响输出波形的质量。AD7945ARSZ-B的并行接口配合硬件定时器,可以实现非常稳定的更新时序。

具体做法:用微控制器的一个定时器产生固定频率的中断,中断服务程序里从波形RAM中读取下一个采样点,调用DAC_Write输出。定时器频率就是采样率,波形RAM里存的是预先计算好的波形数据。如果要输出不同频率的波形,可以改变定时器频率,或者保持定时器频率不变,在波形RAM里做抽取或插值。

更新率的理论上限由DAC建立时间和微控制器中断响应时间决定。AD7945ARSZ-B的建立时间约1us,微控制器中断响应加DAC_Write执行时间约1到2us,所以更新率可以做到300kHz到500kHz。实际做下来,200kHz采样率输出正弦波,用示波器看THD(总谐波失真)在-60dB左右,对于12位DAC来说已经接近理论极限了。

注意:高速更新时,DAC输出端的运放压摆率可能成为瓶颈。假设输出满摆幅5V,更新率200kHz,周期5us,运放要在每个周期内完成建立。如果压摆率只有1V/us,5V跳变需要5us,刚好占满整个周期,没有建立时间。所以高速应用要选压摆率至少5V/us的运放,并且输出摆幅不要用满,留出余量。

5.3 多通道同步输出的实现

多颗AD7945ARSZ-B可以共用数据总线和WR信号,每颗的CS单独控制。更新时先把所有DAC的数据分别写入各自的输入寄存器(通过不同的CS选通),然后同时拉低所有DAC的LDAC信号,再同时拉高,所有DAC的输出就在同一时刻更新。

这个方案的关键是LDAC信号的走线要等长,保证所有DAC同时收到更新脉冲。如果走线长度差异大,更新时刻会有偏差,对于高频应用可能造成通道间相位误差。PCB布局时把多颗DAC排成一行,LDAC信号用星型拓扑从同一个驱动点连到每颗DAC,或者用时钟缓冲器分配。

我在一个多通道数据采集系统的激励源部分用过这个方案,四颗DAC分别输出四路相位差90度的正弦波,用来驱动正交解调电路。四路输出的相位一致性直接决定解调精度,用同步更新方案后相位误差控制在0.1度以内,满足系统要求。

6. 常见问题与排查技巧实录

6.1 输出非线性误差大的原因排查

输出非线性是DAC应用中最常见的问题。AD7945ARSZ-B本身线性度很好(INL典型值±0.5LSB),如果实测非线性大,问题通常出在外部电路。

排查顺序:先查参考电压源。用高精度万用表测VREF引脚的电压,在DAC输出不同码值时观察VREF是否稳定。如果VREF随码值变化,说明参考源驱动能力不够,需要换低输出阻抗的参考源或者加缓冲运放。再查输出运放。运放的失调电压和偏置电流会直接造成误差,用示波器或者高精度ADC测量输出,看误差是固定偏移还是随码值变化。固定偏移多半是运放失调,随码值变化可能是运放非线性或者反馈电阻温漂。

还有一个容易被忽略的点:DAC的模拟地和数字地处理。如果AGND和DGND在芯片附近没有单点连接,数字噪声会通过地平面耦合到模拟部分。正确做法是在芯片下方用0欧姆电阻或者磁珠把AGND和DGND连在一起,整个PCB的模拟地和数字地只在这一点汇合。

6.2 输出噪声与毛刺的抑制方法

DAC输出毛刺主要来自两个源头:数字码切换时的电荷注入和运放输入端的电容耦合。R-2R架构在码值切换时,内部开关的电荷注入会导致输出出现尖峰。AD7945ARSZ-B的毛刺能量典型值在几nV·s量级,对于大多数应用可以接受,但如果做高精度直流输出,毛刺会影响后续电路的建立。

抑制毛刺的方法:在DAC输出和运放之间加RC低通滤波。电阻取100Ω到1kΩ,电容取100pF到1nF,截止频率设在DAC更新率的十分之一以下。这样毛刺被滤掉,但输出建立时间会变长。如果更新率不高(比如直流输出),可以用更大的RC。

输出噪声方面,参考电压源的噪声是主要贡献。在VREF引脚加RC滤波,电阻10Ω到100Ω,电容1uF到10uF,截止频率设在几Hz到几十Hz,可以有效滤掉参考源的低频噪声。注意电容要用低漏电流的钽电容或者陶瓷电容,电解电容的漏电流会引入额外误差。

6.3 常见问题速查表

现象可能原因排查方法解决措施
输出完全无变化电源未接通或CS/WR时序错误测电源引脚电压,示波器看WR波形检查电源连接,确认CS和WR极性
输出有固定偏移运放失调电压或参考源偏差测运放输入失调,测VREF实际值换低失调运放,校准参考源
输出非线性大参考源驱动能力不足或地处理不当观察VREF随码值变化,检查AGND/DGND连接加参考缓冲,单点接地
输出噪声大参考源噪声或电源纹波示波器看VREF和VDD纹波加RC滤波,换低噪声参考源
高速更新时波形失真运放压摆率不足或建立时间不够测运放输出阶跃响应换高压摆率运放,降低更新率
多通道更新不同步LDAC走线长度不一致示波器同时看多路LDAC信号等长走线,用时钟缓冲器分配
偶发数据锁存错误WR脉冲太窄或数据保持时间不够示波器看WR和数据线时序加长WR脉冲,增加保持时间

6.4 几个容易踩的坑

第一个坑是参考电压源的输出电流能力。AD7945ARSZ-B的VREF输入电流随码值变化,虽然变化量不大(几十微安),但如果参考源输出阻抗高,这个变化电流会在输出阻抗上产生压降,导致VREF波动。我见过用TL431加电阻分压做参考的方案,TL431本身没问题,但分压电阻取太大(比如100kΩ),戴维南等效阻抗几十kΩ,DAC的输入电流变化直接让VREF波动几个毫伏,12位精度下就是好几个LSB的误差。后来把分压电阻降到1kΩ级别,问题解决。

第二个坑是输出运放的容性负载驱动能力。DAC输出端通常有PCB走线电容和后续电路的输入电容,如果运放不能驱动容性负载,输出会振荡。解决办法是在运放输出和负载之间串一个小电阻(22Ω到100Ω),把容性负载和运放隔离。这个电阻和负载电容形成的极点要远高于运放的单位增益带宽,否则会影响稳定性。

第三个坑是数字接口的电平匹配。AD7945ARSZ-B的数字输入高电平阈值是2.4V(VDD=5V时),如果微控制器是3.3V供电,输出高电平可能只有3.0V左右,勉强超过阈值但余量不大。在温度变化或者电源波动时可能出问题。稳妥的做法是用电平转换芯片,或者选VDD=3.3V供电的DAC型号。如果非要用5V DAC配3.3V控制器,至少要在数据线上加下拉电阻确保低电平可靠,高电平则依赖控制器的输出驱动能力。

第四个坑是LDAC信号的毛刺。如果LDAC信号在传输过程中有毛刺,可能导致DAC意外更新。解决办法是在LDAC走线附近包地,或者加RC滤波(电阻100Ω,电容100pF)。但要注意RC滤波会延迟LDAC信号,多通道同步时所有通道的延迟要一致。

7. 写在最后:一些个人体会

AD7945ARSZ-B这颗芯片我用了很多年,从早期的工业控制板到后来的波形发生器项目,它一直很稳定。12位分辨率在现在来看不算高,但配合并行接口的确定性和乘法DAC的灵活性,在很多场合仍然是最合适的选择。

如果你正在选型,我的建议是:先明确更新率和确定性要求。如果更新率低于10kHz且对时序抖动不敏感,SPI接口的DAC更省引脚。如果更新率高于100kHz或者需要多通道严格同步,并行接口的乘法DAC值得考虑。AD7945ARSZ-B在这类应用中是一个经过验证的选项。

最后分享一个小技巧:调试DAC电路时,先不要急着写复杂的波形输出代码。写一个简单的循环,让DAC从0到4095逐步输出,用万用表或者高精度ADC测量每个码值的输出电压,画成曲线。这条曲线能直接反映DAC的线性度、单调性和噪声水平。如果曲线平滑且单调,说明硬件没问题,可以放心写应用代码。如果曲线有跳变或者台阶,先查硬件再查软件。这个简单的测试能帮你省下很多调试时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 20:00:21

AI重构嵌入式框架实战:从全局变量到结构体封装的架构演进

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 20:00:14

ESO+无模型预测电流控制:PMSM参数失配与扰动抑制实战方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/21 19:58:18

MCP协议详解:模型上下文协议架构与AI工具集成实践

如果你最近在做AI应用集成&#xff0c;或者只是随手配置过几款带智能功能的开发工具&#xff0c;大概率已经碰到过“MCP”这个词。它不是什么产品代号&#xff0c;而是模型上下文协议&#xff08;Model Context Protocol&#xff09;的缩写&#xff0c;一个针对大模型与外部数据…

作者头像 李华
网站建设 2026/10/21 19:58:14

Java内存模型JMM深度解析:从底层原理到并发实战

1. 为什么每本Java书都躲不开JMM 做Java开发多年&#xff0c;一开始我对并发编程的认知基本停留在"用synchronized加锁、用volatile修饰共享变量"这种操作层面。真正被逼着去啃JMM&#xff08;Java Memory Model&#xff0c;Java内存模型&#xff09;&#xff0c;是在…

作者头像 李华
网站建设 2026/10/21 19:58:12

没有证书也能接单:收纳师起步的4步流程

关于整理收纳师&#xff0c;流传最广的一个说法是"要先考证才能接单"。这句话既是真的&#xff0c;也是假的。 真的部分是&#xff1a;这个领域确实存在大量收费培训&#xff0c;名目繁多&#xff0c;从几百元的线上课到几千元的线下集训都有&#xff0c;部分机构还承…

作者头像 李华
网站建设 2026/10/21 19:57:51

图表设计方法论:让架构图与流程图清晰可读的实践指南

很多人画过图表&#xff0c;但真正把图讲清楚的人不多。最近我在整理一个名叫 diagram-design 的图表设计方法论项目&#xff0c;核心目标只有一个&#xff1a;让每一张图在交付之前&#xff0c;能经得起“被认真读一遍”。做这件事是因为我见过太多架构图花里胡哨却看不懂&…

作者头像 李华