☰
双通道16位DAC AD5689R精密控制实战:SPI驱动、校准与噪声抑制
2026/10/21 1:07:54 网站建设 项目流程

1. 从一颗芯片说起:为什么双通道16位DAC在精密控制领域这么吃香

搞嵌入式硬件或者精密仪器开发的朋友,对DAC(数模转换器)肯定不陌生。但如果你之前只用过单片机自带的12位DAC,或者玩过那种几块钱的8位DAC模块,第一次接触AD5689RBCPZ-RL7这种双通道16位精密电压输出DAC的时候,大概率会有一种"降维打击"的感觉。这颗芯片在工业控制、自动化测试设备、医疗仪器、精密校准源这些场景里出镜率极高,原因很简单:它把16位分辨率、双通道独立输出、片上基准电压源、SPI接口、微型封装这几个关键需求全部塞进了一颗不到5毫米见方的芯片里。

先给不太熟悉的朋友补个背景。DAC的核心作用就是把数字世界的0和1翻译成现实世界能用的模拟电压或电流。位数决定了翻译的精细程度——8位DAC把参考电压分成256份,12位分成4096份,而16位能分成65536份。假设参考电压是2.5V,16位DAC的最小输出电压步进就是2.5V除以65536,大约38微伏。这个精度意味着你可以用它来精确控制一个激光器的偏置电流、校准一个传感器的零点漂移、或者给一个高精度运放提供可编程的参考电平。

AD5689RBCPZ-RL7这个型号里,"AD"是厂商前缀,"5689"是产品系列编号,"R"代表内置基准电压源,"BCPZ"是封装代码,"RL7"是包装形式。它属于nanoDAC+系列,这个系列主打的就是小封装、低功耗、高精度。双通道意味着你不需要用两颗单通道DAC来做两路独立输出,省了板子面积也省了布线麻烦。内置基准源更是省去了外部基准芯片的设计,对于空间受限的便携式设备来说,这个特性几乎是决定性的。

我最初接触这颗芯片是在一个多通道数据采集与激励系统的项目里。系统需要同时输出两路精密电压来驱动传感器桥路,一路用于激励,一路用于偏置补偿。最开始用的是某款单通道16位DAC加外部基准的方案,结果光是基准源的噪声就折腾了两周。后来换成AD5689R,片上基准的初始精度和温漂指标直接满足需求,PCB面积还缩小了将近三分之一。从那以后,但凡遇到双通道精密电压输出的需求,我第一反应就是翻这颗芯片的数据手册。

这篇文章主要面向有一定嵌入式硬件基础的开发者,比如做过STM32或者类似平台、用过SPI接口外设、能看懂基本时序图的朋友。如果你刚入门也没关系,我会把关键概念用生活化的方式解释清楚。全文会围绕这颗芯片的核心架构、寄存器操作、SPI通信时序、输出配置、校准方法、常见问题排查这几个维度展开,中间会穿插我在实际项目中踩过的坑和总结出来的实操技巧。目标只有一个:让你拿到这颗芯片之后,能快速把电路搭起来、把代码跑通、把电压输出校准到满意的精度。

2. 核心架构与关键参数拆解:16位精度到底意味着什么

2.1 分辨率、INL和DNL:三个容易混淆的精度指标

很多人一看到"16位"就觉得精度一定很高,但实际上位数只是理论上的分辨率,真正决定输出质量的是INL(积分非线性)和DNL(微分非线性)这两个指标。分辨率好比一把尺子上的刻度数量,刻度再多,如果刻度线本身画歪了,量出来的长度照样不准。INL描述的是实际转换曲线与理想直线之间的最大偏差,DNL描述的是相邻两个数字码对应的模拟输出步进是否均匀。

AD5689R的INL典型值是正负2个LSB,最大正负4个LSB。LSB是最低有效位对应的电压,在2.5V参考电压下大约是38微伏。也就是说,最坏情况下输出误差在150微伏左右。这个指标在16位DAC里属于中等偏上水平,对于大多数工业控制和仪器仪表应用完全够用。DNL指标是正负1个LSB,保证了单调性——输入数字码增加时,输出不会反而减小。单调性在闭环控制里极其重要,如果DAC输出不单调,控制系统可能会在某个码值附近来回振荡,永远稳定不下来。

