zoukankan      html  css  js  c++  java
  • 【春节歌曲回味 | STM32小音乐盒 】PWM+定时器驱动无源蜂鸣器(STM32 HAL库)

     

    l  STM32通过PWM与定时器方式控制无源蜂鸣器鸣响

    l  STM32小音乐盒,歌曲进度条图形显示与百分比显示,歌曲切换

    l  编程使用STM32 HAL库

    l  IIC OLED界面编程,动画实现

    PWM+TIME驱动无源蜂鸣器,最大的好处就是可以释放主循环,不让程序卡主去播放音乐,这类型操作系统的线程一样,音乐在后台播放,主循环可以随时切换或者关闭音乐或者其它功能操作

    视频演示:https://www.bilibili.com/video/BV1M54y1Y72G

    一、 基础认识

    一切的声音都来源于振动,声音之所以千变万化各不相同,是因为他们的振动各不相同。

    所谓的频率就是一秒钟振动几次,如300HZ,就是每秒振动300次

    频率对比表

     

    男低音80-320Hz

    男中音96-387Hz

    男高音122-488Hz

    女低音145-580Hz

    女高音259-1034Hz

    二、音符、音调、节拍

    (一)   音符

    决定了发音基本单元

    1  2   3   4   5   6   7

    哆  中  咪  发  字  索  拉  西

    (二)   音调

    决定了发音的高低

    C,D,E,F,G,A,B,调式从小到高排列的

    一般大调听上去比较阳光、幸福、祥和,小调则有些悲伤、忧郁、有时甚至是阴暗的感觉在里面。

    调号→升降记号标注→调内音级→关系小调(自然小调)

    C → 无升降号→ 1 2 3 4 5 6 7 →a小调

    G → 1升(#4)→ 5 6 7 1 2 3 #4 →e小调

    D → 2升(#4 #1)→2 3 #4 5 6 7 #1 →b小调

    A → 3升(#4 #1 #5)→ 6 7 #1 2 3 #4 #5 →#f小调

    E → 4升(#4 #1 #5 #2)→ 3 #4 #5 6 7 #1 #2 →#c小调

    B → 5升(#4 #1 #5 #2 #6)→ 7 #1 #2 3 #4 #5 #6 →#g小调

    #F→ 6升(#4 #1 #5 #2 #6 #3)→ #4 #5 #6 7 #1 #2 #3 →#d小调

    #C→ 7升(#4 #1 #5 #2 #6 #3 #7)→ #1 #2 #3 #4 #5 #6 #7 →#a小调

    F → 1降(b7)→ 4 5 6 b7 1 2 3 →d小调

    bB→ 2降(b7 b3)→ b7 1 2 b3 4 5 6 →g小调

    bE→ 3降(b7 b3 b6)→ b3 4 5 b6 b7 1 2 →c小调

    bA→ 4降(b7 b3 b6 b2)→ b6 b7 1 b2 b3 4 5 →f小调

    bD→ 5降(b7 b3 b6 b2 b5)→ b2 b3 4 b5 b6 b7 1 →bb小调

    bG→ 6降(b7 b3 b6 b2 b5 b1)→ b5 b6 b7 b1 b2 b3 4 →be小调

    bC→ 7降(b7 b3 b6 b2 b5 b1 b4)→ b1 b2 b3 b4 b5 b6 b7 →ba小调

    注意:1# (升半音)和2b (降半音)的频率相同

    音调识别:

     ,数字下面带点,低音

    ,不带任何点,基本音

    ,数字上方带点,高音

    (三)   节拍 

    决定了音符的时间长短

       1/4拍,16分音符

       半拍,8分音符

        一拍,4分音符

       两拍,

        三拍

       四拍

    组合

    每拍多长时间没有固定的说法,

    可以参考:

    https://wenku.baidu.com/view/78393de517fc700abb68a98271fe910ef12daeba.html

    三、 编程思路

    定时器与PWM方式,这样可以解放主循环,让程序可以做更多的事情。

    l  定时器把握节拍

    l  PWM把握音调和音符

    PWM周期由定时器分频系数和重装载值共同决定,STM32F103C8T6的主频为72MHZ,设置分频为9,所以最大是8MHZ。我们所需要的最小频率是262HZ,我们只需要计算得到的重装载值不大于定时器的重装载最大值(65535)即可。

    公式:

    PWM周期(HZ) = 主频(HZ) / (重装载值+1)/(分频系数+1) 

    262=8000000/x

    x=30,534<65535

    所以每次转换音符时,动态修改重装载值即可实现PWM输出频率的变化,进而控制无源蜂鸣器发声。

    定时器将进行ms中断,判断每拍时间是否到达,到达则播放下一拍。

    四、参考乐谱

    两只老虎

    春节序曲:

    难忘今宵

     

    视频演示:https://www.bilibili.com/video/BV1M54y1Y72G

    五、 个人导航

    【B站 | 东小东bili】 https://space.bilibili.com/162091292

    【博客园 | 东小东 】https://www.cnblogs.com/dongxiaodong/

    【CSDN | 东小东博客】https://blog.csdn.net/dongxiaodongvip

    【微信 | 东小东】dongxiaodongwx

     

  • 相关阅读:
    Nginx 配置对流量、连接和请求的限制
    linux iptables规则介绍
    Javascript 语言精粹 代码片段合集
    Wowza® Media Systems 使用配置手册。
    如何去除My97 DatePicker控件上右键弹出官网的链接
    [转载]jQuery诞生记-原理与机制
    java swing JButton文字显示异常
    c# 内存拷贝 解决json序列化丢失私有数据(二进制序列化反序列化)
    c# Marshal 将字节数组转为结构 封装协议
    c# 串口通信及模拟串口进行调试
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/14968804.html
Copyright © 2011-2022 走看看