单片机做音频 DAC,本身就是种“硬骨头”。你要是直接扔一个 ADS1235 给终端,那玩意儿在单片机眼里就是个几千块钱的模块,单片机连采样点都跟不上,那叫开挂,根本听不出单片机味儿。
故此,真正的原理得从单片机手里抠出来,看它如何把数字信号串进模拟世界。 起初得理清那个核心矛盾:单片机输出的是离散的数字码,比如 0 代表 0V,1 代表 2.5V,而 DAC 需求的是连续变化的电压波形。
要是直接硬塞,波形肯定断折抽搐。
故此第一步是“量化与插值”,得让采样点充足密,把声音的“颗粒感”抹平。 举个栗子,24 位 ADC 的输入,单片机得把它塞进 20 位的寄存器里。
这时候就要用到“双线性变换”这个老怪了,本质上就是做两个线性插值。先做两个线性插值,把两个间隔化零了的数字点变成数字点,再插值回双线性变换。搞明白了,心里就有底了。 实际上说白了,这就是个把“数”翻译成“电”的翻译官。单片机一发指令,DAC 里的数值表(Vref)就按数字比例拉高电压。
比如数表里写着 127 对应 5V,那 127 就拉满,126 就拉 0.98V 左右。
这个比例关系得在单片机里算得准,不然整个音质就全废了。 那你可能想,单片机输出几个点不就行了,连个波形不造吗?自然可能,但不能“跳”着出,那声音就是打鼓的。你得让它“呼吸”。
这个让呼吸的过程,就是 D/A 转换过程。
要是你只输出 1 个点,那音符就像拨动琴弦,连个余音都带不走;你要是多次输出,那声音就丰满多了。 这就涉及到"R-2R 电阻 ladder"这种经典结构了。在单片机里,这结构一般被压缩成一个 4 位数,但原理还是那个 1 分 3 的技术路线。每个阶段,一个电阻 R 和一个电阻 R/2 并联,最终接一个电阻 R。当输入数字 1 时,电流全体走 R 支路,电压拉满 R;输入 0 时,电流走 R/2 支路,电压为 0。通过这种方式,每一级都能精准地产出对应的电压台阶。 为了不让声音有“锯齿”感,你需求“升采样”这个手段。传统的 DAC 是把每一个采样点都拉成脉冲,但这会害得每个脉冲都挺短,听起来像磁带沙沙的。目前的方案,是在一个采样点里,把信号拉宽、拉长,就连把多个采样点拼成一个个长脉冲。
这样,声音里的低频成分就保住了,高频成分也更丰富了。 再说说抗混叠的难题。
这是个好难题。频谱分析告诉你,为了不让高频串到低频,采样频率起码得是奈奎斯特频率的两倍。在音频领域,这根本上就是 20kHz。
要是你的单片机输出频率能省事过 20kHz,那混叠风险就极低。
实际上目前的专用 DAC 芯片,内部已经把这个“防混叠”的工作干得明明白白,你只管让 ADC 跑得快,剩下的交给芯片。 还有个细节,就是“斜率管住”。声音里的动态范围挺大,从几十微伏的高音到几千伏的低音。单片机要是输出不了如此大的电压,那就得用“斜率管住”。也就是有限幅器,把电压强行限制在某个范围内。
不然声音一下子炸出来,耳朵就受不了。 最终,别光盯着电路结构,还得看如何跟单片机配合。大量单片机自带 DAC,那就要看它的分辨率;外带 DAC,就要看接口是不是同步的。接口同步意味着数字信号和模拟信号启动,务必在一个工夫点刺破,否则耳朵就听不清。 总结一下,单片机做音频 DAC,核心不是电路堆多高,而是“采样率够不够快”、“量化误差能不能忽略”、“波形能不能连续”。把这些点串起来,配合好 R-2R 结构和抗混叠电路,再加上同步接口,你就能在单片机里,把冰冷的数字变成有血有肉的音符了。