我在一个闭环温控项目里就遇到过DNL不达标导致的振荡问题。当时用的是一颗便宜的12位DAC,DNL指标写的是正负1LSB但实测在某个码值附近跳变超过2LSB,结果PID控制器在那个温度点附近疯狂抖动。换成AD5689R之后问题直接消失。所以选型的时候,别只看位数,INL和DNL才是真正决定系统稳定性的硬指标。

2.2 内置基准源:省事但也要留个心眼

AD5689R的"R"后缀代表它内置了一个2.5V的基准电压源,初始精度正负2毫伏,温漂典型值2ppm每摄氏度,最大5ppm每摄氏度。这个指标相当不错,折算到整个工业温度范围(负40到85摄氏度),基准电压的变化大约在0.6毫伏到1.5毫伏之间。对于16位DAC来说,1毫伏的基准变化对应大约26个LSB的输出偏移,所以在宽温环境下使用内置基准时,输出精度会受到影响。

内置基准的好处显而易见:省一颗外部基准芯片、省一路去耦电路、省PCB面积。但如果你对温漂有极致要求,比如在户外设备或者高精度测量仪器里,建议还是用外部低温漂基准,比如初始精度正负0.05%、温漂1ppm每摄氏度的型号。AD5689R支持外部基准输入,只需要把内部基准关掉,从REF引脚灌入外部基准电压即可。切换逻辑后面讲寄存器配置的时候会详细说。

这里有个实操细节:内置基准的输出引脚上必须接一个0.1微法的陶瓷电容到地,而且这个电容要尽量靠近引脚放置。我见过有工程师为了省事没接这个电容,结果输出噪声大得离谱,还以为是芯片坏了。数据手册上标了"必须"的电容,一个都别省。

2.3 输出放大器配置:增益档位怎么选

AD5689R的输出放大器可以配置成两种增益模式:增益为1或者增益为2。增益为1时,输出电压范围是0到VREF;增益为2时,输出电压范围是0到2倍VREF。如果内置基准是2.5V,增益为1对应0到2.5V输出,增益为2对应0到5V输出。

选择哪个增益档位取决于你的后级电路需要多大的电压摆幅。如果后级是一个单电源供电的运放,输入范围是0到3.3V,那增益为1就够了。如果后级需要0到5V的满量程信号,那就得用增益为2。需要注意的是,增益为2的时候,输出噪声也会被放大两倍,而且输出放大器需要更高的电源电压裕量。芯片的供电电压范围是2.7V到5.5V,如果用增益为2输出5V,供电至少得5.5V,这时候输出已经接近电源轨了,线性度会变差。

我的经验是:能用增益为1就不用增益为2。增益为1时输出放大器的工作条件最宽松,线性度最好,噪声也最低。如果确实需要更大的输出范围,优先考虑换一个更高参考电压的外部基准,而不是靠增益为2硬撑。

2.4 电源与去耦:看似简单实则最容易翻车

AD5689R有两组电源引脚:VDD是模拟电源,VLOGIC是数字接口电源。VDD的范围是2.7V到5.5V,VLOGIC的范围是1.8V到5.5V。VLOGIC的存在是为了让芯片能直接和低电压逻辑(比如1.8V或3.3V的MCU)对接,不需要额外的电平转换芯片。

去耦电容的配置是很多新手容易忽略的地方。VDD引脚需要接一个10微法的钽电容或者陶瓷电容,再并一个0.1微法的陶瓷电容,两个电容都要尽量靠近引脚。VLOGIC引脚同样需要0.1微法的去耦电容。这些电容的作用是滤除电源上的高频噪声,如果省掉或者放得太远,DAC输出上会看到明显的数字馈通噪声——就是SPI通信的时候,输出端会出现周期性的毛刺。

我曾经在一个项目里为了省空间,把VDD的去耦电容放在了板子背面,结果输出噪声比预期高了将近10倍。后来把电容挪到正面、紧贴引脚,噪声立刻降下来了。这个教训告诉我,数据手册上关于去耦电容位置的建议,都是用血泪换来的,别自作聪明。

3. SPI通信与寄存器操作:把数据正确送进芯片

3.1 SPI模式选择与时序要求

