🔥 一句话速通:DAC就是“数字转模拟的翻译官”,把CPU/单片机的01二进制信号,翻译成能驱动喇叭、电机、仪表的真实电压/电流,没有它,数码设备就发不出声音、控不了硬件!
我们先搞懂一个核心问题:为什么需要DAC?
✅ 电子设备的“大脑”(CPU/MCU)只能处理 数字信号(只有0和1,比如高电平=1,低电平=0);
❌ 但我们需要的是 模拟信号(连续变化的电压/电流,比如喇叭需要渐变电压才能发声,电机需要可调电压控制转速);
💡 所以DAC的作用 = 把“离散的01代码”,翻译成“连续的真实信号”,相当于数码设备和物理世界的“桥梁”!
🎵 音频播放:手机/声卡的DAC,把数字音乐转成模拟信号,驱动耳机/喇叭出声;
🔧 电机控制:单片机通过DAC输出可调电压,控制电机转速快慢;
📊 仪表显示:DAC输出对应电压,驱动万用表、示波器显示数值;
🔌 可调电源:通过DAC设置电压,实现输出电压精准调节;
📡 信号发生器:生成正弦波、三角波,用于电子实验、设备测试。
不用记复杂公式,用“类比+图文”搞懂核心,新手也能吃透!
简单说:数字值越大,输出的模拟电压越高;数字值越小,输出电压越低,相当于“数字刻度”对应“电压高度”。
举个最常见的例子(12位DAC,参考电压Vref=3.3V):

💡 核心公式(必记,面试常考):$$V_{out} = \frac{数字量}{2^n - 1} \times V_{ref}$$,n是DAC位数(12位就是2¹²=4096,2¹²-1=4095)。
① 硬件DAC(芯片内置,常用)
核心是 R-2R梯形电阻网络(图文示意:一堆固定电阻组成梯形,按数字位切换支路,合成对应电压),特点:精度高、速度快,STM32、51单片机里的DAC都属于这种。
② 软件DAC(PWM伪DAC,低成本)
不用专门硬件,用单片机的PWM占空比模拟平均电压(图文示意:高频开关,导通时间越长,平均电压越高),特点:成本极低、精度差、有纹波,适合对精度要求不高的场景(比如简单LED调光)。
📌 位数(8/10/12/16位):位数越高,电压越细腻(12位比8位多4096-256=3840个电压等级);
📌 分辨率:最小可变化的电压(比如12位+3.3V,分辨率=3.3V/4095≈0.8mV);
📌 参考电压Vref:决定输出电压范围(Vref=3.3V,输出0~3.3V;Vref=5V,输出0~5V);
📌 建立时间:切换到目标电压的速度(越快,越适合高频信号输出);
📌 单调性:数字量增大时,输出电压必须只增不减(保证输出稳定,不跳变)。
不管是STM32、51还是其他MCU,DAC配置都逃不开这7步,每一步都标清“做什么+为什么”,新手直接照做!
第一步:开启时钟(给硬件“通电”)✅ 操作:使能DAC外设时钟 + 对应GPIO端口时钟;💡 原因:STM32的外设默认时钟是关闭的,不开启时钟,DAC和GPIO都无法工作;📌 示例(代码片段):__HAL_RCC_DAC_CLK_ENABLE(); // 开启DAC时钟
第二步:配置GPIO为模拟模式(让电压顺利输出)✅ 操作:将DAC输出引脚(常用PA4=DAC1,PA5=DAC2)配置为“模拟模式”,不上拉、不下拉;💡 原因:模拟信号需要纯净的通路,数字模式会有干扰,模拟模式能避免信号失真;📌 示例(代码片段):GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; // 模拟模式
第三步:初始化DAC核心参数(给DAC“定规则”)✅ 操作:配置3个关键参数:
通道选择:DAC1或DAC2(根据引脚选择);
触发方式:软件触发(手动控制输出)、定时器触发(自动周期性输出)、外部触发;
输出缓冲:开启(让输出电压更稳定);
第四步:设置参考电压(确定输出范围)✅ 操作:选择参考电压来源,常用两种:
VREF+:外部参考电压(精度高,适合对电压要求高的场景);
VDDA:芯片电源(常用3.3V,简单方便,适合普通场景);
第五步:启动DAC(让DAC开始工作)✅ 操作:使能DAC外设 + 使能对应通道;💡 原因:前面都是配置,不启动,DAC不会输出任何电压;📌 示例(代码片段):HAL_DAC_Start(&hdac, DAC_CHANNEL_1); // 启动DAC1通道
第六步:输出电压(两种方式,按需选择)✅ 方式1:软件直接设置值(输出固定电压,简单常用);📌 示例:HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2048); // 输出1.65V✅ 方式2:定时器+DMA自动输出(输出连续波形,进阶常用);📌 用途:生成正弦波、三角波(做信号发生器、音频输出),无需CPU干预,解放算力。
第七步:验证输出(确保配置正确)✅ 操作:用示波器测量DAC输出引脚,看电压是否符合预期;💡 排查:若没有输出,检查时钟是否开启、GPIO模式是否正确、DAC是否启动。

1. DAC = 数字转模拟,核心是“01→电压”的映射,是数码设备和物理世界的桥梁;
2. 关键参数:位数(决定细腻度)、Vref(决定输出范围);
3. 配置流程:时钟→GPIO→DAC参数→Vref→启动→输出→验证;
4. 新手先学软件输出固定电压,进阶学DMA+定时器输出波形。
💡 补充:如果是51单片机,配置逻辑一致,只是代码语法不同;STM32优先用HAL库,代码可直接复制复用!