电子产业一站式赋能平台

PCB联盟网

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

stm32版蜂鸣器播放爱若琉璃

[复制链接]

210

主题

210

帖子

1678

积分

三级会员

Rank: 3Rank: 3

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

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

r43lmhahf206405163614.png

r43lmhahf206405163614.png

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

eta3teit5dw6405163714.png

eta3teit5dw6405163714.png

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

jicdzsk4ahe6405163814.png

jicdzsk4ahe6405163814.png

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

lsl5b0tdwq46405163914.png

lsl5b0tdwq46405163914.png


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

lmuacu3jrws6405164014.png

lmuacu3jrws6405164014.png

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

5bugpxwjzlj6405164115.png

5bugpxwjzlj6405164115.png

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

gsarenzko2c6405164215.png

gsarenzko2c6405164215.png


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

zrpndmsxg2p6405164315.png

zrpndmsxg2p6405164315.png

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

5agmy1ylc4i6405164415.png

5agmy1ylc4i6405164415.png

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

0wva1yebcyx6405164515.png

0wva1yebcyx6405164515.png

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

nwks20cc3fx6405164615.png

nwks20cc3fx6405164615.png

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

hdgvyokxjbh6405164715.png

hdgvyokxjbh6405164715.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%
代码实现:

mpe0ypqwgk36405164815.png

mpe0ypqwgk36405164815.png


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

2a3z4aap0z16405164915.jpg

2a3z4aap0z16405164915.jpg

回复

使用道具 举报

发表回复

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

本版积分规则


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