
目錄1.蜂鳴器的分類 驅(qū)動方式與電路設(shè)計(jì)的差異2.如何使用PWM控制無源蜂鳴器2.1.STM32平臺硬件定時器PWM2.2.hi3516dv300平臺操作系統(tǒng)Linux3.播放《Do-Re-Mi》示例1.蜂鳴器的分類蜂鳴器分為有源蜂鳴器和無源蜂鳴器核心區(qū)別在于其內(nèi)部是否集成了震蕩源這里的“源”指的不是電源而是產(chǎn)生固定頻率信號的電路。有源蜂鳴器內(nèi)部自帶震蕩電路。你只需給它接通直流電源額定電壓它就會立即發(fā)出固定頻率的聲音??梢园阉斫鉃橐粋€“自帶樂譜的演奏者”通電即演。無源蜂鳴器內(nèi)部沒有震蕩源僅包含發(fā)聲元件如電磁線圈或壓電陶瓷片。如果只給它通直流電它不會發(fā)聲或者只能發(fā)出輕微的“咔噠”聲。必須由外部電路提供一個方波信號頻率通常在2K5K Hz之間來驅(qū)動它它才能根據(jù)方波的頻率發(fā)出對應(yīng)的聲音。它就像一個“需要外部樂譜的樂器”。 驅(qū)動方式與電路設(shè)計(jì)的差異這一根本區(qū)別直接導(dǎo)致了它們在電路控制和程序編寫上的不同。特性有源蜂鳴器無源蜂鳴器驅(qū)動信號直流電平高/地電平方波信號PWM脈沖控制復(fù)雜度簡單。程序只需控制一個IO扣輸出高/低電平即可復(fù)雜。程序需要通過PWM或定時器產(chǎn)生特定頻率的方波發(fā)聲頻率固定由內(nèi)部震蕩電路決定可變由外部驅(qū)動方波的頻率決定音調(diào)控制無法控制音調(diào)可以控制通過改變方波頻率可以實(shí)現(xiàn)“Do Re Mi”等不同音階2.如何使用PWM控制無源蜂鳴器使用 PWM 控制無源蜂鳴器核心在于理解PWM 的頻率決定音調(diào)而占空比影響音量。PWM脈沖寬度調(diào)制信號的本質(zhì)就是一個方波。頻率決定音調(diào)PitchPWM的頻率直接對應(yīng)聲音的高低。例如輸出523Hz的方波蜂鳴器就發(fā)出“Do”音輸出587Hz則發(fā)出“Re”音。人耳可聽的頻率范圍大約在20Hz 到 20kHz之間而常用樂音主要集中在262Hz中央C到 1047Hz高音C附近。占空比影響音量VolumePWM信號在一個周期內(nèi)高電平所占的比例就是占空比。通常將占空比設(shè)置為50%可以獲得最大音量輸出。2.1.STM32平臺硬件定時器PWM對于STM32通常需要配置一個通用定時器如TIM3的PWM輸出通道來產(chǎn)生精確的方波。核心步驟是配置預(yù)分頻器Prescaler和自動重裝載寄存器ARR來設(shè)定PWM的頻率并設(shè)置捕獲/比較寄存器CCR來設(shè)定占空比。以標(biāo)準(zhǔn)庫或 HAL 庫的典型配置邏輯為例要產(chǎn)生 1kHz、50% 占空比的 PWM假設(shè)系統(tǒng)時鐘 72MHz預(yù)分頻PSC和ARR共同決定頻率頻率 系統(tǒng)時鐘 /PSC1*ARR1CCR決定占空比占空比 CCR /ARR1通過動態(tài)修改 ARR或PSC的值就可以改變輸出頻率從而演奏不同音符。2.2.hi3516dv300平臺操作系統(tǒng)Linux在 Hi3516DV300 上PWM 控制的關(guān)鍵參數(shù)是周期 (Period)和占空比 (Duty Cycle)。頻率決定音調(diào)PWM 的頻率決定了蜂鳴器發(fā)聲的音高。例如周期為1ms對應(yīng)1kHz的頻率。通過動態(tài)改變周期就能演奏不同音符。占空比影響音量通常設(shè)置為50%可獲得最大音量。Hi3516DV300 的 PWM 支持精細(xì)的占空比調(diào)節(jié)。核心流程是打開PWM設(shè)備 → 配置參數(shù)周期、占空比等 → 使能PWM → (可選) 禁用并關(guān)閉。通過操作寄存器設(shè)置PWM從而控制蜂鳴器①配置引腳復(fù)用將GPIO6_6復(fù)用為PWM0himm 0x111F0024 0x601②初始化PWM0的時鐘源PWM時鐘選擇3MHz打開時鐘PWM0的時鐘源寄存器設(shè)置寄存器值③設(shè)置PWM0的周期輸出523Hz頻率發(fā)出“Do”音占空比為50%周期 系統(tǒng)時鐘 / 頻率 3MHz / 523Hz 5736.1376673040152963671128107075取整5736十六進(jìn)制為0x0001668。高電平配置為5736周期數(shù)×50%占空比2868十六進(jìn)制為0x0000B34。himm 0x12070000 0x0001668④設(shè)置占空比himm 0x12070004 0x0000B34⑤使能PWM0并設(shè)置為連續(xù)輸出模式himm 0x1207000C 0x53.播放《Do-Re-Mi》示例寄存器配置shell腳本#!/bin/sh # 1. 配置 GPIO 復(fù)用 himm 0x111F0024 0x601 # 2. 稍微延時等待硬件穩(wěn)定視情況可選 usleep 10000 # 等待 10ms # Hi3516DV300 PWM1 寄存器直控播放《Do-Re-Mi》片段 # 默認(rèn) PWM 時鐘3MHz # --- PWM1 寄存器地址 --- PWM1_BASE0x12070000 PWM1_CFG0$((PWM1_BASE 0x00)) # 周期寄存器 PWM1_CFG1$((PWM1_BASE 0x04)) # 占空比寄存器 PWM1_CTRL$((PWM1_BASE 0x0C)) # 控制寄存器 # --- 中音頻率表 (Hz) --- NOTE_DO523 NOTE_RE587 NOTE_MI659 NOTE_FA698 NOTE_SO784 NOTE_LA880 NOTE_SI988 NOTE_REST0 # 休止符 PWM_CLK3000000 # 3MHz # --- 核心播放函數(shù) --- # 參數(shù)1: 頻率 (Hz) # 參數(shù)2: 持續(xù)時間 (毫秒) play_note() { freq$1 duration_ms$2 if [ $freq -eq 0 ]; then # 休止符關(guān)閉 PWM 輸出 himm $PWM1_CTRL 0x0 else # 計(jì)算周期拍數(shù): 3,000,000 / freq period$((PWM_CLK / freq)) # 50% 占空比 duty$((period / 2)) # 寫入周期與占空比 himm $PWM1_CFG0 $period himm $PWM1_CFG1 $duty # 使能 PWM1并設(shè)置為連續(xù)輸出模式 (bit01, bit21) himm $PWM1_CTRL 0x5 fi # 延時指定時長 (毫秒)利用 sleep 的小數(shù)點(diǎn)功能 sleep $(awk BEGIN{print $duration_ms/1000}) } # --- 停止 PWM --- stop_pwm() { himm $PWM1_CTRL 0x0 } # --- 旋律數(shù)據(jù): 音符 時值(ms) --- # 旋律片段源自《Do-Re-Mi》經(jīng)典段落: Do Re Mi, Do Re Mi... melody $NOTE_DO 300 $NOTE_RE 300 $NOTE_MI 300 $NOTE_DO 300 $NOTE_RE 300 $NOTE_MI 300 $NOTE_MI 150 $NOTE_FA 150 $NOTE_SO 300 $NOTE_MI 150 $NOTE_FA 150 $NOTE_SO 300 $NOTE_SO 150 $NOTE_LA 150 $NOTE_SI 150 $NOTE_DO 450 $NOTE_REST 200 # --- 主播放循環(huán) --- echo 開始播放 Do-Re-Mi... stop_pwm # 確保初始狀態(tài)為關(guān)閉 # 將旋律字符串按行讀入每兩行組成 (音符, 時值) set -- $melody while [ $# -gt 0 ]; do freq$1 duration$2 shift 2 play_note $freq $duration done stop_pwm echo 播放結(jié)束。