资讯详情

资讯详情

双通道16位DAC AD5689R精密控制实战:SPI驱动、校准与噪声抑制

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.5V16位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位DACDNL指标写的是正负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.5VVLOGIC的范围是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应该是0VVfull应该是满量程电压。实际测量值和理想值之间的偏差就是零点误差和增益误差。校准公式是这样的假设你想要的输出电压是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供电噪声立刻降下来了。所以如果条件允许数字电源和模拟电源还是分开比较好实在要共用至少要在电源入口处加磁珠或者电感做隔离。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →