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

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

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

stm32版蜂鳴器播放愛若琉璃

[復(fù)制鏈接]

193

主題

193

帖子

1532

積分

三級會員

Rank: 3Rank: 3

積分
1532
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-11-20 07:15:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
在小哈公眾號上,公眾號:嵌入式從0到1,小哈用鴻蒙平臺做了個播放愛若琉璃歌曲的文章,寫的非常詳細(xì),視頻做的也非常好,伙伴們可以去看看,哈哈,說了這么多,就是為了抄點(diǎn)素材。。。鑒于stm32f103c8t6(便宜好用)平臺應(yīng)該是比較普遍的了,做個32版本的,嘿嘿 這次廢話有點(diǎn)多,上干貨!
1、音樂的音調(diào)(音符)和節(jié)拍(摘自小哈公眾號) 要想實(shí)現(xiàn)一個樂譜,我們只要確定“音符(音調(diào))”和“節(jié)拍”即可。音調(diào)表示一個音符響的頻率,節(jié)拍表示一個音符該唱多長的時間。

音符(音調(diào))的確定一般鋼琴鍵盤有88個按鍵:

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

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


在系統(tǒng)時鐘為40MHZ的情況下,輸出的脈沖的最低頻率為:40M / 65535 (下面有計算方法) ,即 40 * 1000 * 1000 / 65535 = 610.3608758678569?,所以在系統(tǒng)時鐘40MHZ下,只能產(chǎn)生頻率610Hz以上的音,即D#5及以上的按鍵音,所以我們選擇C6那組按鍵的音作為主音。所以我們預(yù)定義正常音的C6對應(yīng)數(shù)組的起始索引為63。


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

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

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



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

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

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

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

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

  在播放音樂的時候,我們主要通過不斷修改頻率來實(shí)現(xiàn),PWM占空比設(shè)置為50%,占空比通過設(shè)置CCR寄存器的值來控制
PWM頻率計算:
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):


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

!
回復(fù)

使用道具 舉報

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

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

本版積分規(guī)則


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