AD5689R的SPI接口支持标准SPI模式0和模式1,具体来说就是时钟极性CPOL等于0、时钟相位CPHA等于0或者1。数据在时钟的下降沿被芯片采样,所以MCU应该在时钟的上升沿或者下降沿之前把数据准备好。最高时钟频率是50MHz,但实际使用中建议不要超过25MHz,尤其是在长走线或者高噪声环境下。

每次传输是24位数据:4位命令位加4位地址位加16位数据位。命令位决定操作类型,比如写寄存器、读寄存器、更新输出等。地址位指定操作哪个寄存器。16位数据位就是你要写入的DAC码值或者配置参数。

这里有个容易搞错的地方:AD5689R的SPI数据是MSB优先,也就是最高位先发。如果你用的MCU的SPI外设默认是LSB优先,记得在初始化的时候改成MSB优先。我见过有工程师调了半天输出不对,最后发现是SPI位序设反了,16位数据整个颠倒过来,输出自然乱七八糟。

3.2 命令集与寄存器映射

AD5689R内部有几个关键寄存器:输入寄存器、DAC寄存器和控制寄存器。输入寄存器用来暂存你要写入的DAC码值,DAC寄存器才是真正驱动输出端口的寄存器。这种双缓冲结构的好处是你可以先把两路通道的码值都写进输入寄存器,然后同时更新到DAC寄存器,实现两路输出的同步更新。在多通道系统中,同步更新非常重要,否则两路输出之间会有时间差,可能导致后级电路出现瞬态响应。

命令集包括:写输入寄存器、更新DAC寄存器、写控制寄存器、读back控制寄存器等。写输入寄存器的命令码是0001,更新DAC寄存器的命令码是0010,写控制寄存器的命令码是0100。地址位用来选择通道A、通道B或者两个通道同时操作。

控制寄存器里可以配置的东西包括:基准源选择(内部还是外部)、增益档位(1倍还是2倍)、输出使能、掉电模式等。上电之后,控制寄存器的默认值通常是内部基准开启、增益为1、输出使能。但为了保险起见,建议在初始化代码里显式地写一遍控制寄存器,把所有配置都明确设定好,不要依赖默认值。

3.3 代码实现:从SPI底层到DAC输出

下面以常见的嵌入式平台为例,给出一个简化的驱动代码框架。假设SPI外设已经初始化好,片选引脚用GPIO控制。

// 写输入寄存器并更新DAC输出 void AD5689_SetChannel(uint8_t channel, uint16_t code) { uint8_t txBuf[3]; uint8_t cmd = 0x10; // 写输入寄存器命令 uint8_t addr; if (channel == 0) { addr = 0x01; // 通道A } else { addr = 0x02; // 通道B } // 24位数据:4位命令 + 4位地址 + 16位数据 txBuf[0] = (cmd << 4) | addr; txBuf[1] = (code >> 8) & 0xFF; txBuf[2] = code & 0xFF; CS_LOW(); SPI_Transfer(txBuf, 3); CS_HIGH(); // 发送更新命令,把输入寄存器的值搬到DAC寄存器 txBuf[0] = 0x20 | addr; // 更新DAC寄存器命令 txBuf[1] = 0x00; txBuf[2] = 0x00; CS_LOW(); SPI_Transfer(txBuf, 3); CS_HIGH(); }

这段代码里,code的范围是0到65535,对应输出从0V到满量程。如果你用的是增益为1、内部基准2.5V,那么输出电压就是code除以65536再乘以2.5V。实际使用中,建议把更新命令和写输入寄存器分开,这样你可以先写两个通道的输入寄存器,再用一条更新命令同时更新两路输出。

3.4 时序细节与片选控制

片选信号CS的下降沿启动一次SPI传输,上升沿结束传输并把数据锁存到芯片内部。CS必须在整个24位数据传输期间保持低电平,中间不能拉高,否则芯片会认为传输结束,数据不完整。我见过有工程师用硬件SPI的自动片选功能,结果因为传输间隔设置不对,CS在字节之间跳了一下,导致数据错位。

另外,CS拉高之后建议延时至少10纳秒再开始下一次传输,给芯片内部逻辑留出处理时间。虽然数据手册上标的最小值是几纳秒,但实际使用中留点余量总没错。在高速连续写入的场景下,这个延时不够可能会导致偶发的数据错误,而且这种错误很难复现,排查起来非常痛苦。

