用 PWM/PDM 做低成本 DAC:占空比、RC 滤波与音频播放
更新时间:2026-09-19。前置:PWM 生成、ADC 过采样。本文是 DAC 的反向——用数字开关+低通合成模拟电压。
本文要回答的问题
- PWM 占空比怎么变成一个「平均电压」?
- PWM 分辨率、载波频率、音频更新率三者如何相互制约?
- 一阶/二阶 RC 低通怎么选参数,PDM 又好在哪?
- 怎么用定时器+DMA 自动更新占空比播放一段音频?
一、PWM→电压:平均值原理
PWM 输出在 VCC 与 GND 间快速切换,经低通滤掉高频载波后,平均(直流分量)为:
V_avg = VCC × (Ton / Tperiod) = VCC × duty
duty=0 → 0V;duty=0.5 → VCC/2;duty=1 → VCC数字码 D(0..2^n-1)写入比较寄存器即可线性对应电压:V = VCC × D/(2^n)。这是「占空比即 DAC 码」的 D 类/开关式输出。
二、分辨率与频率的三角约束
定时器计数器从 0 数到 ARR,PWM 有 ARR+1 个占空比档:
分辨率 n(档位数=ARR+1)、PWM 载波频率 fpwm、定时器时钟 fclk:
fpwm = fclk / (ARR+1)
有效位数 ENOB ≈ log2(ARR+1)fclk 固定时,分辨率与载波频率矛盾:ARR 越大分辨率越高但 fpwm 越低。要做 8 位、fpwm≥某值,需要足够高的定时器时钟。
音频还涉及更新率(采样率 fs):占空比每个音频采样改一次(如 8/16/44.1kHz),而 PWM 载波必须远高于 fs(通常 ≥ 256×fs),RC 才能在不衰减音频的前提下把载波滤掉——这和 ADC 过采样是对偶关系(OSR=fpwm/fs)。
三、RC 低通滤波器
PWM ──[ R ]──┬──► V_analog
┤
[ C ]
│
GND
截止频率 fc = 1/(2πRC)- 一阶 RC:20dB/十倍频滚降,简单;要把 fc 设在「高于最高音频(如 20kHz)、远低于载波」。
- 二阶 RC(两级 RC 或有源二阶):40dB/十倍频,载波抑制更干净,常用在语音/简单播放。
- fc 选太高→载波啸叫/纹波残留;太低→高频音频被衰减、声音闷。
- 输出通常再接一个电容隔直(音频)或运放缓冲(带负载能力弱,PWM-RC 直接推不动喇叭,需三极管/运放/小喇叭+三极管)。
四、PWM vs PDM(ΔΣ 1-bit)
| PWM | PDM/ΔΣ | |
|---|---|---|
| 输出 | 固定频率、脉宽变化 | 固定速率 1-bit,密度变化 |
| 时钟 | 一个载波周期分 N 档 | 1-bit 时钟可非常高(数 MHz) |
| 频谱 | 谐波集中在载波及其倍频(强离散杂散) | 量化噪声被整形到高频(噪声整形),更易滤、底噪更低 |
| 实现 | 定时器 CCR | ΔΣ 调制器+1-bit 引脚 |
PDM 把噪声推到高频(噪声整形),一个简单 RC 就能获得比 PWM 更高的有效分辨率,是数字音频/麦克风常用方式。
五、定时器+DMA 自动播放
CPU 不能每个采样中断改 CCR(占用高),用定时器更新事件触发 DMA,把音频缓冲里的码依次搬进 CCR:
定时器 ARR=fs 周期更新(或 PWM 载波定时器+DMA 在更新事件搬运)
DMA: mem(buf[]) ──► TIMx_CCRx,循环/正常模式
PWM 输出脚 ──► 二阶RC ──► 隔直电容 ──► 功放/喇叭
播放:设好 ARR/CCR、DMA 地址长度、启动 PWM 与 DMA;播完 DMA 完成中断波形数据预先量化到 CCR 码(8/16 位 PCM 缩放到 0..ARR,加偏置到中点 VCC/2 做 0 电平)。DMA 缓冲同样要注意 cache 一致性。
六、常见的坑
- 载波频率太低:fc 落在可听范围,RC 滤不掉,喇叭有尖锐啸叫。
- 分辨率/频率算错:ARR 太小只有几十档,声音台阶量化噪声大。
- RC 参数不匹配:fc 太低声音发闷,太高纹波大。
- 直接推喇叭:PWM-RC 输出阻抗高/电流不足,需放大级。
- 没加隔直电容(音频):直流分量 VCC/2 灌进喇叭,发热且音圈偏置。
- PCM 码没加中点偏置:负值被截成 0,削波失真。
- CPU 中断喂占空比:抖动(jitter)造成采样不均匀、杂音;应 DMA。
- DMA 双缓冲切换爆音:缓冲接缝处没做环形/乒乓,出现断续咔哒声。
- PWM 与采样定时器不同源/漂移:左右声道或码率漂移,见 时钟控制器。
- 把 PWM 当高精度 DC:没有反馈/运放缓冲时负载变化改变实际电压。
- PWM 引脚未配 mux/驱动:无波形,见 PinMux。
相关与延伸
PWM 基础见 PWM 生成;对偶的过采样量化见 ADC 过采样;精确时基见 定时器/PWM;数字音频接口另见 I2S/PCM。
总结
PWM 做 DAC 的本质是「占空比=平均电压(V=VCC×D/2ⁿ)」,再用 RC 低通把高频载波滤平;它受 fclk=(ARR+1)×fpwm 的分辨率-频率约束,音频要让载波远高于采样率(OSR≥256)并把 RC 截止频率放在音频与载波之间,用定时器更新事件触发 DMA 自动改 CCR 播放加了中点偏置的 PCM;PDM/ΔΣ 用噪声整形把杂散推到高频更易滤、底噪更低——载波可闻啸叫、分辨率不足、缺隔直/放大和 DMA 接缝爆音是四大坑。