← 返回基础原理库

DAC 输出原理:把数字变回电压,以及 S3 没有它怎么办

最后更新 2026-07-01
⏱ 约 8 分钟 🟢 软件/低风险

你想让单片机吐出一个 1.5V 的模拟电压去驱动一个模拟仪表,或者放一段音乐出来。可 CPU 手里只有整数——它算出来一个 2048,怎么变成引脚上真真切切的 1.65V?这活儿是 ADC 的镜像操作,交给 DAC。一句话先撂这儿:DAC 把数字量还原成模拟电压,是 ADC 的逆过程。 ADC 把连续电压归成整数,DAC 把整数摊回连续电压,一来一回。

DAC 干的是 ADC 反过来的活

DAC = 数模转换器(Digital-to-Analog Converter)。ADC 是"看一眼电压、量化成第几档的整数";DAC 反着来:你给它一个整数(第几档),它就在输出脚上给你摊出对应那一档的电压。

换算逻辑和 ADC 一模一样,只是方向反了:

输出电压 = 数字值 / 满量程档数 × 参考电压

一个 8 位 DAC 有 2⁸ = 256 档(0~255)。参考电压 3.3V 时,你写 128,它输出 128/255 × 3.3 ≈ 1.65V,正好半程。写 0 输出 0V,写 255 输出约 3.3V。位数越高,档分得越细,电压能调得越精。这套换算和 ADC 的 读数/4095×参考电压 是同一个公式,只是一个从电压求整数、一个从整数求电压。

原理:一堆电阻按位加权求和

DAC 内部怎么把整数变成电压?主流是电阻网络加权求和:把输入的每一位(bit)按权重(最高位权重最大、最低位最小)转成对应大小的电流或电压,再全部叠加起来,就是输出。

工程上最常见的实现是 R-2R 梯形网络——只用 R 和 2R 两种阻值的电阻反复搭出梯子状结构,就能精确实现"每高一位、贡献翻一倍"的加权关系。它的妙处是只需两种电阻值、精度好做、易集成,所以集成 DAC 芯片里几乎都是它。原理你知道到这层就够了:DAC = 一组按二进制权重加权的电阻网络,把 bit 求和成电压。

关键:ESP32-S3 没有内置 DAC

这是本篇的命门,务必记牢:ESP32-S3 芯片内部没有 DAC,一路都没有。

老的 ESP32(初代)是有的——它内置两路 8 位 DAC,接在 GPIO25 和 GPIO26 上,你能直接写个值让引脚输出模拟电压。很多老教程、老代码里 dacWrite(25, value) 这种写法就是用它。但到了 ESP32-S3,乐鑫把这两路内置 DAC 砍掉了——S3 主打 AI/向量指令和更多 GPIO,反倒去掉了初代那点简陋的模拟输出(触摸传感器 S3 仍保留,被砍的是 DAC)。这是不同型号的正常取舍,不是坏了。

所以关键结论:在 ESP32-S3 上,你找不到 dacWrite、也没有 dac_output 那类内置 DAC 驱动能用。 拿着初代 ESP32 的 DAC 代码往 S3 上套,必然编译报错或功能缺失——不是你写错了,是这颗芯片压根没这个外设。想要模拟输出,得换路子。

型号 内置 DAC 引脚 位数
ESP32(初代) 有,2 路 GPIO25 / GPIO26 8 位
ESP32-S3 没有
ESP32-C3 / C6 没有

S3 上怎么替代:两条路

内置 DAC 没了,S3 上要模拟输出,看你要"一个可调直流电压"还是"放音频",走不同的路。

路子一:PWM + RC 低通滤波,做"伪 DAC"。 这是最省钱的招,一个引脚一个电阻一个电容就够。原理是:PWM 输出的是高频方波,占空比 50% 时它"平均"下来就是半程电压。你在 PWM 引脚后串一个电阻、对地并一个电容,组成 RC 低通滤波器,把方波的高频成分滤掉,剩下的平均值就是一个平滑的直流电压——占空比调多少,电压就出多少。占空比 0100% 对应输出 03.3V,等效于一个 DAC。