4. 输出配置与校准:让电压真正准起来

4.1 上电初始化流程

AD5689R上电之后需要一段稳定时间,数据手册建议等待至少100微秒再开始SPI通信。如果电源上升时间比较慢,比如用了大电容滤波,这个等待时间还要加长。我通常会在初始化代码里加一个1毫秒的延时,确保芯片内部基准和输出放大器都稳定了再开始配置。

初始化流程大致是这样的:先拉高CS,给SPI外设上电,延时1毫秒,然后写控制寄存器配置基准源和增益,再写两个通道的输入寄存器设为零码值,最后发送更新命令让输出归零。这样上电之后两路输出都是0V,不会出现不确定的电压冲击后级电路。

有个细节值得注意:如果系统里还有其他SPI从设备共用总线,确保AD5689R的CS在上电期间保持高电平,否则芯片可能会误接收其他设备的数据。我一般会在CS引脚上加一个10k的上拉电阻,硬件上保证默认状态是高电平。

4.2 零点与满量程校准

即使芯片出厂时已经校准过,实际电路中的零点误差和增益误差还是存在的。零点误差主要来自输出放大器的输入失调电压,增益误差主要来自基准电压的初始精度和输出放大器的增益误差。对于16位精度要求,这两个误差都必须校准。

校准方法很简单:先写入码值0,测量实际输出电压,记为Vzero;再写入码值65535,测量实际输出电压,记为Vfull。理想情况下Vzero应该是0V,Vfull应该是满量程电压。实际测量值和理想值之间的偏差就是零点误差和增益误差。

校准公式是这样的:假设你想要的输出电压是Vtarget,那么实际应该写入的码值code等于(Vtarget减Vzero)除以(Vfull减Vzero)再乘以65535。这个公式同时补偿了零点误差和增益误差,校准之后输出精度可以提升一个数量级。

我在一个精密校准源项目里用这个方法,把输出精度从初始的正负5毫伏提升到了正负0.5毫伏以内。校准的时候要用六位半以上的数字万用表,普通三位半的表分辨率不够,测出来的误差本身就不准。

4.3 温度漂移补偿

如果设备工作在温度变化较大的环境里,即使做了常温校准,温漂还是会引入误差。AD5689R内置基准的温漂是2ppm每摄氏度,输出放大器的失调温漂典型值是1微伏每摄氏度。在负40到85摄氏度的范围内,总漂移可能在几十个LSB左右。

对于温漂要求高的应用,有两个方案:一是用外部低温漂基准,把基准漂移降到1ppm每摄氏度以下;二是在系统里加温度传感器,根据温度实时修正DAC码值。第二个方案需要事先测量出DAC输出随温度变化的曲线,然后在固件里建一个查找表或者拟合公式。

我做过一个户外设备项目,环境温度从负20度到60度变化,用的是内置基准加软件补偿的方案。具体做法是在恒温箱里每隔10度测一组零点值和满量程值,然后用分段线性拟合的方法在固件里做补偿。最终全温区精度控制在正负2毫伏以内,满足系统要求。这个方案比换外部基准省了成本和板子面积,但增加了产线校准的工作量,适合批量不大的产品。

4.4 输出噪声与滤波

AD5689R的输出噪声密度典型值是120纳伏每根号赫兹,在10千赫兹带宽内积分噪声大约是12微伏均方根。这个噪声水平对于16位DAC来说算正常,但如果你的应用对噪声极其敏感,比如驱动一个高分辨率ADC的参考输入,可能还需要加一级RC低通滤波。

RC滤波的截止频率根据你的信号带宽来定。如果DAC输出的是直流或者缓慢变化的信号,截止频率可以设得很低,比如10赫兹,这样能把大部分高频噪声滤掉。如果DAC需要输出快速变化的波形,截止频率就要相应提高。滤波电容建议用C0G或者X7R材质的陶瓷电容,容值在100纳法到1微法之间。电阻不要选太大,否则输出放大器的负载效应会影响精度,一般100欧姆到1千欧姆就够了。

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

5.1 输出一直是零或者满量程

