【灵动 Mini-G0001开发板】唱歌的蜂鸣器

目录:

       *wind11踩过的坑

       *硬件连接

        *蜂鸣器频率

       *代码逻辑

       *效果展示

1. wind11踩过的坑

拿到板子后波折多多,下载的demo编译后居然跑不起来,尝试运行调试,发现不断F5会有跑起来的那么一刻,之后重新断电上电又跑不起来,着实悲剧

最终jlink卸载重新安装、MDK卸载重新安装,电脑重启仍不能解决问题,最终无意发现切换为Version5编译工具编译后烧写可以正常运行,猜测是Wind11系统上一些编译工具兼容性差,最好搞开发还是尽量避免用Wind11

2. 硬件连接

查看文档说明,芯片PA11连接Mos管驱动蜂鸣器,通过输出高低电平可以使蜂鸣器鸣响,PA11可使用TIM1的ch2输出PWM驱动

四个LED灯分别使用IO口PA5、PA6、PA10、PA15控制

串口USART1 TX1脚跟LED2重复,只能换个引脚接打印

引脚复用功能图:

3. 蜂鸣器频率

一般说来,蜂鸣器演奏音乐只能是单音频率,它不包含相应幅度的谐波频率,也就是说不能象电子琴那样能奏出多种音色的声音。因此蜂鸣器奏乐只需弄清楚两个概念即可,也就是“音调”和“节拍”。音调表示一个音符唱多高的频率,节拍表示一个音符唱多长的时间。十二平均律就规定了每一个音符的标准频率。

十二平均律,是一种音乐定律方法,将一个纯八度平均分成十二等份,每等分称为半音,是最主要的调音法。十二平均律中各音的频率: C: 262 Hz、#C: 277 Hz、D: 294 Hz、#D: 311 Hz、E: 330 Hz、F: 349 Hz、#F: 370 Hz、G: 392 Hz、#G: 415 Hz、A: 440 Hz、#A: 466 Hz、B: 494 Hz

音高由三位数字组成:

        个位是表示 1~7 这七个音符

        十位是表示音符所在的音区:1-低音,2-中音,3-高音;

        百位表示这个音符是否要升半音: 0-不升,1-升半音。

 音长最多由三位数字组成:

        个位表示音符的时值,其对应关系是:

            |数值(n):  |0 |1 |2 |3 | 4 | 5 | 6

            |几分音符: |1 |2 |4 |8 |16 |32 |64      音符=2^n

        十位表示音符的演奏效果(0-2):  0-普通,1-连音,2-顿音

        百位是符点位: 0-无符点,1-有符点

从网上搜索到 “挥着翅膀的女孩” 音乐的乐谱,开始编写程序

4. 代码逻辑

LED灯引脚配置,将LED1、2、3、4都使能打开

串口使用UART1的TX引脚用PA12引脚,不占用LED2资源

接下来配置PWM输出, 时钟分频下来最好是大于20KHz,声音频率从20Hz-20KHz之间,确保我们需要用到的此区间可以再分频得到

通过查手册,TIMx_ARR寄存器可以自动预装,可通过改此寄存器值得到我们需要的某个频率的pwm输出

而TIMx_CR1寄存器则可以配置出我们需要的占空比,因为占空比大小会影响声音的大小

如下是网上找的 “挥着翅膀的女孩” 乐谱

// C: 262 Hz、#C: 277 Hz、D: 294 Hz、#D: 311 Hz、E: 330 Hz、F: 349 Hz、#F: 370 Hz、G: 392 Hz、#G: 415 Hz、

// A: 440 Hz、#A: 466 Hz、B: 494 Hz

音乐乐谱表:

{

        0x17, 0x02, 0x17, 0x03, 0x18, 0x03, 0x19, 0x02, 0x15, 0x03,

        0x16, 0x03, 0x17, 0x03, 0x17, 0x03, 0x17, 0x03, 0x18, 0x03,

        0x19, 0x02, 0x16, 0x03, 0x17, 0x03, 0x18, 0x02, 0x18, 0x03,

        0x17, 0x03, 0x15, 0x02, 0x18, 0x03, 0x17, 0x03, 0x18, 0x02,

        0x10, 0x03, 0x15, 0x03, 0x16, 0x02, 0x15, 0x03, 0x16, 0x03,

        0x17, 0x02, 0x17, 0x03, 0x18, 0x03, 0x19, 0x02, 0x1A, 0x03,

        0x1B, 0x03, 0x1F, 0x03, 0x1F, 0x03, 0x17, 0x03, 0x18, 0x03,

        0x19, 0x02, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03, 0x17, 0x03,

        0x18, 0x03, 0x1F, 0x03, 0x1F, 0x02, 0x16, 0x03, 0x17, 0x03,

        0x18, 0x03, 0x17, 0x03, 0x18, 0x03, 0x20, 0x03, 0x20, 0x02,

        0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x20, 0x03, 0x21, 0x03,

        0x20, 0x03, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x1F, 0x03,

        0x1B, 0x03, 0x19, 0x03, 0x19, 0x03, 0x15, 0x03, 0x1A, 0x66,

        0x1A, 0x03, 0x19, 0x03, 0x15, 0x03, 0x15, 0x03, 0x17, 0x03,

        0x16, 0x66, 0x17, 0x04, 0x18, 0x04, 0x18, 0x03, 0x19, 0x03,

        0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x20, 0x03, 0x21, 0x03,

        0x20, 0x03, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66, 0x1F, 0x03,

        0x1B, 0x03, 0x19, 0x03, 0x19, 0x03, 0x15, 0x03, 0x1A, 0x66,

        0x1A, 0x03, 0x19, 0x03, 0x19, 0x03, 0x1F, 0x03, 0x1B, 0x03,

        0x1F, 0x00, 0x1A, 0x03, 0x1A, 0x03, 0x1A, 0x03, 0x1B, 0x03,

        0x1B, 0x03, 0x1A, 0x03, 0x19, 0x03, 0x19, 0x02, 0x17, 0x03,

        0x15, 0x17, 0x15, 0x03, 0x16, 0x03, 0x17, 0x03, 0x18, 0x03,

        0x17, 0x04, 0x18, 0x0E, 0x18, 0x03, 0x17, 0x04, 0x18, 0x0E,

        0x18, 0x66, 0x17, 0x03, 0x18, 0x03, 0x17, 0x03, 0x18, 0x03,

        0x20, 0x03, 0x20, 0x02, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x66,

        0x20, 0x03, 0x21, 0x03, 0x20, 0x03, 0x1F, 0x03, 0x1B, 0x03,

        0x1F, 0x66, 0x1F, 0x04, 0x1B, 0x0E, 0x1B, 0x03, 0x19, 0x03,

        0x19, 0x03, 0x15, 0x03, 0x1A, 0x66, 0x1A, 0x03, 0x19, 0x03,

        0x15, 0x03, 0x15, 0x03, 0x17, 0x03, 0x16, 0x66, 0x17, 0x04,

        0x18, 0x04, 0x18, 0x03, 0x19, 0x03, 0x1F, 0x03, 0x1B, 0x03,

        0x1F, 0x66, 0x20, 0x03, 0x21, 0x03, 0x20, 0x03, 0x1F, 0x03,

        0x1B, 0x03, 0x1F, 0x66, 0x1F, 0x03, 0x1B, 0x03, 0x19, 0x03,

        0x19, 0x03, 0x15, 0x03, 0x1A, 0x66, 0x1A, 0x03, 0x19, 0x03,

        0x19, 0x03, 0x1F, 0x03, 0x1B, 0x03, 0x1F, 0x00, 0x18, 0x02,

        0x18, 0x03, 0x1A, 0x03, 0x19, 0x0D, 0x15, 0x03, 0x15, 0x02,

        0x18, 0x66, 0x16, 0x02, 0x17, 0x02, 0x15, 0x00, 0x00, 0x00

}

主程序中逻辑很简单,简单的获取音乐信息,拆解计算为各频率的大小,控制蜂鸣器输出发生和停留事件,不断循环,直到音乐播放结束跳出循环

预留出PWM输出设置频率和占空比的接口用于主程序中调用

void TIM1_PWM_Output_Freq_Duty(uint32_t freq, uint32_t duty)

{

              /* Compute the value to be set in ARR regiter to generate signal frequency at 100 Khz */

             

              uint32_t TimerPeriod = (RCC_GetPCLK1Freq() * freq / 100000 ) - 1;

      

              uint32_t Channel2Pulse = ((uint32_t)duty * (TimerPeriod - 1)) / 1000;

      

              TIM_SetAutoreload(TIM1, TimerPeriod);

      

              TIM_SetCompare2(TIM1, Channel2Pulse);

}

解码部分,根据乐谱计算出低音高音

JLink上有集成一个串口,但跟板子上预留口不一致,只能跳下线抓打印方便调试代码

5. 效果展示

效果还不错,视频连接如下:【灵动 Mini-G0001开发板】唱歌的蜂鸣器-CSDN直播

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值