[新手园地] zhaor第二贴:PWM实验,驱动蜂鸣片

[复制链接]
 楼主| zhaor 发表于 2011-10-17 21:42 | 显示全部楼层 |阅读模式
本帖最后由 zhaor 于 2011-11-17 17:42 编辑

蜂鸣器不是板子上的,是用的类似贺年卡上的。
这样设置的
开机串口首先输出这样的信息:
     
+------------------------------------------------------------------------+
|                      PWM Driver Sample Code                            |
|                                                                        |
+------------------------------------------------------------------------+
  This sample code will use PWM0 to drive Buzzer .
  I/O configuration:
    GPA12 <--> Buzzer
  Please Select Test Item
    0 : PWM Timer Waveform Test
    1 : Exit
如果输入0,则提示:
PWM Timer Waveform Test. Waveform output(PWM0) to Buzzer
Select Test Item
1: Do (256Hz)
2: Re (287Hz)
3: Mi (322Hz)
4: Fa (341Hz)
5: Sol(2000Hz)
6: La (4000Hz)
7: Si (8000Hz)
0: Exit
假设这时如果输入2,则蜂鸣器输出287Hz的声音。蜂鸣器一端接在R12任意一侧即可,另一端接地。这个时候L6也闪烁。
程序是在例程的基础上修改而成的。


  1. /*---------------------------------------------------------------------------------------------------------*/
  2. #include "config.h"

  3. /*---------------------------------------------------------------------------------------------------------*/
  4. /* Global variables */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. uint8_t volatile g_u8PWMCount = 1;
  7. uint16_t g_u16Frequency; //PWM频率输出值
  8. static uint32_t s_u32Pulse = 0;

  9. /*************************************************************************************
  10. ** Function name: GPIO_Configuration
  11. ** Descriptions: GPIO配置
  12. *************************************************************************************/
  13. void GPIO_Configuration(void)
  14. {
  15. DrvGPIO_Open( E_GPB, 14, E_IO_INPUT ); //按键端口设置为输入
  16. DrvGPIO_Open( E_GPB, 15, E_IO_INPUT );
  17. }

  18. /*---------------------------------------------------------------------------------------------------------*/
  19. /* PWM Timer Callback function */
  20. /*---------------------------------------------------------------------------------------------------------*/
  21. void DRVPWM_PwmIRQHandler()
  22. {
  23. if (s_u32Pulse == 1 * g_u16Frequency /10)
  24. {
  25. /*--------------------------------------------------------------------------------------*/
  26. /* Stop PWM Timer 0 (Recommended procedure method 2) */
  27. /* Set PWM Timer counter as 0, When interrupt request happen, disable PWM Timer */
  28. /*--------------------------------------------------------------------------------------*/
  29. DrvPWM_SetTimerCounter(DRVPWM_TIMER2, 0); //中断中关闭PWM。
  30. }

  31. if (s_u32Pulse == 1 * g_u16Frequency /10 + 1)
  32. {
  33. g_u8PWMCount = 0;
  34. }
  35. s_u32Pulse++;
  36. }

  37. /*---------------------------------------------------------------------------------------------------------*/
  38. /* Main Function */
  39. /*---------------------------------------------------------------------------------------------------------*/
  40. int32_t main (void)
  41. {
  42. S_DRVPWM_TIME_DATA_T sPt;
  43. uint8_t u8Item;
  44. uint8_t u8Timer;
  45. int32_t i32Loop = 1;
  46. int32_t i32TestLoop = 1;
  47. /************配置系统时钟***************************/
  48. UNLOCKREG();
  49. SYSCLK->PWRCON.XTL12M_EN = 1;

  50. /* Waiting for 12M Xtal stalble */
  51. DrvSYS_Delay(5000);
  52. /*Descriptions: USART初始化 */
  53. UART_Configuration();
  54. /*Descriptions: GPIO初始化 */
  55. GPIO_Configuration();
  56. /* Enable PWM clock */
  57. DrvPWM_Open(); //打开PWM

  58. /* Set PWM pins */
  59. DrvGPIO_InitFunction(E_FUNC_PWM01);
  60. // DrvGPIO_InitFunction(E_FUNC_PWM23);
  61. // DrvGPIO_InitFunction(E_FUNC_PWM45);
  62. // DrvGPIO_InitFunction(E_FUNC_PWM67);
  63. /************配置系统时钟和解锁***************************/
  64. UNLOCKREG();
  65. DrvSYS_SelectHCLKSource(0);
  66. LOCKREG();
  67. /************关闭蜂鸣器***************************/
  68. (DrvGPIO_ClrBit(E_GPB,10)); //关闭蜂鸣器


  69. /************串口输出信息***************************/
  70. printf("+------------------------------------------------------------------------+\n");
  71. printf("| PWM Driver Sample Code |\n");
  72. printf("| |\n");
  73. printf("+------------------------------------------------------------------------+\n");
  74. printf(" This sample code will use PWM0 to drive Buzzer .\n");
  75. printf(" I/O configuration:\n");
  76. printf(" GPA12 <--> Buzzer\n");

  77. while (i32Loop)
  78. {
  79. printf("\n Please Select Test Item\n");
  80. printf(" 0 : PWM Timer Waveform Test\n");
  81. printf(" 1 : Exit\n\n");
  82. u8Item = getchar();
  83. switch (u8Item)
  84. {
  85. case '0':
  86. {
  87. uint8_t u8ItemOK;
  88. printf("\nPWM Timer Waveform Test. Waveform output(PWM0) to Buzzer\n");
  89. i32TestLoop = 1;
  90. printf("Select Test Item\n");
  91. printf(" 1: Do (256Hz)\n");
  92. printf(" 2: Re (287Hz)\n");
  93. printf(" 3: Mi (322Hz)\n");
  94. printf(" 4: Fa (341Hz)\n");
  95. printf(" 5: Sol(2000Hz) \n");
  96. printf(" 6: La (4000Hz)\n");
  97. printf(" 7: Si (8000Hz)\n");
  98. printf(" 0: Exit\n");
  99. while (i32TestLoop)
  100. {
  101. u8ItemOK = 1;
  102. u8Item = getchar();
  103. switch (u8Item)
  104. {
  105. case '1':
  106. g_u16Frequency = 256;
  107. break;
  108. case '2':
  109. g_u16Frequency = 287;
  110. break;
  111. case '3':
  112. g_u16Frequency = 322;
  113. break;
  114. case '4':
  115. g_u16Frequency = 341;
  116. break;
  117. case '5':
  118. g_u16Frequency = 2000;
  119. break;
  120. case '6':
  121. g_u16Frequency = 4000;
  122. break;
  123. case '7':
  124. g_u16Frequency = 8000;
  125. break;
  126. case '0':
  127. i32TestLoop = 0;
  128. break;
  129. default:
  130. u8ItemOK = 0;
  131. break;
  132. }

  133. if (i32TestLoop && u8ItemOK)
  134. {
  135. s_u32Pulse = 0;
  136. g_u8PWMCount = 1;

  137. /* PWM Timer property */
  138. sPt.u8Mode = DRVPWM_AUTO_RELOAD_MODE; /*自动重载模式*/
  139. sPt.u32Frequency = g_u16Frequency; //PWM 频率
  140. sPt.u8HighPulseRatio = 50; /* 高脉冲宽度时间所占周期的百分比 50 : 100 */
  141. sPt.i32Inverter = 0; /*反向打开1或者关闭0*/
  142. u8Timer = DRVPWM_TIMER0; /*PWM设定0、1、2、3*/

  143. /* Select PWM engine clock */
  144. DrvPWM_SelectClockSource(u8Timer, DRVPWM_HCLK);
  145. /* Set PWM Timer0 Configuration */
  146. DrvPWM_SetTimerClk(u8Timer, &sPt);

  147. /* Enable Output for PWM Timer0 */
  148. DrvPWM_SetTimerIO(u8Timer, 1);

  149. /* Enable Interrupt Sources of PWM Timer0 and install call back function */
  150. DrvPWM_EnableInt(u8Timer, 0, DRVPWM_PwmIRQHandler);

  151. /* Enable the PWM Timer 0 */
  152. DrvPWM_Enable(u8Timer, 1);
  153. while (g_u8PWMCount);

  154. /*--------------------------------------------------------------------------------------*/
  155. /* Stop PWM Timer0 (Recommended procedure method 2) */
  156. /* Set PWM Timer counter as 0, When interrupt request happen, disable PWM Timer */
  157. /* Set PWM Timer counter as 0 in Call back function */
  158. /*--------------------------------------------------------------------------------------*/

  159. /* Disable the PWM Timer 0 */
  160. DrvPWM_Enable(u8Timer, 0);
  161. }
  162. }
  163. break;
  164. }
  165. case '1':
  166. {
  167. i32Loop = 0;
  168. break;
  169. }
  170. }
  171. }
  172. DrvPWM_Close();
  173. return 0;
  174. }


文件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-10-18 14:18 | 显示全部楼层
问问三心网友。
 楼主| zhaor 发表于 2011-11-17 17:45 | 显示全部楼层
本帖最后由 zhaor 于 2011-11-17 18:05 编辑

实验获得成功!4KHz是最响亮的。
 楼主| zhaor 发表于 2011-11-17 17:46 | 显示全部楼层
本帖最后由 zhaor 于 2011-11-17 18:02 编辑

这个实验成功了,就可以把这个程序作为子程序,可以作为按键提示音,串口接收成功提示音等等。
经过实验,IO口是可以直接接蜂鸣片的。
我在一些网站看到过可以直接接的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-11-17 17:57 | 显示全部楼层
有时间听听
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

347

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

41

主题

347

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部