这是最常见的问题,通常有几个原因。第一,SPI通信根本没成功,芯片没收到任何数据。排查方法是先用示波器或者逻辑分析仪抓SPI波形,看CS、SCK、MOSI三个信号是否正常。重点看CS在传输期间是否一直保持低电平,SCK是否有24个完整的时钟脉冲。第二,控制寄存器配置错误,比如基准源被关掉了但没接外部基准,或者输出被设成了掉电模式。第三,增益档位设错了,导致输出电压范围不对。

我遇到过一次输出一直是零的情况,查了半天发现是SPI的时钟极性设反了。芯片在时钟下降沿采样数据,但MCU配置的是上升沿采样,结果数据全部错位。把CPOL和CPHA改过来之后立刻正常。所以调试SPI外设的时候,先用逻辑分析仪确认时序,比盲猜快得多。

5.2 输出有周期性毛刺

如果输出端在SPI通信的时候出现周期性的尖峰或者毛刺,大概率是数字馈通导致的。数字馈通是指SPI信号通过芯片内部的寄生电容耦合到模拟输出端。解决方法有几个:一是降低SPI时钟频率,频率越低馈通越小;二是在输出端加RC滤波;三是优化PCB布局,把SPI走线和模拟输出走线尽量分开,不要平行走线。

还有一个可能的原因是电源去耦不足。如果VDD引脚上的去耦电容容值不够或者位置太远,SPI通信时电源上的瞬态电流会导致电源电压波动,进而影响输出。检查一下去耦电容是否按照数据手册的要求配置了。

5.3 两路输出不一致

双通道DAC的两路输出之间会有微小的差异,这是正常的,因为两个通道的输出放大器是独立的,失调电压和增益误差不可能完全一样。但如果差异很大,比如超过几十毫伏,那就不正常了。可能的原因包括:一路通道的输入寄存器没写对、一路通道的输出被意外关掉了、或者PCB布局不对称导致两路通道的基准电压有差异。

排查方法是分别写入相同的码值,测量两路输出。如果差异在几个LSB以内,属于正常范围,可以通过分别校准来补偿。如果差异很大,先检查寄存器配置,再检查PCB布局。我见过一个案例,两路输出的走线长度差了将近一倍,结果因为走线电阻的差异,输出差了十几毫伏。后来把走线改成对称的,问题就解决了。

5.4 常见问题速查表

现象可能原因排查方法解决措施
输出始终为零SPI通信失败用逻辑分析仪抓波形检查CS、SCK、MOSI时序
输出始终为满量程码值写入错误检查SPI位序改为MSB优先
输出有周期性毛刺数字馈通观察毛刺与SPI的同步关系降低SPI频率、加RC滤波
两路输出差异大寄存器配置不对称分别读取两路配置统一配置、对称布局
输出噪声大去耦电容不足检查VDD和VLOGIC去耦按数据手册配置电容
温漂明显内置基准温漂测量不同温度下的输出外部基准或软件补偿
上电输出不确定初始化顺序不对检查上电流程先配置再使能输出

5.5 几个容易被忽略的实操细节

第一个细节是CS引脚的上下拉。如果MCU的GPIO在上电复位期间处于高阻态,CS可能会浮空,导致芯片误触发。加一个10k上拉电阻到VLOGIC,成本几乎为零,但能避免很多莫名其妙的问题。

第二个细节是SPI的时钟空闲电平。模式0和模式1的空闲电平都是低电平,如果MCU的SPI外设空闲电平设成了高,芯片可能无法正确识别传输起始。初始化的时候确认一下CPOL的设置。

第三个细节是写入速度。虽然芯片支持50MHz的SPI时钟,但如果你在中断里频繁写入DAC,每次写入都要拉低CS、传输24位、拉高CS,这个开销在高速控制循环里可能成为瓶颈。优化方法是把更新命令和写输入寄存器合并,或者用DMA来传输SPI数据,减少CPU占用。

第四个细节是输出端的负载。AD5689R的输出放大器可以驱动2千欧姆以上的负载,如果负载阻抗太低,输出幅度会下降,线性度也会变差。如果必须驱动低阻抗负载,中间加一级缓冲运放。

6. 进阶应用与扩展思路

6.1 多片级联实现更多通道

