资讯详情

DA转换器(DAC)是什么?原理、参数与嵌入式实战全解析

📅 2026/10/15 4:18:40 | 华诺云谱 👁 阅读
DA转换器(DAC)是什么?原理、参数与嵌入式实战全解析
玩嵌入式这些年我经常碰到有人问“我单片机里存的是一堆数字怎么才能让外设听到‘话’” 这个问题的答案很大概率要落到DA转换器身上。DA转换器这个词电子相关专业的朋友肯定不陌生但很多刚开始自学单片机或者做DIY项目的朋友对它始终隔着一层纱知道名字不清楚原理更不知道怎么用。这篇文章就基于项目标题“DA转换器是什么快来一起学习一下吧”把DA转换器从概念到实操完整捋一遍适合电子入门爱好者、刚接触嵌入式开发的新手也适合那些用了很久AD采样、却对DA输出不太熟悉的软件工程师。我会尽量用大白话把原理讲明白再配上实际可参考的配置流程、代码思路和排查经验。别担心这东西没有想象中那么高深搞懂它之后你会发现数字世界和模拟世界之间那扇门其实很容易推开。1. 先搞清楚DA转换器到底是个啥1.1 数字世界和模拟世界的“翻译官”DA转换器全名叫 Digital-to-Analog Converter缩写 DAC中文习惯叫数模转换器。它的任务特别简单输入端给我一串二进制数字输出端给我一个对应的模拟电压。数字信号就是一群“0”和“1”模拟信号则是连续变化的电压值。想象一下你面前有两个世界一个是数字王国里面只有离散的步骤一步一个脚印没有中间状态另一个是模拟世界电压可以像坡面一样丝滑地连续变化。DA转换器就是两个世界之间的翻译官把数字王国的命令“翻译”成模拟世界的电压。用一个生活化的类比来说老式水箱里有个浮球阀水位低了阀门开大水哗哗流水位高了阀门关小水流变细。这就是模拟控制。数字控制则更像你拿一个遥控器去调百叶窗每一档都是固定的开合角度不可能做到无级调节。DA转换器就是那个遥控器里的“档位映射表”你按下一档它就把对应的开合角度告诉你。1.2 AD与DA是一对孪生兄弟既然有DA那自然就有它的反向操作——AD转换器ADC模数转换器。打个比方AD是“录音”把外面连续的声音录成MP3文件存放的是数字样本DA是“播放”把MP3文件里的数字样本还原成声音驱动扬声器发声。在大多数系统里这两个东西是配合出场的先通过ADC把温度传感器采集到的模拟电压变成数字量让单片机判断“当前温度是25.3℃”然后计算出控制量再通过DAC输出一个模拟电压去调整加热器的功率实现对温度的闭环控制。很多刚接触单片机的朋友会觉得单片机里面什么都是数字的为什么还要专门弄一个DA输出模拟电压原因很简单现实世界中的物理量比如声音、温度、压力、光照绝大多数都是连续变化的模拟量。你给LED灯调亮度总不会直接用数字脉冲去闪太快让人眼看到闪烁吧真正顺滑的调光需要DAC输出一个稳定的驱动电压或者本身就是模拟调节。音频播放、波形发生器、电机调速、伺服控制这些场景都离不开DA转换器。1.3 DA转换器主要用在哪我简单列一下实际项目中最常碰到的地方波形发生器做函数信号发生器、DDS信号源输出正弦波、三角波、方波靠的就是DAC不停地刷新输出值。音频播放MP3解码之后输出的数字音频流要经过DAC变成模拟音频信号再接功放驱动喇叭或耳机。电机/灯光调速很多调速控制器的本质是通过DAC输出一个参考电压配合功率驱动电路来改变输出功率。可调电源与仪表实验室里的可调直流电源、精密参考源内部都有DAC参与设定输出电压或电流。通信与调制一些模拟调制电路、载波信号生成也需要DAC把基带数字信号转成模拟波形。可以说只要你想让单片机“开口说模拟话”DA转换器就是那根喉舌。理解了它在系统里的位置后面的原理学习就有了方向感。2. 关键参数决定了一颗DA好不好用2.1 分辨率一刀下去切多细DA转换器最核心的参数是分辨率单位是“位bit”。一个N位的DAC能把参考电压范围分成2^N个档位。常见的分辨率有8位、10位、12位、16位。12位DAC意味着输出电压可以被分成4096个台阶。如果你用的参考电压是5V那么理论最小步进电压就是5V ÷ 4096 ≈ 1.22mV这个1.22mV意味着什么呢就好比你拿一把刻度尺去量长度这一把尺的最小刻度是1.22毫伏。如果想让输出精度更高、每个档位更细腻就需要更大的分辨率。16位DAC在同样的5V参考电压下最小步进可以做到约76微伏差不多是12位的1/16。选择分辨率时可不是越大越好。分辨率越高DAC芯片价格越贵输出建立时间往往也越长接口传输的数据量也会变大。如果你只是调个LED亮度8位到10位完全够用人眼基本分辨不出来。但如果是做精密电源、音频设备、高精度信号源12位起步都是保守的高端的会用到16位甚至24位。记住一个原则够用就好把省下来的预算花在参考电压稳定性和PCB布线质量上经常比单纯堆分辨率收益更大。2.2 建立时间与输出更新率分辨率决定了DAC能“分多细”那么建立时间决定的是它“变得有多快”。建立时间是指从输入数字量突变到输出模拟电压稳定在最终值的误差带以内所需要的时间。常见DAC的建立时间从几百纳秒到几十微秒不等。这里有个初学者容易混淆的地方建立时间和输出更新率不是一回事。输出更新率是你能往DAC里写入数据的频率也就是“命令的下发速度”建立时间是DAC把命令“消化落实”到引脚上的速度。如果建立时间太长而你更新得又太快输出波形就会跟不上出现信号失真或幅度衰减。比如你想输出一个20kHz的正弦波每个周期打算采样100个点来还原那就需要每5微秒更新一次DAC。这时候如果DAC建立时间是10微秒就明显不够用波形会严重变形。所以做高速波形输出时一定要把建立时间当成筛选DAC的重要指标。2.3 静态指标更容易被坑除了分辨率还有几个静态指标很容易在实际调试中给人下绊子我也踩过几次首先是差分非线性误差DNL。它描述的是相邻两个数字码对应的模拟输出变化量与理想步进的偏差。用尺子来比喻理想情况下每一格刻度都是1.22mV但真实DAC可能这一格是1.3mV下一格是1.1mV这就是DNL。DNL太大会导致某个台阶过大或过小严重时会出现“非单调性”也就是输入数字量增大输出反而减小了。其次是积分非线性误差INL。它衡量的是整体输出曲线偏离理想直线的程度。如果说DNL管的是“局部刻度是否均匀”INL管的是“整把尺子是不是弯了”。音频、测量领域中INL很重要它直接决定输出波形的失真度。还有一个容易被忽视的是温漂。很多DAC芯片出厂时看着挺准一烤机就飘了。参考电压是另一个关键DAC的输出精度上限基本由参考电压决定。哪怕你用的是16位DAC参考电压纹波大、温漂严重最后得到的输出精度也会大打折扣。所以设计时参考电压芯片的选择一定不能省钱这是我反复强调的一点。3. 常见DA实现方式怎么选3.1 经典分立方案R-2R梯形网络在没有便宜集成DAC的年代很多人会用纯电阻搭一个R-2R梯形网络来实现DA转换。这个方案的原理很有意思只有两种阻值一个是R一个是2R通过一堆模拟开关选择把哪些节点接到参考电压或者地最终在输出端得到与数字码成正比的电压。R-2R梯形网络的好处是原理清楚适合教学演示而且速度可以做得很高因为本质上是电阻分压不依赖电容充电。但它的精度完全依赖电阻的精度和模拟开关的导通电阻一致性。如果你用普通1%精度的电阻搭一个12位R-2R后面几位基本都是废的出来波形阶梯又大又不准。我自己在大学实验室做过一次成本不低效果还没有一块几块钱的集成DAC好。所以现在除非是做高端射频或者特殊定制电路一般不太推荐新手去折腾分立R-2R网络。3.2 PWM假DA成本最低的“伪装者”在成本敏感或者MCU没有集成DAC的项目里还有一个非常常见的做法用PWM加上一个RC低通滤波器输出一个平均电压这就是所谓的“PWM-DAC”。本质上它不是真正的DAC而是通过调整占空比让输出的平均值模拟出不同电压。PWM实现DA的原理很好理解一个频率固定的方波占空比从0%到100%变化经过RC低通滤波后高频分量被滤除剩下的就是直流平均电压电压值近似等于参考电压乘以占空比。比如参考电压3.3V占空比50%平均电压就是1.65V。这个方案成本几乎为零用任意MCU的IO口就能做。但代价也很明显输出纹波大、响应速度慢。想要一个稳定的电压RC滤波器的时间常数必须远大于PWM周期这就导致了调节响应非常迟缓。我做过一个温控项目PWM加RC输出的模拟量控制加热器结果温度调节特别迟钝后来还是换了真DAC才解决。如果要快速输出动态波形PWM方案基本不可用它只适合静态或低速调节。3.3 集成DAC与MCU内置DAC现在最常见的两个选择是用MCU内部自带的DAC模块或者外挂一颗SPI/I2C接口的DAC芯片。很多以ARM为内核、定位工业或高性能应用的MCU内部都集成了至少一路12位DAC输出有缓冲器可以直连负载不需要额外加运放。这种内置DAC用起来非常方便配置好寄存器或库函数往数据寄存器里写值即可省掉外部电路。如果MCU没有内置DAC或者你需要更高精度、更多通道就外接DAC芯片。常见的有8位到16位不等接口一般是SPI或I2C也有并口的适合不同的应用场景。外置DAC的好处是精度高、通道多、参考电压可以独立配置缺点是要多占用通信接口PCB布线也多了几根线。我的习惯是能用内置DAC满足需求坚决不加外置芯片毕竟成本、面积、故障率都是实打实的。3.4 三种方案放一起比一比我整理了一个简单对比表做选型时可以快速参考方案精度输出速度成本复杂度适用场景R-2R电阻网络中偏低依赖电阻精度快中高需要精密电阻和开关教学、定制高速场合PWM加RC滤波低且纹波大慢适用于静态极低低LED调光、低速参考电压集成DAC芯片/MCU内置DAC高12位到24位可选快取决于芯片中高低波形发生、音频、精密控制选型逻辑其实分两步先看你需要输出什么样的信号。如果是一段固定电压做设定值PWM方案可能就够了如果是要还原波形、做音频或者高精度控制老老实实上真DAC。再看手上硬件资源MCU带DAC顺手就用不带再看预算和精度需求外挂芯片。4. 动手做个最小的DA输出系统4.1 方案定下来纸上谈兵这么久还是要动手跑一遍才有感觉。这里我以最常见的MCU内置DAC为例手把手过一遍流程。不管你看的是哪个厂家的开发板原理都是通的具体寄存器名、库函数名有差异但思路完全一致。我建议的目标用DAC输出一个正弦波。为什么选正弦波因为它能直观检验DAC的分辨率、建立时间和更新率是否工作正常。如果输出波形光滑连续、没有明显台阶说明DAC工作得不错如果波形上全是毛刺或者台阶感很强后续排查也方便。4.2 初始化与配置思路初始化DAC大致要做几件事打开DAC模块时钟让模块通电工作。把对应的输出引脚配置为模拟模式。这一步很多新手会忘导致引脚默认是复用功能DAC输出根本不生效。选择参考电压源。一般可选内部参考电压或者外部参考电压。内置DAC常用外部VDDA作为参考简单直接。使能DAC输出缓冲器。缓冲器能提高输出驱动能力但也会引入一点零点偏移按需取舍。设置数据格式。12位DAC通常有左对齐、右对齐两种这会决定你的数据寄存器怎么输入。大概的伪代码如下void dac_init(void) { // 1. 打开时钟使能GPIO和DAC模块 enable_clock_dac(); enable_clock_gpio(); // 2. 配置输出引脚为模拟模式 gpio_set_mode(PIN_A, ANALOG_MODE); // 3. 使能DAC通道使能输出缓冲器 dac_configure(DAC_CHANNEL_1, DAC_ENABLE, DAC_BUFFER_ENABLE); // 4. 选择参考电压源这里用VDDA dac_set_reference(DAC_REF_VDDA); // 5. 准备就绪 dac_ready(); } void dac_write(uint16_t value) { // 写入右对齐的12位数据 dac_set_value(DAC_CHANNEL_1, value 0xFFF); }不同厂商的库函数名字不一样但逻辑高度相似。关键是理解流程别死记函数名。4.3 生成波形数据表DAC本身只是转换器它不知道自己应该“画”什么波形所以波形形状由你喂给它的数据序列决定。要输出正弦波最常见的方法是用查表法。提前算好一个周期的正弦波采样值存成数组然后在主循环里不断往DAC写数据写完一个周期再从数组头开始。比如我想输出约1kHz正弦波每个周期128个采样点那么DAC的更新频率就是128kHz。以12位DAC为例正弦波幅值为参考电压的0到最大值中点放在二分之一参考电压上这样输出波形不会截底或削顶。正弦值计算公式如下value[n] (uint16_t)(2047.5 2047.5 × sin(2πn / N))这里N是每周期采样点数n从0到N-1。中点2047.5对应12位DAC中间值最大振幅也近乎半量程。有了数据表接下来就是设置定时器每隔一段时间触发一次DAC更新或者直接在定时器中断里写DAC数据。直接裸机延时也能跑但波形频率不稳定我实际做的时候是用定时器触发的方式波形更准。uint16_t sine_table[128]; // 预先算好的表 void build_sine_table(void) { for (int n 0; n 128; n) { sine_table[n] (uint16_t)(2047.5f 2047.5f * sin(2.0f * M_PI * n / 128.0f)); } } // 定时器中断服务函数里不断更新DAC void timer_isr(void) { static uint16_t index 0; dac_write(sine_table[index]); index; if (index 128) { index 0; } }这里有个小细节如果不使用查表而是在中断里实时调用sin函数那MCU每计算一次三角函数要好久输出波形会卡顿或产生抖动噪声。查表法用空间换时间把预计算好的数据从ROM或RAM里快速搬运给DAC是波形发生器和高性能DAC应用的标准做法。4.4 用示波器验证配置完成后把示波器探头接到DAC输出引脚。正常的话你会看到一个比较平滑的正弦波。观察几个地方频率是否和设计值接近。波形的幅度是否在合理范围不要削顶。波形上是否有明显毛刺、噪声。波形台阶是否太明显如果太明显说明每周期采样点太少或者分辨率太低。我这里踩过一个很典型的坑我一开始图省事没有使能定时器而是直接在while循环里连续写表结果波形频率忽高忽低示波器上看着像在抖。原因就是主循环里还有别的任务在处理两次更新的间隔不均匀。解决方法是改成定时器驱动或者用DMA把数据表周期性地搬进DAC数据寄存器这才是正规做法。DMA方式下CPU几乎不用管DAC输出波形非常干净。5. 实操中常见的坑与排查清单5.1 输出电压始终比理论值低这是DAC初学者最容易遇见的问题。明明往寄存器写了0xFFF输出不是满幅参考电压而是低了一截比如3.3V参考电压实际只能输出3.0V左右。原因多半是DAC输出缓冲器存在饱和压降或者输出带载能力不足负载把电压拉低了。排查思路先空载测量断开后续负载看看输出是否正常。如果空载还是低考虑是不是缓冲器或输出范围限制。很多DAC的输出并不能完全达到参考电压尤其轨到轨输出芯片输出最高值通常比工作电压低几十毫伏这是正常现象要留出设计余量。如果你需要接近满幅输出可以把参考电压抬高一点或者换支持满幅输出的DAC。5.2 波形上毛刺特别多毛刺一方面来自DAC数字输入信号发生跳变时的电容耦合这被称为“码间毛刺”另一方面来自电源和参考电压的噪声。如果DAC输出端直接连示波器探头探头本身的寄生电容也可能影响波形看起来就有高频尖刺。解决毛刺我总结出三个顺序操作第一在DAC输出引脚对地加一个几十到几百pF的电容滤高频第二DAC电源引脚旁边加上高质量的0.1uF去耦电容并且靠近引脚放置第三如果用的是外置DAC串行时钟线的布线和地线回路要处理好避免数字噪声干扰模拟输出。还有一个容易被忽略的点示波器探头接地线不要用长鳄鱼夹地回路太大反而会引入更大的噪声我建议使用接地弹簧或就近接地。5.3 输出无法真正归零另一个典型问题是明明往DAC写了0输出引脚还有几毫伏到几十毫伏的电压。这主要是DAC的零点误差Offset Error造成的。输出缓冲器内部的运放并非理想器件在输出接近0V时可能存在最低输出电平限制或者内部运放失调电压叠加到了输出上。如果你需要真正的零点以下输出可以考虑第一改用支持低至0V输出的DAC查看手册中的输出电压范围第二电路上加一个很小的负电源或者电平偏移电路把零点偏置调回去。很多时候零点误差在毫伏级对系统影响不大但如果你的系统需要高精度偏置控制就一定要留意这一项。5.4 同一份代码不同板子输出偏差大换了一块板子发现同样的代码输出波形幅度变了或者电压整体偏移了这种问题十有八九出在参考电压上。MCU内置DAC如果以VDDA为参考不同板子的VDDA实际值有细微差异如果VDDA本身纹波大、不稳DAC输出也会跟着漂。我建议在这样的项目里尽量让DAC参考电压与ADC参考电压一致用同一个高精度参考源这样即使参考电压绝对值有偏差DAC和ADC的比例关系也是对的系统的相对精度不受影响。另外如果系统里有DCDC降压供电给模拟电路那DAC输出会明显叠加开关纹波这时候模拟电源和数字电源最好做单点隔离用电感或磁珠简单分离开效果立竿见影。5.5 排查思路小结我平时遇到DAC相关问题习惯按照“供电与参考电压 — 引脚复用配置 — 负载影响 — 软件更新方式”这个顺序从大到小排查大多数问题都能定位现象首选排查方向输出幅度偏低负载是否过重、缓冲器是否饱和波形毛刺电源噪声、PCB走线、探头接地零点偏移器件典型零点误差、是否需要负电源同代码多板结果偏差大参考电压精度与稳定性波形抖动触发更新方式是否稳定、是否被其他任务打断6. 写在最后的个人体会DA转换器这个知识点看起来只是一个元器件的工作原理但吃透它之后你对数字世界和模拟世界的理解会明显不一样。我一开始学的时候也总觉得它就是“写个数值、出来个电压”这么个简单东西直到做音频播放和波形发生项目时才体验到分辨率、建立时间、参考电压这些参数联合起来的复杂度。每次看到示波器上丝滑的正弦波我都会觉得之前在DAC上留下的坑都值了。如果让我给新手一个建议那就是别光看理论趁着手边有带内置DAC的开发板马上动手做一次查表输出波形的实验。哪怕只是输出一个三角波你也能把初始化、寄存器配置、波形表、定时器触发这一套完整跑通。再往后你可以试试增加采样点数量、提高分辨率、加一级运放做信号调理一步步把DAC用得得心应手。最后分享一个小技巧做DAC实验时务必把示波器的垂直档位和带宽限制设置合理很多看起来像芯片问题的“噪声”其实是示波器测量方法不对造成的假象。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