前言
本片我們使用PWM輸出不同頻率占空比的信號來驅動喇叭,實現MIDI音樂播放器的Demo。
PWM驅動喇叭原理
PWM驅動喇叭有兩種方法
一種是PWM-ADC方法,即控制PWM占空比實現不同電壓等級的輸出,來模擬DAC的輸出;
一種是控制PWM頻率,直接播放數字MIDI音樂即不同頻率代表不同的音調。
我們這里采用第二種方式來實現音樂播放。
以國際標準音A-la-440HZ為準:
do的頻率為261.6HZ,
re的頻率為293.6HZ,
mi的頻率為329.6HZ,
fa的頻率為349.2HZ,
sol的頻率為392HZ,
la的頻率為440HZ,
si的頻率為493.8HZ。
我們升一個八度則
Do頻率為261.6x2=523.2Hz,其他的類推。
控制PWM頻率就可以輸出上述音調,控制PWM占空比則可對應聲音的大小,播放時間長度則可對應音節時長。
以兩只老虎為例
播放音樂需要三個參數
頻率:beepfrep對應音調
聲音大小: beepduty 占空比
播放時間: beeptime 對應節拍
簡譜中可以看到
2/4拍子 4分音符一拍 每小節2拍
一分鐘76拍。
于是可以定義音調和上述參數如下
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍數76 1分鐘76拍 每拍60/76秒
#2/4 4分音符一拍 每小節2拍
NOTE_4 = (60/METERS) #先定一拍對應的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一個下劃線
NOTE_16 = (NOTE_8/2) # 16分音符 二個下劃線
beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]
beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]
beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]
代碼
完整代碼如下
import time
from machine import Pin, PWM
pwm = PWM(Pin(21))
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍數76 1分鐘76拍 每拍60/76秒
#2/4 4分音符一拍 每小節2拍
NOTE_4 = (60/METERS) #先定一拍對應的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一個下劃線
NOTE_16 = (NOTE_8/2) # 16分音符 二個下劃線
beepfrep = [DO,RE,MI,DO,
DO,RE,MI,DO,
MI,FA,SO,NO,
MI,FA,SO,NO,
SO,LA,SO,FA,MI,DO,
SO,LA,SO,FA,MI,DO,
DO,_SO,DO,NO,
DO,_SO,DO,NO]
beepduty = [400,400,400,400,
400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
400,400,400,400,400,400,
400,400,400,400,400,400,
400,400,400,DUTY0,
400,400,400,DUTY0,
]
beeptime = [NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_16,NOTE_16,NOTE_16,NOTE_16,NOTE_8,NOTE_8,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
NOTE_8,NOTE_8,NOTE_8,NOTE_16,
]
while(1):
for i in range(len(beepfrep)):
pwm.freq(beepfrep[i])
pwm.duty_u16(beepduty[i])
time.sleep(beeptime[i])
測試
接上喇叭,這里使用了功放
PWM使用P21
運行程序
可以聽到演奏的效果,詳細見視頻。
-
播放器
+關注
關注
5文章
397瀏覽量
37409 -
編程
+關注
關注
88文章
3614瀏覽量
93686 -
開發板
+關注
關注
25文章
5032瀏覽量
97371 -
代碼
+關注
關注
30文章
4779瀏覽量
68521 -
單板計算機
+關注
關注
0文章
74瀏覽量
15627 -
編譯
+關注
關注
0文章
657瀏覽量
32852 -
MIDI
+關注
關注
0文章
75瀏覽量
15657 -
ESP32
+關注
關注
18文章
971瀏覽量
17201
發布評論請先 登錄
相關推薦
評論