電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 38|回復(fù): 0
收起左側(cè)

stm32版蜂鳴器播放愛若琉璃

[復(fù)制鏈接]

193

主題

193

帖子

1532

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1532
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-11-20 07:15:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在小哈公眾號(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è)按鍵:

鋼琴上88按鍵的頻率如下表所示:

比如中央C音的標(biāo)準(zhǔn)頻率就是261,在上面表格中就是:音名為C4的按鍵。程序中定義一個(gè)音頻的數(shù)組:


在系統(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對應(yīng)數(shù)組的起始索引為63。


要想讓蜂鳴器發(fā)出某個(gè)音只需要讓PWM輸出對應(yīng)頻率的脈沖即可。網(wǎng)上找個(gè)《愛若琉璃》的簡譜,然后按照對應(yīng)關(guān)系創(chuàng)建如下樂譜數(shù)組:

節(jié)拍的確定節(jié)拍就是一個(gè)音持續(xù)的時(shí)間,這里就是PWM脈沖持續(xù)的時(shí)間,那么持續(xù)的時(shí)間如何確定呢?

基礎(chǔ)知識(shí)算是寫完(抄完)了,那么怎么在程序上實(shí)現(xiàn)呢,王者榮耀達(dá)摩常說的,公式才是永恒的真理,現(xiàn)在理論有了,來,實(shí)現(xiàn)它,干!
         2、此次使用的可視化配置工具cubemx,不得不說,基本的配置,用這玩意還是非常省事(懶)的,由于我的蜂鳴器控制引腳接在了PB3上,也即是TIM2-CH2的通道上,配置PB3為TIM2-CH2模式



接下來是最重要的時(shí)鐘配置,宛若人的心臟般,芯片工作的基本,這里選擇的也是配置為了40MHZ,為什么是40MHZ,懶!配置40MHZ剩下的就直接搬運(yùn)小哈的,無非是換個(gè)平臺(tái)啦。

然后配置定時(shí)器2的一些參數(shù),和通道2配置為PWM模式,分頻系數(shù)選擇不分頻,周期設(shè)為0,這里只是初始值,即使設(shè)置了,也沒關(guān)系的,后面播放音符的時(shí)候,會(huì)修改的咯,所以這個(gè)不用擔(dān)心具體設(shè)置什么值

這里可以設(shè)置我們代碼生成時(shí)候的一些設(shè)置,第一項(xiàng)是只添加需要的文件,用到哪些庫文件添加那些,我們可以選擇用到的文件添加,第二處是為每個(gè)模塊生成單獨(dú)的.c,.h文件,建議勾選,否則所有的東西都在main函數(shù)里面,代碼可讀性會(huì)比較差,小飛哥是經(jīng)常勾選的。

3、代碼解讀
至此我們的配置就完成了,生成代碼就可以啦!TIM2的初始化配置,和我們cubemx配置上一樣的咯,不分頻,周期為0,占空比為0,這些參數(shù)后面會(huì)用到,在進(jìn)行修改

這里可以看到,配置PB3引腳復(fù)用功能

  在播放音樂的時(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):


大白,小飛哥給你放首音樂,嗨起來,哈哈,連接會(huì)在下面評論區(qū),歡迎小伙伴們動(dòng)手,干!
      歡迎大家關(guān)注 Embeded小飛哥  ,我是小飛哥,讓我快點(diǎn)遇到優(yōu)秀的你,然后一起變得更加優(yōu)秀,加油

!

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表