|
在小哈公眾號(hào)上,公眾號(hào):嵌入式從0到1,小哈用鴻蒙平臺(tái)做了個(gè)播放愛若琉璃歌曲的文章,寫的非常詳細(xì),視頻做的也非常好,伙伴們可以去看看,哈哈,說了這么多,就是為了抄點(diǎn)素材。。。鑒于stm32f103c8t6(便宜好用)平臺(tái)應(yīng)該是比較普遍的了,做個(gè)32版本的,嘿嘿 這次廢話有點(diǎn)多,上干貨!
1、音樂的音調(diào)(音符)和節(jié)拍(摘自小哈公眾號(hào)) 要想實(shí)現(xiàn)一個(gè)樂譜,我們只要確定“音符(音調(diào))”和“節(jié)拍”即可。音調(diào)表示一個(gè)音符響的頻率,節(jié)拍表示一個(gè)音符該唱多長的時(shí)間。
音符(音調(diào))的確定一般鋼琴鍵盤有88個(gè)按鍵:
1cd4tp04cru64017633831.png (60.7 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
1cd4tp04cru64017633831.png
2024-9-18 17:20 上傳
鋼琴上88按鍵的頻率如下表所示:
k3b4ifnayid64017633931.png (124.98 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
k3b4ifnayid64017633931.png
2024-9-18 17:20 上傳
比如中央C音的標(biāo)準(zhǔn)頻率就是261,在上面表格中就是:音名為C4的按鍵。程序中定義一個(gè)音頻的數(shù)組:
qofvlcrvktt64017634031.png (142.58 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
qofvlcrvktt64017634031.png
2024-9-18 17:20 上傳
在系統(tǒng)時(shí)鐘為40MHZ的情況下,輸出的脈沖的最低頻率為:40M / 65535 (下面有計(jì)算方法) ,即 40 * 1000 * 1000 / 65535 = 610.3608758678569?,所以在系統(tǒng)時(shí)鐘40MHZ下,只能產(chǎn)生頻率610Hz以上的音,即D#5及以上的按鍵音,所以我們選擇C6那組按鍵的音作為主音。所以我們預(yù)定義正常音的C6對(duì)應(yīng)數(shù)組的起始索引為63。
vaxnvzehhcz64017634131.png (12.89 KB, 下載次數(shù): 2)
下載附件
保存到相冊(cè)
vaxnvzehhcz64017634131.png
2024-9-18 17:20 上傳
要想讓蜂鳴器發(fā)出某個(gè)音只需要讓PWM輸出對(duì)應(yīng)頻率的脈沖即可。網(wǎng)上找個(gè)《愛若琉璃》的簡譜,然后按照對(duì)應(yīng)關(guān)系創(chuàng)建如下樂譜數(shù)組:
h1hlpf2wzrg64017634231.png (362 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
h1hlpf2wzrg64017634231.png
2024-9-18 17:20 上傳
節(jié)拍的確定節(jié)拍就是一個(gè)音持續(xù)的時(shí)間,這里就是PWM脈沖持續(xù)的時(shí)間,那么持續(xù)的時(shí)間如何確定呢?
gjriek5czzw64017634331.png (247.27 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
gjriek5czzw64017634331.png
2024-9-18 17:20 上傳
基礎(chǔ)知識(shí)算是寫完(抄完)了,那么怎么在程序上實(shí)現(xiàn)呢,王者榮耀達(dá)摩常說的,公式才是永恒的真理,現(xiàn)在理論有了,來,實(shí)現(xiàn)它,干!
2、此次使用的可視化配置工具cubemx,不得不說,基本的配置,用這玩意還是非常省事(懶)的,由于我的蜂鳴器控制引腳接在了PB3上,也即是TIM2-CH2的通道上,配置PB3為TIM2-CH2模式
xuctsiga10o64017634431.png (165.28 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
xuctsiga10o64017634431.png
2024-9-18 17:20 上傳
接下來是最重要的時(shí)鐘配置,宛若人的心臟般,芯片工作的基本,這里選擇的也是配置為了40MHZ,為什么是40MHZ,懶!配置40MHZ剩下的就直接搬運(yùn)小哈的,無非是換個(gè)平臺(tái)啦。
rn0vrnahvju64017634532.png (94.84 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
rn0vrnahvju64017634532.png
2024-9-18 17:20 上傳
然后配置定時(shí)器2的一些參數(shù),和通道2配置為PWM模式,分頻系數(shù)選擇不分頻,周期設(shè)為0,這里只是初始值,即使設(shè)置了,也沒關(guān)系的,后面播放音符的時(shí)候,會(huì)修改的咯,所以這個(gè)不用擔(dān)心具體設(shè)置什么值
en3gaxvr4fs64017634632.png (64.09 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
en3gaxvr4fs64017634632.png
2024-9-18 17:20 上傳
這里可以設(shè)置我們代碼生成時(shí)候的一些設(shè)置,第一項(xiàng)是只添加需要的文件,用到哪些庫文件添加那些,我們可以選擇用到的文件添加,第二處是為每個(gè)模塊生成單獨(dú)的.c,.h文件,建議勾選,否則所有的東西都在main函數(shù)里面,代碼可讀性會(huì)比較差,小飛哥是經(jīng)常勾選的。
lpaxckkrigx64017634732.png (45.94 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
lpaxckkrigx64017634732.png
2024-9-18 17:20 上傳
3、代碼解讀
至此我們的配置就完成了,生成代碼就可以啦!TIM2的初始化配置,和我們cubemx配置上一樣的咯,不分頻,周期為0,占空比為0,這些參數(shù)后面會(huì)用到,在進(jìn)行修改
5qqbqhnisnc64017634832.png (57.47 KB, 下載次數(shù): 1)
下載附件
保存到相冊(cè)
5qqbqhnisnc64017634832.png
2024-9-18 17:20 上傳
這里可以看到,配置PB3引腳復(fù)用功能
cyr3wdeq2hg64017634932.png (37.32 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
cyr3wdeq2hg64017634932.png
2024-9-18 17:20 上傳
在播放音樂的時(shí)候,我們主要通過不斷修改頻率來實(shí)現(xiàn),PWM占空比設(shè)置為50%,占空比通過設(shè)置CCR寄存器的值來控制
PWM頻率計(jì)算:
Fpwm=Ftimclk/(arr+1)*(psc+1)
arr:周期
psc:預(yù)分頻值
比如:
Ftimclk = 40MHZ
arr=399
psc=0
Fpwm = 40/40=100000HZ
TIM2->CCR2 = 199
占空比為50%
代碼實(shí)現(xiàn):
clzfxbrm55h64017635032.png (54.89 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
clzfxbrm55h64017635032.png
2024-9-18 17:20 上傳
大白,小飛哥給你放首音樂,嗨起來,哈哈,連接會(huì)在下面評(píng)論區(qū),歡迎小伙伴們動(dòng)手,干!
歡迎大家關(guān)注 Embeded小飛哥 ,我是小飛哥,讓我快點(diǎn)遇到優(yōu)秀的你,然后一起變得更加優(yōu)秀,加油
vu511kf3fmv64017635132.jpg (413.81 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
vu511kf3fmv64017635132.jpg
2024-9-18 17:20 上傳
! |
|