|
在小哈公眾號(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è)按鍵:
a3ngv25ormz64024231619.png (60.7 KB, 下載次數(shù): 0)
下載附件
保存到相冊
a3ngv25ormz64024231619.png
2024-9-11 17:23 上傳
鋼琴上88按鍵的頻率如下表所示:
hywfdrepa3z64024231719.png (124.98 KB, 下載次數(shù): 0)
下載附件
保存到相冊
hywfdrepa3z64024231719.png
2024-9-11 17:23 上傳
比如中央C音的標(biāo)準(zhǔn)頻率就是261,在上面表格中就是:音名為C4的按鍵。程序中定義一個(gè)音頻的數(shù)組:
x40knjo333n64024231819.png (142.58 KB, 下載次數(shù): 0)
下載附件
保存到相冊
x40knjo333n64024231819.png
2024-9-11 17:23 上傳
在系統(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。
shca2siriep64024231919.png (12.89 KB, 下載次數(shù): 0)
下載附件
保存到相冊
shca2siriep64024231919.png
2024-9-11 17:23 上傳
要想讓蜂鳴器發(fā)出某個(gè)音只需要讓PWM輸出對(duì)應(yīng)頻率的脈沖即可。網(wǎng)上找個(gè)《愛若琉璃》的簡譜,然后按照對(duì)應(yīng)關(guān)系創(chuàng)建如下樂譜數(shù)組:
jbxbjv4guvi64024232019.png (362 KB, 下載次數(shù): 0)
下載附件
保存到相冊
jbxbjv4guvi64024232019.png
2024-9-11 17:23 上傳
節(jié)拍的確定節(jié)拍就是一個(gè)音持續(xù)的時(shí)間,這里就是PWM脈沖持續(xù)的時(shí)間,那么持續(xù)的時(shí)間如何確定呢?
p5xb5qgymvs64024232119.png (247.27 KB, 下載次數(shù): 0)
下載附件
保存到相冊
p5xb5qgymvs64024232119.png
2024-9-11 17:23 上傳
基礎(chǔ)知識(shí)算是寫完(抄完)了,那么怎么在程序上實(shí)現(xiàn)呢,王者榮耀達(dá)摩常說的,公式才是永恒的真理,現(xiàn)在理論有了,來,實(shí)現(xiàn)它,干!
2、此次使用的可視化配置工具cubemx,不得不說,基本的配置,用這玩意還是非常省事(懶)的,由于我的蜂鳴器控制引腳接在了PB3上,也即是TIM2-CH2的通道上,配置PB3為TIM2-CH2模式
q1iy5i34w3i64024232219.png (165.28 KB, 下載次數(shù): 0)
下載附件
保存到相冊
q1iy5i34w3i64024232219.png
2024-9-11 17:23 上傳
接下來是最重要的時(shí)鐘配置,宛若人的心臟般,芯片工作的基本,這里選擇的也是配置為了40MHZ,為什么是40MHZ,懶!配置40MHZ剩下的就直接搬運(yùn)小哈的,無非是換個(gè)平臺(tái)啦。
efwhp3qm30164024232320.png (94.84 KB, 下載次數(shù): 0)
下載附件
保存到相冊
efwhp3qm30164024232320.png
2024-9-11 17:23 上傳
然后配置定時(shí)器2的一些參數(shù),和通道2配置為PWM模式,分頻系數(shù)選擇不分頻,周期設(shè)為0,這里只是初始值,即使設(shè)置了,也沒關(guān)系的,后面播放音符的時(shí)候,會(huì)修改的咯,所以這個(gè)不用擔(dān)心具體設(shè)置什么值
raigzubuexn64024232420.png (64.09 KB, 下載次數(shù): 0)
下載附件
保存到相冊
raigzubuexn64024232420.png
2024-9-11 17:23 上傳
這里可以設(shè)置我們代碼生成時(shí)候的一些設(shè)置,第一項(xiàng)是只添加需要的文件,用到哪些庫文件添加那些,我們可以選擇用到的文件添加,第二處是為每個(gè)模塊生成單獨(dú)的.c,.h文件,建議勾選,否則所有的東西都在main函數(shù)里面,代碼可讀性會(huì)比較差,小飛哥是經(jīng)常勾選的。
c3ec2sjcfmo64024232520.png (45.94 KB, 下載次數(shù): 0)
下載附件
保存到相冊
c3ec2sjcfmo64024232520.png
2024-9-11 17:23 上傳
3、代碼解讀
至此我們的配置就完成了,生成代碼就可以啦!TIM2的初始化配置,和我們cubemx配置上一樣的咯,不分頻,周期為0,占空比為0,這些參數(shù)后面會(huì)用到,在進(jìn)行修改
505fkmvkpaw64024232620.png (57.47 KB, 下載次數(shù): 0)
下載附件
保存到相冊
505fkmvkpaw64024232620.png
2024-9-11 17:23 上傳
這里可以看到,配置PB3引腳復(fù)用功能
eiu15hytzsh64024232720.png (37.32 KB, 下載次數(shù): 0)
下載附件
保存到相冊
eiu15hytzsh64024232720.png
2024-9-11 17:23 上傳
在播放音樂的時(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):
y0lrzvccqsc64024232820.png (54.89 KB, 下載次數(shù): 0)
下載附件
保存到相冊
y0lrzvccqsc64024232820.png
2024-9-11 17:23 上傳
大白,小飛哥給你放首音樂,嗨起來,哈哈,連接會(huì)在下面評(píng)論區(qū),歡迎小伙伴們動(dòng)手,干!
歡迎大家關(guān)注 Embeded小飛哥 ,我是小飛哥,讓我快點(diǎn)遇到優(yōu)秀的你,然后一起變得更加優(yōu)秀,加油
jy5pa5hjjwa64024232921.jpg (413.81 KB, 下載次數(shù): 0)
下載附件
保存到相冊
jy5pa5hjjwa64024232921.jpg
2024-9-11 17:23 上傳
! |
|