电子产业一站式赋能平台

PCB联盟网

搜索
查看: 48|回复: 0
收起左侧

stm32版蜂鸣器播放爱若琉璃

[复制链接]

210

主题

210

帖子

1678

积分

三级会员

Rank: 3Rank: 3

积分
1678
发表于 2020-11-20 07:15:00 | 显示全部楼层 |阅读模式
在小哈公众号上,公众号:嵌入式从0到1,小哈用鸿蒙平台做了个播放爱若琉璃歌曲的文章,写的非常详细,视频做的也非常好,伙伴们可以去看看,哈哈,说了这么多,就是为了抄点素材。。。鉴于stm32f103c8t6(便宜好用)平台应该是比较普遍的了,做个32版本的,嘿嘿 这次废话有点多,上干货!
1、音乐的音调(音符)和节拍(摘自小哈公众号) 要想实现一个乐谱,我们只要确定“音符(音调)”和“节拍”即可。音调表示一个音符响的频率,节拍表示一个音符该唱多长的时间。

音符(音调)的确定一般钢琴键盘有88个按键:

1cd4tp04cru64017633831.png

1cd4tp04cru64017633831.png

钢琴上88按键的频率如下表所示:

k3b4ifnayid64017633931.png

k3b4ifnayid64017633931.png

比如中央C音的标准频率就是261,在上面表格中就是:音名为C4的按键。程序中定义一个音频的数组:

qofvlcrvktt64017634031.png

qofvlcrvktt64017634031.png

在系统时钟为40MHZ的情况下,输出的脉冲的最低频率为:40M / 65535 (下面有计算方法) ,即 40 * 1000 * 1000 / 65535 = 610.3608758678569?,所以在系统时钟40MHZ下,只能产生频率610Hz以上的音,即D#5及以上的按键音,所以我们选择C6那组按键的音作为主音。所以我们预定义正常音的C6对应数组的起始索引为63。

vaxnvzehhcz64017634131.png

vaxnvzehhcz64017634131.png


要想让蜂鸣器发出某个音只需要让PWM输出对应频率的脉冲即可。网上找个《爱若琉璃》的简谱,然后按照对应关系创建如下乐谱数组:

h1hlpf2wzrg64017634231.png

h1hlpf2wzrg64017634231.png

节拍的确定节拍就是一个音持续的时间,这里就是PWM脉冲持续的时间,那么持续的时间如何确定呢?

gjriek5czzw64017634331.png

gjriek5czzw64017634331.png

基础知识算是写完(抄完)了,那么怎么在程序上实现呢,王者荣耀达摩常说的,公式才是永恒的真理,现在理论有了,来,实现它,干!
         2、此次使用的可视化配置工具cubemx,不得不说,基本的配置,用这玩意还是非常省事(懒)的,由于我的蜂鸣器控制引脚接在了PB3上,也即是TIM2-CH2的通道上,配置PB3为TIM2-CH2模式

xuctsiga10o64017634431.png

xuctsiga10o64017634431.png


接下来是最重要的时钟配置,宛若人的心脏般,芯片工作的基本,这里选择的也是配置为了40MHZ,为什么是40MHZ,懒!配置40MHZ剩下的就直接搬运小哈的,无非是换个平台啦。

rn0vrnahvju64017634532.png

rn0vrnahvju64017634532.png

然后配置定时器2的一些参数,和通道2配置为PWM模式,分频系数选择不分频,周期设为0,这里只是初始值,即使设置了,也没关系的,后面播放音符的时候,会修改的咯,所以这个不用担心具体设置什么值

en3gaxvr4fs64017634632.png

en3gaxvr4fs64017634632.png

这里可以设置我们代码生成时候的一些设置,第一项是只添加需要的文件,用到哪些库文件添加那些,我们可以选择用到的文件添加,第二处是为每个模块生成单独的.c,.h文件,建议勾选,否则所有的东西都在main函数里面,代码可读性会比较差,小飞哥是经常勾选的。

lpaxckkrigx64017634732.png

lpaxckkrigx64017634732.png

3、代码解读
至此我们的配置就完成了,生成代码就可以啦!TIM2的初始化配置,和我们cubemx配置上一样的咯,不分频,周期为0,占空比为0,这些参数后面会用到,在进行修改

5qqbqhnisnc64017634832.png

5qqbqhnisnc64017634832.png

这里可以看到,配置PB3引脚复用功能

cyr3wdeq2hg64017634932.png

cyr3wdeq2hg64017634932.png

  在播放音乐的时候,我们主要通过不断修改频率来实现,PWM占空比设置为50%,占空比通过设置CCR寄存器的值来控制
PWM频率计算:
Fpwm=Ftimclk/(arr+1)*(psc+1)
arr:周期
psc:预分频值
比如:
Ftimclk = 40MHZ
arr=399
psc=0
Fpwm = 40/40=100000HZ
TIM2->CCR2 = 199
占空比为50%
代码实现:

clzfxbrm55h64017635032.png

clzfxbrm55h64017635032.png


大白,小飞哥给你放首音乐,嗨起来,哈哈,连接会在下面评论区,欢迎小伙伴们动手,干!
      欢迎大家关注 Embeded小飞哥  ,我是小飞哥,让我快点遇到优秀的你,然后一起变得更加优秀,加油

vu511kf3fmv64017635132.jpg

vu511kf3fmv64017635132.jpg

回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表