本帖最后由 xld0932 于 2019-5-19 11:05 编辑

1.概述


使用NUCLEO-L412开发板驱动无源蜂鸣器播放音乐,来掌握硬件PWM的配置、频率调节、占空比调节等操作。另外我们也了解了一下关于无源蜂鸣器的知识,关于音乐中的一些术语。
1.1.音符与频率的对应关系如下图所示,PWM输出某一频率到无源蜂鸣器后就产生了相对应的音调了
4.png

1.2.节拍是播放音调的时间占用比例,是乐曲中表示固定单位时值和强弱规律的组织形式。例如,2/4表示以4分音符为1拍 ,每小节有 2 拍。拍号中时值的实际时间,应视乐曲所标速度而定。

1.3.播放速度由单个节拍播放占用的时间所决定的,本程序中以125ms为一个基准,它的倍数关系做为一个节拍;可以通过调节这个时间基准来控制歌曲的播放速度。

2.硬件连接

1.jpg
说明:
使用的无源蜂鸣器模块,连接到NUCLEO-L412KB开发板上,使用3.3V供电,PWM引脚使用TIM1的CHANNEL2输出引脚PA9。

3.STM32CubeMX配置

3.1.配置TIM1及GPIO
2.png

3.2.配置PWM
3.png

4.编写驱动程序
  1. /**
  2.   ******************************************************************************
  3.   * @file    buzzer.h
  4.   * @version V1.00
  5.   * @author  xld0932
  6.   * @brief   
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2019. All rights reserved.
  11.   *
  12.   ******************************************************************************
  13.   */
  14. /* Define to prevent recursive inclusion ------------------------------------*/
  15. #ifndef __BUZZER_H__
  16. #define __BUZZER_H__
  17. #undef  EXTERN
  18. #ifdef  __BUZZER_C__
  19. #define EXTERN
  20. #else
  21. #define EXTERN extern
  22. #endif
  23. /* Includes -----------------------------------------------------------------*/
  24. #include "platform.h"
  25. /* Exported constants -------------------------------------------------------*/
  26. /* Exported defines ---------------------------------------------------------*/
  27. /* Exported typedef ---------------------------------------------------------*/
  28. typedef struct
  29. {
  30.     uint16_t Do;
  31.     uint16_t Re;
  32.     uint16_t Mi;
  33.     uint16_t Fa;
  34.     uint16_t So;
  35.     uint16_t La;
  36.     uint16_t Si;
  37. } sNOTE;
  38. /* Exported macro -----------------------------------------------------------*/
  39. /* Exported functions prototypes --------------------------------------------*/
  40. EXTERN void BUZZER_Init(void);
  41. #endif
  42. /*********************** (C) COPYRIGHT ************************END OF FILE****/
  1. /**
  2.   ******************************************************************************
  3.   * @file    buzzer.c
  4.   * @version V1.00
  5.   * @author  xld0932
  6.   * @brief   
  7.   ******************************************************************************
  8.   * @attention
  9.   *
  10.   * Copyright (c) 2019. All rights reserved.
  11.   *
  12.   ******************************************************************************
  13.   */
  14. /* Define to prevent recursive inclusion ------------------------------------*/
  15. #define __BUZZER_C__
  16. /* Includes -----------------------------------------------------------------*/
  17. #include "BUZZER.h"
  18. /* Private constants --------------------------------------------------------*/
  19. /* Private defines ----------------------------------------------------------*/
  20. /* Private typedef ----------------------------------------------------------*/
  21. /* Private macro ------------------------------------------------------------*/
  22. /* Private variables --------------------------------------------------------*/
  23. const sNOTE LoCTune = { 262,  294,  330,  349,  392,  440,  494};
  24. const sNOTE MiCTune = { 523,  587,  659,  698,  784,  880,  988};
  25. const sNOTE HiCTune = {1046, 1175, 1318, 1397, 1568, 1760, 1976};
  26. const uint16_t CTune[] =
  27. {
  28.     1,      //0
  29.     262,    //1.Do    ---Low
  30.     294,    //2.Re
  31.     330,    //3.Mi
  32.     349,    //4.Fa
  33.     392,    //5.So
  34.     440,    //6.La
  35.     494,    //7.Si
  36.     0,      //8
  37.     0,      //9
  38.     0,      //10
  39.     523,    //11.Do    ---Middle
  40.     587,    //12.Re
  41.     659,    //13.Mi
  42.     698,    //14.Fa
  43.     784,    //15.So
  44.     880,    //16.La
  45.     988,    //17.Si
  46.     0,      //18
  47.     0,      //19
  48.     0,      //20
  49.     1046,   //21.Do    ---High
  50.     1175,   //22.Re
  51.     1318,   //23.Mi
  52.     1397,   //24.Fa
  53.     1568,   //25.So
  54.     1760,   //26.La
  55.     1976,   //27.Si
  56. };
  57. /**
  58. * 《一闪一闪亮晶晶》音符
  59. */
  60. const uint16_t MusicNote1[] =
  61. {
  62. 1,0,1,0,5,0,5,0,6,0,6,0,5,0,
  63. 4,0,4,0,3,0,3,0,2,0,2,0,1,0,
  64. 5,0,5,0,4,0,4,0,3,0,3,0,2,0,
  65. 5,0,5,0,4,0,4,0,3,0,3,0,2,0,
  66. 1,0,1,0,5,0,5,0,6,0,6,0,5,0,
  67. 4,0,4,0,3,0,3,0,2,0,2,0,1,0,
  68. };
  69. /**
  70. * 《一闪一闪亮晶晶》节拍
  71. */
  72. const uint8_t  MusicBeat1[] =
  73. {
  74. 3,1,3,1,3,1,3,1,3,1,3,1,7,1,
  75. 3,1,3,1,3,1,3,1,3,1,3,1,7,1,
  76. 3,1,3,1,3,1,3,1,3,1,3,1,7,1,
  77. 3,1,3,1,3,1,3,1,3,1,3,1,7,1,
  78. 3,1,3,1,3,1,3,1,3,1,3,1,7,1,
  79. 3,1,3,1,3,1,3,1,3,1,3,1,7,8,
  80. };
  81. /**
  82. * 《粉刷匠》音符
  83. */
  84. const uint16_t MusicNote2[] =
  85. {
  86. 5,3,5,3,5,3,1,2,4,3,2,5,0,
  87. 5,3,5,3,5,3,1,2,4,3,2,1,0,
  88. 2,2,4,4,3,1,5,2,4,3,2,5,0,
  89. 5,3,5,3,5,3,1,2,4,3,2,1,0,
  90. };
  91. /**
  92. * 《粉刷匠》节拍
  93. */
  94. const uint8_t  MusicBeat2[] =
  95. {
  96. 2,2,2,2,2,2,4,2,2,2,2,8,1,
  97. 2,2,2,2,2,2,4,2,2,2,2,8,1,
  98. 2,2,2,2,2,2,4,2,2,2,2,8,1,
  99. 2,2,2,2,2,2,4,2,2,2,2,4,8,
  100. };
  101. /**
  102. * 《爱是你我》音符
  103. */
  104. const uint16_t MusicNote3[] =
  105. {
  106. 11,7,0,5,3,3,3,3,3,6,6,6,6,11,5,3,3,3,3,3,
  107. 11,7,0,5,6,7,6,6,0,6,2,2,2,2,2,1,6,2,3,3,
  108. 3,3,3,11,7,6,13,12,12,6,11,12,7,5,5,6,6,6,13,13,
  109. 11,6,13,12,12,12,12,12,6,6,7,12,7,7,7,0,11,6,6,6,
  110. 6,0,0,13,16,16,16,16,16,16,16,15,16,16,13,13,13,13,13,13,
  111. 13,13,16,16,16,16,16,16,15,16,15,15,15,15,15,15,15,16,13,12,
  112. 13,11,16,6,0,3,5,3,5,5,6,11,6,12,13,0,16,16,15,13,
  113. 12,13,15,13,13,13,13,0,12,11,12,12,13,11,6,5,6,12,12,12,
  114. 12,13,11,6,0,12,13,5,3,3,12,12,13,11,6,6,13,16,15,15,
  115. 15,15,15,15,15,12,13,5,3,0,11,6,6,6,6,6,12,13,5,3,
  116. 0,11,6,6,6,6,6,0,
  117. };
  118. /**
  119. * 《爱是你我》节拍
  120. */
  121. const uint8_t  MusicBeat3[] =
  122. {
  123. 4,4,1,2,2,2,4,4,4,2,2,4,2,2,2,2,2,2,2,2,
  124. 4,4,2,2,2,2,4,4,2,2,2,2,2,2,4,2,2,2,2,2,
  125. 4,4,4,4,4,2,4,4,4,2,4,2,4,4,2,4,2,4,2,2,
  126. 4,2,4,4,2,2,4,4,2,2,2,4,2,4,4,4,4,4,2,2,
  127. 4,4,4,4,2,4,2,2,4,4,4,4,4,4,4,2,2,4,4,4,
  128. 2,2,4,4,2,2,4,4,2,2,2,4,2,2,2,4,4,4,4,4,
  129. 4,2,2,4,2,2,2,2,4,2,2,4,4,4,2,2,4,4,4,4,
  130. 4,2,2,2,2,2,2,2,2,2,4,2,2,2,2,4,4,4,4,4,
  131. 2,2,4,4,4,2,2,4,2,2,4,2,2,2,2,4,4,2,2,2,
  132. 2,2,2,2,2,2,2,4,4,4,4,2,2,2,2,2,2,2,4,4,
  133. 4,4,4,4,4,4,4,8,
  134. };
  135. /* Private function prototypes ----------------------------------------------*/
  136. /* Exported variables -------------------------------------------------------*/
  137. extern TIM_HandleTypeDef  htim1;
  138. /* Exported function prototypes ---------------------------------------------*/
  139. /**
  140. * @brief  :
  141. * @param  :
  142. * @returns:
  143. * @details:
  144. */
  145. void BUZZER_SetFrequency(uint16_t freq)
  146. {
  147.     uint32_t Period = 1000000 / freq;
  148.     uint16_t Pulse  = Period  / 2;
  149.     /* Set the Autoreload value , frequency*/
  150.     TIM1->ARR  = Period;
  151.     /* Set the Capture Compare Register value , duty */
  152.     TIM1->CCR2 = Pulse;
  153. }
  154. /**
  155. * @brief  :
  156. * @param  :
  157. * @returns:
  158. * @details:
  159. */
  160. void BUZZER_Init(void)
  161. {
  162.     uint16_t i = 0;
  163.     /**
  164.      * 打开PWM,准备播放音乐
  165.      */
  166.     HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
  167.     /**
  168.      * 播放《一闪一闪亮晶晶》
  169.      */
  170.     for(i = 0; i < sizeof(MusicBeat1); i++)
  171.     {
  172.         BUZZER_SetFrequency(CTune[MusicNote1[i]]);
  173.         HAL_Delay(MusicBeat1[i] * 125);
  174.     }
  175.     /**
  176.      * 播放《粉刷匠》
  177.      */
  178.     for(i = 0; i < sizeof(MusicBeat2); i++)
  179.     {
  180.         BUZZER_SetFrequency(CTune[MusicNote2[i]]);
  181.         HAL_Delay(MusicBeat2[i] * 125);
  182.     }
  183.     /**
  184.      * 播放《爱是你我》
  185.      */
  186.     for(i = 0; i < sizeof(MusicBeat3); i++)
  187.     {
  188.         BUZZER_SetFrequency(CTune[MusicNote3[i]]);
  189.         HAL_Delay(MusicBeat3[i] * 125);
  190.     }
  191.     /**
  192.      * 关闭PWM,停止播放音乐
  193.      */
  194.     HAL_TIM_PWM_Stop( &htim1, TIM_CHANNEL_2);
  195. }
  196. /*********************** (C) COPYRIGHT ************************END OF FILE****/

5.播放效果

5.1.一闪一闪亮晶晶
一闪一闪亮晶晶.jpg
一闪一闪亮晶晶.rar (615.27 KB, 下载次数: 3)