AD5689R是双通道,如果你需要4通道、8通道甚至更多通道的精密电压输出,可以用多片级联的方式。每片芯片有独立的CS引脚,MCU用不同的GPIO分别控制。SPI的SCK和MOSI可以共用,这样N片芯片只需要N个CS引脚加2根SPI信号线。

级联的时候要注意同步更新问题。如果你需要所有通道同时更新输出,可以把所有芯片的更新命令用同一个GPIO触发,或者用一片芯片的LDAC引脚作为同步信号。AD5689R有一个LDAC引脚,拉低的时候会把输入寄存器的值更新到DAC寄存器。把多片芯片的LDAC引脚连在一起,用一个GPIO控制,就能实现所有通道的同步更新。

6.2 配合运放实现双极性输出

AD5689R的输出范围是0到VREF(单极性),如果你的应用需要负电压输出,比如负5V到正5V,可以在DAC输出后面加一级运放做电平搬移和放大。典型电路是用一个运放构成差分放大器,DAC输出接同相输入端,一个负参考电压接反相输入端,通过调整电阻比例来实现双极性输出。

这个电路的精度取决于电阻的匹配程度和运放的失调电压。电阻建议用0.1%精度的金属膜电阻,运放选低失调、低温漂的精密运放。校准的时候要同时校准正满量程和负满量程两个点。

6.3 在闭环控制中的应用

AD5689R在闭环控制里的典型应用是作为执行器的驱动信号源。比如在温控系统里,DAC输出一个电压给加热器的驱动电路,温度传感器反馈实际温度,控制器根据偏差调整DAC码值。这种应用对DAC的单调性和建立时间有要求。AD5689R的建立时间是5微秒到0.1%精度,对于大多数温度控制回路来说绰绰有余。

在闭环控制里使用DAC时,建议在输出端加一个低通滤波器,截止频率根据控制回路的带宽来定。滤波器的作用是平滑DAC码值变化时的台阶,减少对执行器的冲击。同时,滤波器的延迟也要考虑进控制环路的相位裕度里,截止频率不能设得太低,否则会影响环路稳定性。

6.4 与高分辨率ADC配合做自校准

在一些高精度测量系统里,可以用AD5689R和一颗高分辨率ADC组成自校准回路。DAC输出一个已知电压,ADC测量这个电压,比较测量值和设定值,计算出系统的增益误差和零点误差,然后在固件里做补偿。这种自校准可以在上电时做一次,也可以定期做,消除温漂和长期漂移的影响。

自校准的关键是ADC的精度要高于DAC。如果DAC是16位,ADC至少要是18位或者更高,否则校准的精度不够。另外,校准回路的PCB布局要特别注意,DAC输出到ADC输入的走线要尽量短,避免引入额外的噪声和干扰。

7. 个人实操体会与建议

这颗芯片我用过不下十个项目,从便携式医疗设备到工业自动化控制器都有。最大的感受是:AD5689R是一颗"省心"的芯片,但前提是你把数据手册读透了。它的寄存器配置不算复杂,SPI时序也很标准,但细节特别多,任何一个细节没注意到都可能导致输出不对。

我的建议是,第一次用这颗芯片的时候,先在一块单独的测试板上把基本功能跑通,确认SPI通信正常、输出能随码值变化、两路通道都能独立控制。然后再把电路集成到正式板子上。测试板上可以把所有去耦电容、上拉电阻、滤波电路都加上,方便对比不同配置下的输出效果。

另外,校准这一步千万别省。即使你觉得内置基准的精度已经够了,实际电路中的零点误差和增益误差还是需要校准的。校准花不了多少时间,但能让你的系统精度提升一个档次。校准用的万用表精度至少要比DAC的精度高一位,否则校准本身就不准。

最后说一个我踩过的坑:有一次为了省成本,把VLOGIC和VDD接在了一起,用同一个3.3V电源供电。结果SPI通信的时候,数字开关噪声通过电源耦合到了模拟输出上,输出噪声比预期高了五六倍。后来把VLOGIC单独用一路LDO供电,噪声立刻降下来了。所以如果条件允许,数字电源和模拟电源还是分开比较好,实在要共用,至少要在电源入口处加磁珠或者电感做隔离。

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

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

立即咨询