当前位置:   article > 正文

STM32F103 有源蜂鸣器 无源蜂鸣器驱动范例_蜂鸣器驱动程序

蜂鸣器驱动程序

1.无源蜂鸣器


        它价格低廉、使用简单。但是它内部没有激励源,所以我们要通过不断将IO口电平置高和置低来产生一定频率的方波信号,驱动蜂鸣器内部的震动装置震动,来达到让蜂鸣器发声的目的。输入不同频率的方波信号可使蜂鸣器发出不同频率的声音。

2.有源蜂鸣器


        它与无源蜂鸣器相比价格稍贵,但是使用更加简单。它内部自带多个振荡电路,因此我们只需接入额定电压的直流电即可发出指定频率的声音,但频率由内部振荡电路决定,无法改变。

以下是一个简单的STM32F103有源蜂鸣器驱动程序的例子

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #define BEEP_GPIO_PORT GPIOA //定义蜂鸣器所使用的GPIO口为PA4
  4. void Beep_Init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA时钟
  8. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB6输出
  9. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  10. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
  11. GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStructure); //初始化GPIOB6
  12. }
  13. void Beep_On(void) //蜂鸣器打开
  14. {
  15. GPIO_SetBits(BEEP_GPIO_PORT, GPIO_Pin_5);
  16. }
  17. void Beep_Off(void) //蜂鸣器关闭
  18. {
  19. GPIO_ResetBits(BEEP_GPIO_PORT, GPIO_Pin_5);
  20. }
  21. int main(void)
  22. {
  23. Delay_Init();
  24. Beep_Init();
  25. while (1)
  26. {
  27. Beep_On();
  28. Delay_Ms(500);
  29. Beep_Off();
  30. Delay_Ms(500);
  31. }
  32. }

        在这个例子中,我们首先设置PA口的时钟并配置PA4引脚为推挽输出模式。然后我们定义了两个函数Beep_On()Beep_Off()来控制蜂鸣器的开和关。

        在主循环中,我们每秒切换一次蜂鸣器的状态,使其发出"哔"的声音。

        请注意,这只是一个基本的示例,并且可能需要根据你的具体需求进行修改。例如,你可能需要改变蜂鸣器的工作频率或调整延迟时间以获得不同的音调。

以下是一个使用STM32F103和TIM模块生成PWM信号来驱动无源蜂鸣器的简单示例:

无源蜂鸣器与有源蜂鸣器不同,它没有内部振荡电路,所以不能直接通过数字信号控制其发声,而是需要通过一个周期性的PWM信号去驱动。

  1. #include "stm32f10x.h"
  2. #include "delay.h"
  3. #define PWM_FREQUENCY 490 /* Set the frequency to about 490 Hz for a standard beep */
  4. #define PWM_PERIOD (SystemCoreClock/PWM_FREQUENCY)
  5. /* Timer configuration in PWM mode */
  6. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  7. TIM_OCInitTypeDef TIM_OCInitStructure;
  8. /* Timer Handler */
  9. TIM_TypeDef* TimerCounterDevice = TIM2; /* The timer is connected to PA0 which is channel 1 of TIM2 */
  10. void Init_TimerPWM(uint16_t arr,uint16_t psc,uint16_t ccr1,uint16_t ccr2,uint16_t ccr3,uint16_t ccr4){
  11. TIM_TimeBaseStructure.TIM_Period=arr;
  12. TIM_TimeBaseStructure.TIM_Prescaler=psc;
  13. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  14. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
  15. TIM_TimeBaseInit(TimerCounterDevice,&TIM_TimeBaseStructure);
  16. TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  17. TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  18. TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  19. TIM_OCInitStructure.TIM_Pulse=ccr1;
  20. TIM_OC1Init(TimerCounterDevice,&TIM_OCInitStructure);
  21. TIM_OC1PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
  22. if(ccr2>0){
  23. TIM_OCInitStructure.TIM_Pulse=ccr2;
  24. TIM_OC2Init(TimerCounterDevice,&TIM_OCInitStructure);
  25. TIM_OC2PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
  26. }
  27. if(ccr3>0){
  28. TIM_OCInitStructure.TIM_Pulse=ccr3;
  29. TIM_OC3Init(TimerCounterDevice,&TIM_OCInitStructure);
  30. TIM_OC3PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
  31. }
  32. if(ccr4>0){
  33. TIM_OCInitStructure.TIM_Pulse=ccr4;
  34. TIM_OC4Init(TimerCounterDevice,&TIM_OCInitStructure);
  35. TIM_OC4PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
  36. }
  37. TIM_ARRPreloadConfig(TimerCounterDevice,ENABLE);
  38. TIM_Cmd(TimerCounterDevice, ENABLE);
  39. }
  40. void Beep_Init(void)
  41. {
  42. GPIO_InitTypeDef GPIO_InitStructure;
  43. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
  44. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  45. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  46. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  47. GPIO_Init(GPIOA, &GPIO_InitStructure);
  48. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
  49. NVIC_InitTypeDef NVIC_InitStructure;
  50. NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  51. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  52. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  53. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  54. NVIC_Init(&NVIC_InitStructure);
  55. TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  56. TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
  57. Init_TimerPWM(PWM_PERIOD-1,71,0xFFFF,0,0,0);
  58. }
  59. void Beep_On(void) //蜂鸣器打开
  60. {
  61. TIM_SetCompare1(TIM2, 0);
  62. }
  63. void Beep_Off(void) //蜂鸣器关闭
  64. {
  65. TIM_SetCompare1(TIM2, PWM_PERIOD-1);
  66. }
  67. int main(void)
  68. {
  69. Delay_Init();
  70. Beep_Init();
  71. while (1)
  72. {
  73. Beep_On();
  74. Delay_Ms(500);
  75. Beep_Off();
  76. Delay_Ms(500);
  77. }
  78. }

在此示例中,我们首先配置PA0引脚作为TIM2的通道1。然后我们设置TIM2的工作方式为PWM1,占空比由比较寄存器1控制。当比较寄存器1的值为0时,PWM信号的占空比为0,蜂鸣器不发声;当比较寄存器1的值为PWM_PERIOD-1时,PWM信号的占空比为100%,蜂鸣器发声。

在主循环中,我们每秒切换一次蜂鸣器的状态,使其发出"哔"的声音。

请注意,这只是一个基本的示例,并且可能需要根据你的具体需求进行修改。例如,你可能需要改变PWM信号的工作频率或调整延迟时间以获得不同的音调。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/554431
推荐阅读
相关标签
  

闽ICP备14008679号