首页 / 资讯中心 / 文章详情

DAC数模转换器原理、选型与调试:从R-2R到Delta-Sigma

DAC数模转换器原理、选型与调试:从R-2R到Delta-Sigma ★ FEATURED ARTICLE
数模转换器是个看起来很唬人、其实日常无处不在的小东西。手机里放歌、视频里出声、单片机输出可调电压、示波器画画波形——背后都站着它。这篇文章我打算从一个从业者的实操角度把DA转换器也就是DAC数字模拟转换器的原理、选型和调试经验一次性讲透尤其照顾一下刚入门的朋友保证不从半路开始掉队。1. DA转换器到底是什么它解决什么问题1.1 从一段音乐说起为什么数字世界需要DA转换器你拿出手机放一首歌。歌曲在手机里其实是一串数字44100个采样点每秒每个采样点16位也就是0到65535之间的一个整数。这串数字本身没有任何声音它只是对声波振幅的量化记录。要让耳机振膜动起来我们需要一个连续变化的电压信号——而数字世界里只有离散的0和1。DA转换器就是那座桥它把离散的数字码比如二进制的10110110翻译成连续的模拟电压或电流。这个过程叫数模转换。反过来模数转换器ADC就是另一座桥把现场的模拟信号翻译成数字方便处理和存储。两座桥配合构成了现代电子系统感知和表达世界的闭环。如果只从外观看DA转换器就是一个带数字输入的电压发生器。你告诉它数字值它就在输出端给出对应大小的电压。听起来简单但这里面的设计取舍、误差来源和实际坑比大多数人想象中的要多得多。1.2 核心性能指标别被参数表骗了选DA转换器的时候数据手册里一堆参数我看很多人只看分辨率就下单了这是最容易翻车的地方。几个关键指标必须要会看分辨率一般用N位表示比如8位、12位、16位。它决定了你输出电压能分多少级。8位就是2的8次方256级12位是4096级16位是65536级。分辨率越高输出的阶梯越细。需要注意16位的DA转换器只能保证你有65536个可选代码但每个代码对应的电压是不是精确得看下一条。积分非线性误差INL和微分非线性误差DNL这是很多人忽略的。INL描述实际输出曲线偏离理想直线的程度DNL描述相邻码之间步长的均匀性。16位的高精度DA转换器假如DNL做到1 LSB即最低有效位对应的电压值以上那相邻两个码之间电压跳变就可能不平滑做精密电压源的时候会很难受。建立时间从数字码更新结束到输出稳定到最终值的一定误差带内所需要的时间。控制精度高或者波形刷新快的场景必须关注这个参数。比如你要输出1kHz正弦波每个周期20个点那更新速率至少要20kHz对应建立时间要在50微秒以内这个要求并不高。输出类型电压输出还是电流输出。很多经典芯片是电流输出型需要外面接运放转电压电压输出的直接用方便一些但要关心输出驱动能力和摆率。2. 常见DA转换架构从电阻网络到Delta-Sigma2.1 逐次逼近型和R-2R电阻网络早年间最经典的是R-2R梯形电阻网络。这种网络只用两种阻值R和2R通过开关控制每个支路参与与否在输出端叠加出比例电流。为什么只用两种阻值因为电阻的精度匹配远好于绝对精度——在同一颗芯片上把R和2R的比例做到千分之一以内比把单个电阻的绝对值做准要容易得多。这就是R-2R网络最大的工程智慧。这类架构响应速度快、成本低但是精度受限于电阻匹配度适合8到12位的中低精度应用在很多MCU内部集成的DAC用的就是这种结构。比如某个单片机自带的12位DAC输出0到3.3V理论上可以分辨约0.8毫伏的电压变化做简单的信号输出、可调阈值电平完全够用。2.2 乘法型DAC一个特别实用的变体另一种值得单独聊聊的是乘法型DACMDAC。它的参考电压Vref不是固定的而是可以动态变化的。输出等于Vref乘以数字码的比例Vout Vref × (code / 2^N)。这意味着它可以用作数字控制的电位器或衰减器比如音频系统里控制音量或者在自动增益控制电路里动态调整信号幅度。我实际用过乘法DAC做可编程增益给一个测量仪表的前端做信号调理。运算放大器反馈电阻网络里的衰减系数由DAC控制整体增益精度能做到0.1%以内而且温度漂移很小。要是用分离元件的多级模拟开关加电阻阵列体积和一致性都差很多。2.3 Delta-Sigma型音频世界的霸主Delta-Sigma架构则完全换了个思路。它不做直接的电阻分压而是用非常高的采样率配合一位量化器只有1位输出再通过噪声整形把量化噪声推到高频段最后用模拟低通滤波器滤掉。它靠的是过采样噪声整形这两板斧。这种架构的优势在于线性度极好因为只有一位是模拟量不存在电阻匹配问题。所以在音频、高精度测量领域几乎是统治性的。缺点是需要极高的时钟频率而且在每个采样点上输出的不是精确的电压而是一连串密度分布和信号幅度成正比的脉冲对后面的滤波器要求高。作为一个选型参考做波形发生器、电源控制、电机调速、低速信号源用普通的逐次逼近型或R-2R型就够了玩音频、做高精度、低失真的模拟信号输出Delta-Sigma是绕不开的选择。3. 从0到1搭一个DA输出电路以8位R-2R网络为例3.1 电路设计与参数计算纸上谈兵没意思这里直接上一个可以复现的电路用8位R-2R电阻网络加一个普通运放搭出一个0到5V的DA转换器。总成本不超过二十元却能帮你把原理吃透。选R10kΩ2R20kΩ精度1%的直插电阻。为什么选10k因为在CMOS开关和后续运放之间取得平衡阻值太小电流大功耗高运放驱动吃力阻值太大热噪声和运放偏置电流造成的误差会变明显。10k是个经验值很多教科书喜欢用10k或5k。输出电压理论公式是Vout Vref × (D0/256 D1/128 D2/64 ... D7/128) × (Rf/R)这里Vref是参考电压D0到D7是数字位最低位D0权重1/256最高位D7权重1/2。运放接成反相放大器Rf是反馈电阻。如果取Rf10k则最终输出范围是0到约 -5V反相需要再接一级反相器把极性转正也可以把运放接成同相加法结构省掉反相级但计算要重新推。实操中我建议的方式是第一步先用一个8位并行DA芯片内部自带R-2R网络替代分离电阻网络先跑通逻辑第二步再用分离电阻自己搭对比结果收获会非常大。3.2 单片机控制代码让DAC动起来配合常见的某8位单片机用并行方式向DAC写一个数字码代码很直接。先定端口映射比如P1口的P1.0到P1.7对应D0到D7。然后#include reg52.h #define DAC_PORT P1 // 数字输入连接在P1口 void DAC_Output(unsigned char value) { DAC_PORT value; // 输出8位数据到DA转换器 // 对无锁存类型的DAC数据立即生效 }这里有个重要区别有些DAC芯片带输入锁存器写数据需要一个LOAD信号通常叫CS或者LDAC来把数据锁存到内部寄存器输出才会更新。如果你的电路上电后输出纹丝不动十有八九是忘了给锁存信号一个跳变。下面加一段完整一点的示例输出一个0到5V的线性斜坡电压速度由delay控制。#include reg52.h #define DAC_PORT P1 sbit DAC_CS P3^5; // 片选信号 sbit DAC_LD P3^6; // 锁存信号 void DAC_Write(unsigned char value) { DAC_CS 0; // 选中芯片 DAC_PORT value; // 数据送上总线 DAC_LD 0; // 产生锁存脉冲 DAC_LD 1; DAC_CS 1; // 释放片选 } void delay_ms(unsigned int ms) { unsigned int i, j; for (i 0; i ms; i) for (j 0; j 120; j); } void main(void) { unsigned char val 0; DAC_CS 1; DAC_LD 1; while (1) { DAC_Write(val); // 输出当前电压 delay_ms(5); // 5毫秒步进一次 val; // 每次加1共256步 } }对应电压变化就是每步约5V/256≈19.5mV上升完一个完整斜坡约1.28秒。如果发现波形台阶感明显说明分辨率不够或者滤波不足如果每步之间电压不均匀那就是电阻匹配度或者基准电压稳定度的问题。3.3 整板调试实录我从这几个坑里爬出来的第一次搭这个电路我在面包板上用长跳线连了一堆电阻结果输出波形完全没法看毛刺和噪声大得离谱。排查后原因有三个各位务必提前避开面包板寄生电容和接触电阻R-2R网络对电阻比例敏感面包板氧化触点产生的寄生电阻可能达到几欧姆到几十欧姆对10k级别的电阻网络会造成不小误差。解决方法是换洞洞板焊接电阻引脚尽量短排列整齐。参考电压用得不干净我直接用了单片机开发板的3.3V电源做Vref结果那个电源同时给LED驱动和其他数字逻辑供电一开LED输出的DA电压就跟着抖。后来换成一个独立的低压差线性稳压器单独供电波形立刻安静了。运放选型不对刚开始随手抓了个通用运放带宽不够输出带载稍大就掉电压。做精密DA输出运放要求至少是低失调电压、低偏置电流、足够的带宽和摆率。我后来换成了斩波稳零型运放性能完全够用价格也不高。4. DA转换器真实应用比你想的更广泛4.1 波形发生器用DAC画出正弦波一个很好的练手项目是做一个简易低频信号发生器输出正弦波、三角波、方波。思路就是预先把波形的一个周期采样成若干点存在数组里然后用定时器精确间隔把点逐一送到DAC。以32点正弦波为例先把正弦函数量化成256级unsigned char code sine_table[32] { 128, 152, 175, 196, 214, 228, 238, 244, 245, 242, 234, 222, 206, 187, 166, 143, 121, 98, 77, 58, 43, 30, 22, 18, 20, 27, 40, 58, 79, 101, 123, 144 };上电后DAC输出恒定电压 测试能否用示波器看到步进再用低通滤波器看平滑波形加运放缓冲后测试带载能力。要输出频率为f的正弦波定时器中断频率需要设为32×f。比如想输出1kHz定时器中断就是32kHz。计算定时器初值时要小心晶振频率和定时器分频的关系否则频率会偏。4.2 音视频和自动化从声卡到伺服驱动音频设备是DA转换器最大的消费市场。电脑声卡、手机音频编解码芯片、车载娱乐系统里面的DAC决定了信噪比、动态范围和总谐波失真。你去看一块声卡的参数页面信噪比高于110dB的基本就是Delta-Sigma架构加高性能电源管理的结果。在视频领域DAC用于将数字图像信号转换为模拟RGB或复合视频信号。老式VGA接口的显卡输出部分就有三个高速视频DAC分别对应红绿蓝三色刷新率和分辨率越高DAC所需的更新率也越高。工业控制里DAC同样无处不在伺服驱动器通过DAC把位置误差信号转换为速度环的模拟指令变频器里用DAC产生调制波参考信号可编程电源的核心就是一个高精度DAC再加上模拟调整管电路。4.3 与ADC配合闭环控制系统的左右手很多系统同时需要DAC和ADC。比如一个温控系统传感器温度经过ADC变成数字量MCU跑PID算法得到控制量控制量又要通过DAC变成模拟电压去驱动加热器。这种数字闭环里DAC的建立时间和毛刺会影响控制品质。设计这种系统时我会在DAC输出和驱动级之间加一个RC低通滤波器截止频率设为控制带宽的5到10倍既保证动态响应又能滤掉DAC更新产生的台阶和高频噪声。这个习惯省了我不少事。5. 调试DA转换系统的实用技巧和常见问题速查5.1 电源和地平面教科书不会强调的坑第一类问题几乎都出在电源和地上。数字信号在翻转瞬间会产生很大的电流尖峰如果DAC的模拟部分和数字部分共用一个参考地这个尖峰就会耦合到输出端。处理办法模拟地和数字地单点连接通常是在DAC芯片下方或电源入口处用一个磁珠或0欧电阻隔开DNC数字电源和AVCC模拟电源分别走线各自加去耦电容高精度应用参考电压必须独立稳压避免电源波动直接灌进输出。我在调试一个16位DAC时数字信号一翻转输出端就有几十微伏级别的毛刺。把所有去耦电容尽量贴芯片电源脚、调整地线走向后毛刺立刻降到个位数微伏。5.2 毛刺能量和去毛刺电路DAC更新瞬间内部的模拟开关会短暂导通多个支路产生一个窄脉冲毛刺。毛刺能量通常以pV·s计量数据手册里会写。如果系统对毛刺敏感例如DAC后面直接接一个高精度放大器在输出端并联一个很小的电容如几十pF或者使用专用去毛刺DAC芯片可以有效吸收。5.3 常见问题速查表现象可能原因检查方向输出一直为0或满量程数字接口没写进去、片选/锁存时序不对检查CS/LD脚波形确认代码里时序输出电压偏大或偏小固定比例参考电压不准或电阻比例偏差用万用表测基准和反馈电阻输出波形有大量毛刺数字串扰、电源去耦不足示波器看电源纹波加强去耦相邻码电压跳变不均匀DNL偏差、电阻匹配不达标用高精度万用表记录每个码对应电压输出带载后电压跌落运放驱动能力不足换驱动电流更大的运放更新时输出出现很长过渡斜坡建立了时间超标或运放压摆率不够换高速运放检查数据写入时序5.4 从理论到测量用万用表和示波器验证调DAC系统最少需要三样工具一台台式万用表、一台至少50MHz带宽的数字示波器、一个稳定的直流电源。万用表测直流精度示波器看动态波形和毛刺。校准方法是先测输出短路零码值和满码值画一条理想直线再把中间点逐一测出来和理想值对比误差就能量化。6. 进阶方向到底该选什么类型的DAC6.1 分辨率、速度、精度怎么权衡做选型的时候很多人直接盯着16位这个数字以为越高越好。其实系统瓶颈往往在别的地方。16位的DAC搭配一个噪声5mV的电源低12位完全在噪声里游泳。选型应该按顺序看第一你的系统需要多低的噪声和漂移这决定了参考和电源方案第二更新率需要多高这决定了架构更新率低于1MSPS且精度要求中等的用带内部缓冲的电压输出型DAC最省心更新率几十MSPS的波形合成场景用高速电流输出型DAC加外部运放音频应用直接挑音频专用Delta-Sigma编解码器性能和集成度都最好。6.2 接口选择并口、SPI还是I2C通讯接口是选型时容易忽略的一个点。并口速度快、接线多适合高速数据或MCU并行总线SPI是速度与引脚数的折中几乎所有MCU都有硬件SPI外设I2C就两根线适合低速和传感器融合场景。我个人的建议是除非明确需要并行高速传输否则选SPI接口的DAC。SPI调试最直观逻辑分析仪抓一下波形就知道数据对不对。7. 动手做一个项目用DAC做可调恒流源最后分享一个真实做过的项目思路用12位SPI接口DAC加一个运放和三极管做一个数字控制的可调恒流源。原理很简单DAC输出电压经过运放缓冲驱动三极管的基极射极电阻上的电压跟随DAC输出电流就是Vdac除以射极电阻。这个方案精度取决于两个东西DAC输出稳定度和射极电阻的精度温漂。用的是25ppm的低温漂电阻理论上电流分辨率可以达到1mA左右5V量程、12位、用4.9欧姆电阻算下来约0.5mA每码。实际调试时需要注意三极管的功耗输出电流大、管压降高时要有散热措施否则三极管会烧。这类项目非常适合把DA转换器从纸面上真正拉到手里感受因为它是闭环反馈电路、数模混合、热设计全沾边做一遍下来收获巨大。写在最后的实操体会DA转换器这个东西入门时觉得不就是配个电阻换电压嘛真正做系统才发现它牵一发而动全身电源、基准、布线、运放、时序、温度每一个环节都能让精度打折扣。我个人的体会是学DAC最有效的方式不是背参数表而是亲手搭一次电路拿示波器看波形感受从理想曲线到现实误差之间的距离——那种直观的差距比读十篇教程都管用。如果只是做单片机内部集成的DAC应用把数据手册里的时序图和寄存器配置看透再配合这篇文章里的电源和地线经验基本就够了。如果想往信号链深度走下一步应该去熟悉DAC和ADC的协同工作、锁相环的抖动影响那又是另一个广阔的世界了。
阅读完成 · 觉得有帮助?
咨询建站