前言
本片我們使用PWM輸出不同頻率占空比的信號(hào)來(lái)驅(qū)動(dòng)喇叭,實(shí)現(xiàn)MIDI音樂(lè)播放器的Demo。
PWM驅(qū)動(dòng)喇叭原理
PWM驅(qū)動(dòng)喇叭有兩種方法
一種是PWM-ADC方法,即控制PWM占空比實(shí)現(xiàn)不同電壓等級(jí)的輸出,來(lái)模擬DAC的輸出;
一種是控制PWM頻率,直接播放數(shù)字MIDI音樂(lè)即不同頻率代表不同的音調(diào)。
我們這里采用第二種方式來(lái)實(shí)現(xiàn)音樂(lè)播放。
以國(guó)際標(biāo)準(zhǔn)音A-la-440HZ為準(zhǔn):
do的頻率為261.6HZ,
re的頻率為293.6HZ,
mi的頻率為329.6HZ,
fa的頻率為349.2HZ,
sol的頻率為392HZ,
la的頻率為440HZ,
si的頻率為493.8HZ。
我們升一個(gè)八度則
Do頻率為261.6x2=523.2Hz,其他的類推。
控制PWM頻率就可以輸出上述音調(diào),控制PWM占空比則可對(duì)應(yīng)聲音的大小,播放時(shí)間長(zhǎng)度則可對(duì)應(yīng)音節(jié)時(shí)長(zhǎng)。
以兩只老虎為例
播放音樂(lè)需要三個(gè)參數(shù)
頻率:beepfrep對(duì)應(yīng)音調(diào)
聲音大小: beepduty 占空比
播放時(shí)間: beeptime 對(duì)應(yīng)節(jié)拍
簡(jiǎn)譜中可以看到
2/4拍子 4分音符一拍 每小節(jié)2拍
一分鐘76拍。
于是可以定義音調(diào)和上述參數(shù)如下
DO = 523
RE = 587
MI = 659
FA = 698
_SO = 392
SO = 784
LA = 880
SI = 987
NO = 523
DUTY0 = 0
METERS = 76 #拍數(shù)76 1分鐘76拍 每拍60/76秒
#2/4 4分音符一拍 每小節(jié)2拍
NOTE_4 = (60/METERS) #先定一拍對(duì)應(yīng)的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一個(gè)下劃線
NOTE_16 = (NOTE_8/2) # 16分音符 二個(gè)下劃線
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 #拍數(shù)76 1分鐘76拍 每拍60/76秒
#2/4 4分音符一拍 每小節(jié)2拍
NOTE_4 = (60/METERS) #先定一拍對(duì)應(yīng)的音符 4分音符
NOTE_8 = (NOTE_4/2) # 8分音符 一個(gè)下劃線
NOTE_16 = (NOTE_8/2) # 16分音符 二個(gè)下劃線
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])
測(cè)試
接上喇叭,這里使用了功放
PWM使用P21
運(yùn)行程序
可以聽(tīng)到演奏的效果,詳細(xì)見(jiàn)視頻。
-
播放器
+關(guān)注
關(guān)注
5文章
411瀏覽量
37856 -
編程
+關(guān)注
關(guān)注
88文章
3673瀏覽量
94692 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
5389瀏覽量
100891 -
代碼
+關(guān)注
關(guān)注
30文章
4880瀏覽量
69995 -
單板計(jì)算機(jī)
+關(guān)注
關(guān)注
0文章
82瀏覽量
15863 -
編譯
+關(guān)注
關(guān)注
0文章
674瀏覽量
33599 -
MIDI
+關(guān)注
關(guān)注
0文章
78瀏覽量
15983 -
ESP32
+關(guān)注
關(guān)注
20文章
999瀏覽量
18600
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)

【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】Arduino IDE快速開(kāi)發(fā)體驗(yàn)

【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】MicroPython開(kāi)發(fā)體驗(yàn)


【FireBeetle 2 ESP32-S3開(kāi)發(fā)板測(cè)評(píng)】MIDI音樂(lè)播放器
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】使用PyCharm開(kāi)發(fā)MicroPython體驗(yàn)
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】1、資料獲取、環(huán)境、固件燒寫(xiě)、點(diǎn)燈。
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】時(shí)間顯示 基于ssd1306 I2C 調(diào)用開(kāi)源庫(kù) 事半功倍
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】測(cè)評(píng)1_搭建開(kāi)發(fā)環(huán)境
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】001:開(kāi)箱+搭建Arduino開(kāi)發(fā)環(huán)境
【FireBeetle 2 ESP32-S3開(kāi)發(fā)板體驗(yàn)】在Arduino中充分利用FireBeetle 2 ESP32-S3的16MB Flash做SPIFFS
合宙ESP32-S3開(kāi)發(fā)板特性解讀
新品上市 | 合宙ESP32-S3開(kāi)發(fā)板

Banana Pi 開(kāi)源硬件基于ESP32-S3開(kāi)發(fā)的物聯(lián)網(wǎng)開(kāi)發(fā)板系列

評(píng)論