蜂鸣器与音调:把定时器的翻转频率变成音高
更新时间:2026-09-12。本文是「集成电路大类 · 芯片设计」**入门层(beginner)**数字逻辑基础第九十一篇。接上一篇舵机同样用定时器,这一篇让它「唱歌」。理解蜂鸣器,就把定时器/PWM、频率和音符的数学关系串了起来。
本文要回答的问题
- 有源蜂鸣器和无源蜂鸣器差在哪?为什么一个只能「嘀」、一个能奏乐?
- 音高(do re mi)和方波频率是什么关系?440Hz 是什么?
- 怎么用一个定时器从音符频率算出重装值?
- 节拍、四分音符、休止符在播放状态机里怎么表达?
- 想更动听,包络和多路混音是怎么回事?
一、有源 vs 无源:谁来产生振荡
- 有源蜂鸣器:内部已带振荡器,通电(直流)就以固定频率发声,数字脚给高/低只能控制响/不响,用于报警、按键提示;
- 无源蜂鸣器:本身只是一个压电陶瓷片或电磁线圈换能器,必须外部喂交变信号才发声,喂什么频率就发什么音高——能奏乐的都是这种。
压电蜂鸣器靠陶瓷片形变发声、耗电小但音色尖锐;电磁蜂鸣器靠线圈驱动振膜、更响但电流较大。无源件一般用方波驱动(数字侧最简单),50% 占空比方波能量最足。
二、音高就是频率:十二平均律
国际标准 A4 = 440Hz。十二平均律里相邻半音频率比为 2^(1/12) ≈ 1.0595,高一个八度频率翻倍。所以从 MIDI/音号 n 算频率:
f = 440 × 2^((n−69)/12)
例如 A4=440Hz,C5(do)≈523Hz,E5≈659Hz,A5=880Hz。要发某个音,就让驱动信号以该频率翻转(方波周期 T=1/f,半周期翻转一次)。
三、用定时器把频率变成重装值
两种常见做法:
- 定时器周期中断翻转 GPIO:定时器半周期
T/2 = 1/(2f)中断一次,在中断里翻转输出脚,得到频率 f 的方波。简单但高音(f 高、中断密)占 CPU; - PWM 硬件 50% 占空比:设 PWM 周期 = 1/f、占空比 50%,硬件直接输出干净方波,改音高只改周期重装值(
reload = 定时器时钟/f),零 CPU 占用,是首选。
把一张「音名→频率→重装值」表存成 ROM(查找表思想),播放时按乐谱索引即可。若要更平滑、更接近音色,可像 DDS那样用相位累加器合成,或用 PWM 加 RC 当简易 DAC 输出衰减包络波形。
四、节拍与播放状态机:什么时候响、响多久
光有音高还不是音乐,要有时值。以 BPM(每分钟拍数)定义一拍时长 拍=60/BPM 秒,四分音符响一拍、八分音符响半拍、全音符四拍;休止符则在该时间段关闭输出。一个小状态机顺序读乐谱数组(每项是音号+时值):
idle → 查表设频率 → 发声计时 → 到点关输出(短暂断音, 区分同音连奏) → 下一个
rest(休止): 不使能输出,仅计时断音时留一个很短的静音间隔,两个相同音才不会黏成一个长音。整首旋律就是「设频率、计拍数、推进索引」的循环,可用定时器节拍驱动、主循环只喂乐谱。
五、音量、和弦与简单音色
- 音量:方波蜂鸣器音量主要靠驱动电压和串阻,数字上可用更低占空比(但压电件对纯方波最响),电磁蜂鸣器电流大要三极管驱动、注意线圈泄放;
- 和弦:单一方波只有基频,想同时发多音可用多路 PWM 各发一个频率后经电阻/运放相加,或用更高采样率的 PWM-DAC/I2S输出叠加好的波形;
- 音色包络:真实乐器每个音有起音(attack)-衰减(decay)-持续(sustain)-释音(release),用一个随时间变化的幅度(PWM 占空比或增益)乘到音上即 ADSR 包络,方波加包络后听感立刻柔和;这些是通往更复杂音频/混合信号的入口。
与现有篇目的衔接
总结
一句话总结:蜂鸣器分两种,有源蜂鸣器内置振荡器、通直流电就发固定音只能做提示,无源蜂鸣器只是压电或电磁换能器、必须由外部喂入一定频率的方波才能发声且频率决定音高,所以奏乐要用无源件;音高与频率按十二平均律对应,以 A4=440Hz 为基准、相邻半音频率比为 2 的 1/12 次方、高八度翻倍(f=440·2^((n−69)/12)),实现上首选定时器 PWM 设成 50% 占空比、周期重装值等于定时器时钟除以音高频率(也可半周期中断翻转 GPIO 但高音占 CPU),把音名到频率到重装值的表放进 ROM 按乐谱索引;节奏由 BPM 定义一拍时长,用「查表设频—发声计时—到点短断音—推进下一音符」的状态机控制四分/八分音符时值、休止符时只计时不使能输出,同音之间留短静音避免黏连;音量靠驱动电压和串阻、电磁件需三极管并泄放线圈能量,和弦用多路 PWM 相加或 PWM-DAC/I2S 输出叠加波形,再给每个音乘上 ADSR 幅度包络就能从刺耳方波变得接近乐器音色,这正是通向 DDS 频率合成和混合信号音频的入门路径。