它的适用场景是慢变的模拟电压:调个 LED 亮度基准、给运放一个可调偏置、驱动模拟电压表。局限也明显:RC 滤波有时间常数,电压变化跟不上快信号;纹波和响应速度要对着 RC 取值折中(电容大则平滑但慢、电容小则快但纹波大)。拿它放音频是不行的——带宽和纹波都撑不住。

路子二:外挂专用 I2S DAC 芯片,专治音频。 要出高质量音频,正解是外接一颗音频 DAC,最常见的是 PCM5102(一颗立体声 32 位音频 DAC)。S3 通过 I2S 接口把数字音频流一路串给它,PCM5102 内部完成数模转换,直接输出模拟音频接功放或耳机。

I2S 是专门为数字音频设计的串行接口,传的就是一串串采样值;PCM5102 收到后按采样率还原成模拟波形。这条路才是 S3 播放音乐、语音的标准方案——S3 自己没内置 DAC,但 I2S 接口是齐全的,配一颗外置 DAC 芯片就补齐了音频输出能力。

方案 硬件 适用 不适用
PWM + RC 伪 DAC 1 电阻 + 1 电容 慢变直流电压、偏置、亮度基准 音频、快速变化的信号
外挂 I2S DAC(PCM5102 等) 一颗音频 DAC 芯片 音乐、语音等音频输出 只想要个可调直流(杀鸡用牛刀)

一句话分流:要个能调的直流电压,PWM+RC 伪 DAC 就够;要放音频,老老实实上 I2S DAC 芯片。

伪 DAC 的 RC 怎么取值

PWM+RC 说起来简单,真做起来 R 和 C 不是随便配的。核心是让 RC 低通的截止频率远低于 PWM 频率,才能把方波的高频成分压掉、只剩平均值。截止频率算法是 fc = 1/(2πRC)

举个数:PWM 跑 40kHz,你想纹波足够小,就把截止频率取到 100Hz 左右——比如 R=16kΩ、C=0.1µF,算出 fc≈100Hz,PWM 的 40kHz 成分被压到几乎看不见。但代价立刻来了:时间常数 τ=RC=1.6ms,输出电压要变化时得等好几个 τ(约 5 个才稳),也就是响应慢到几毫秒级。

这就是伪 DAC 绕不开的矛盾:要纹波小,RC 就得大,响应就慢;要响应快,RC 小,纹波就翻上来。 所以它只配做慢变的直流基准,调个亮度、给个偏置够用;真要快速变化的波形(尤其音频),物理上就撑不住,老实上 I2S DAC。想再压纹波又不太牺牲速度,可以串两级 RC,但那是后话。

顺带提一句:PWM 位数越高、伪 DAC 能分的电压档也越细,但高位数会压低 PWM 的可用频率(见 PWM 那篇讲的时钟权衡),滤波又更难做——所以档位、频率、纹波这三头得一起算,不是位数越高越好。

🚧 避坑

别把初代 ESP32 的内置 DAC 代码(dacWrite、GPIO25/26 输出)往 ESP32-S3 上搬——S3 根本没有内置 DAC,编译或功能必然出问题。S3 上要模拟输出:慢变电压用 PWM+RC 伪 DAC,音频用外挂 I2S DAC 芯片(如 PCM5102)。伪 DAC 别指望放音乐,带宽和纹波都不够。

一句话口诀

DAC 是 ADC 反着来——把整数按 数字值/满量程×参考电压 摊回模拟电压,内部靠 R-2R 电阻网络加权求和。记牢 ESP32-S3 没有内置 DAC(初代 ESP32 才有 GPIO25/26 两路 8 位):要慢变直流电压走 PWM+RC 伪 DAC,要放音频走外挂 I2S DAC 芯片

下一步

DAC 的逆过程、把电压读进来的 ADC 建议对照着看,两个换算公式是镜像。伪 DAC 靠的 PWM 原理、外置 DAC 走的 I2S 接口都在各自篇里讲透了。想把 I2S DAC 接起来真放出声音,去 L4 I2S 音频实战。回 元器件原理总览 补齐其余基础。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明