Advertisement

STM32F103 有源蜂鸣器 无源蜂鸣器驱动范例

阅读量:

1.无源蜂鸣器

其价格低廉且操作简便。然而其内部缺乏激励装置,因此我们需要持续调节IO端口电平,通过生成特定频率的方波信号并驱动振动装置使其振动,从而实现发声的目的。当输入不同频率的方波信号时,蜂鸣器将发出相应不同的声音。

2.有源蜂鸣器

相比于无源蜂鸣器而言的价格稍高,在功能上却更为简便。该设备配备多种振荡电路,在接入额定电压直流电源后即可产生所需特定频率的声音;然而由于其内部振荡电路决定了声音的参数(如频率),无法自行调节。

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

复制代码
 #include "stm32f10x.h"

    
 #include "delay.h"
    
  
    
 #define BEEP_GPIO_PORT	GPIOA //定义蜂鸣器所使用的GPIO口为PA4
    
  
    
 void Beep_Init(void)
    
 {
    
   GPIO_InitTypeDef GPIO_InitStructure;
    
  
    
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	//使能PA时钟
    
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;			//PB6输出
    
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	//推挽输出
    
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
    
   GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStructure);		//初始化GPIOB6
    
 }
    
  
    
 void Beep_On(void) //蜂鸣器打开
    
 {
    
   GPIO_SetBits(BEEP_GPIO_PORT, GPIO_Pin_5);
    
 }
    
  
    
 void Beep_Off(void) //蜂鸣器关闭
    
 {
    
   GPIO_ResetBits(BEEP_GPIO_PORT, GPIO_Pin_5);
    
 }
    
  
    
 int main(void)
    
 {
    
   Delay_Init();
    
   Beep_Init();
    
  
    
   while (1)
    
   {
    
     Beep_On();
    
     Delay_Ms(500);
    
     Beep_Off();
    
     Delay_Ms(500);
    
   }
    
 }
    
    
    
    
    代码解读

在这个例子中,我们首先初始化了PA口的时钟并将其PA4引脚配置为摆动输出模式。接着我们创建了两个函数Beep_On()Beep_Off()以实现蜂鸣器的开关控制。

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

请特别注意以下内容仅作为一个参考案例,并建议根据实际需求进行相应的调整。比如,在蜂鸣器的工作频率或延迟时间等方面做出改动可能会产生不同的音调效果

本例中展示了基于STM32F103开发的一个基于TIM模块实现的PWM信号生成系统用于控制无源蜂鸣器

无源蜂鸣器与有源蜂鸣器存在显著差异,在结构上无内部电路系统的情况下无法单独依靠数字信号实现发声控制;相反地,则必须借助于一个周期性变化的PWM信号来驱动其工作。

复制代码
 #include "stm32f10x.h"

    
 #include "delay.h"
    
  
    
 #define PWM_FREQUENCY   490       /* Set the frequency to about 490 Hz for a standard beep */
    
 #define PWM_PERIOD      (SystemCoreClock/PWM_FREQUENCY)
    
  
    
 /* Timer configuration in PWM mode */
    
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    
 TIM_OCInitTypeDef TIM_OCInitStructure;
    
  
    
 /* Timer Handler */
    
 TIM_TypeDef* TimerCounterDevice = TIM2; /* The timer is connected to PA0 which is channel 1 of TIM2 */
    
  
    
 void Init_TimerPWM(uint16_t arr,uint16_t psc,uint16_t ccr1,uint16_t ccr2,uint16_t ccr3,uint16_t ccr4){
    
     
    
     TIM_TimeBaseStructure.TIM_Period=arr;
    
     TIM_TimeBaseStructure.TIM_Prescaler=psc;
    
     TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
    
     TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    
     TIM_TimeBaseInit(TimerCounterDevice,&TIM_TimeBaseStructure);
    
  
    
     TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
    
     TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
    
     TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
    
     TIM_OCInitStructure.TIM_Pulse=ccr1;
    
     TIM_OC1Init(TimerCounterDevice,&TIM_OCInitStructure);
    
     TIM_OC1PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
    
  
    
     if(ccr2>0){
    
     TIM_OCInitStructure.TIM_Pulse=ccr2;
    
     TIM_OC2Init(TimerCounterDevice,&TIM_OCInitStructure);
    
     TIM_OC2PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
    
     }
    
  
    
     if(ccr3>0){
    
     TIM_OCInitStructure.TIM_Pulse=ccr3;
    
     TIM_OC3Init(TimerCounterDevice,&TIM_OCInitStructure);
    
     TIM_OC3PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
    
     }
    
  
    
     if(ccr4>0){
    
     TIM_OCInitStructure.TIM_Pulse=ccr4;
    
     TIM_OC4Init(TimerCounterDevice,&TIM_OCInitStructure);
    
     TIM_OC4PreloadConfig(TimerCounterDevice,TIM_OCPreload_Enable);
    
     }
    
  
    
     TIM_ARRPreloadConfig(TimerCounterDevice,ENABLE);
    
     TIM_Cmd(TimerCounterDevice, ENABLE);
    
 }
    
  
    
 void Beep_Init(void)
    
 {
    
     GPIO_InitTypeDef GPIO_InitStructure;
    
  
    
     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
    
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    
     GPIO_Init(GPIOA, &GPIO_InitStructure);
    
     
    
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    
     NVIC_InitTypeDef NVIC_InitStructure;
    
     NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    
     NVIC_Init(&NVIC_InitStructure);
    
  
    
     TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
    
     TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
    
  
    
     Init_TimerPWM(PWM_PERIOD-1,71,0xFFFF,0,0,0);
    
 }
    
  
    
 void Beep_On(void) //蜂鸣器打开
    
 {
    
     TIM_SetCompare1(TIM2, 0);
    
 }
    
  
    
 void Beep_Off(void) //蜂鸣器关闭
    
 {
    
     TIM_SetCompare1(TIM2, PWM_PERIOD-1);
    
 }
    
  
    
 int main(void)
    
 {
    
     Delay_Init();
    
     Beep_Init();
    
  
    
     while (1)
    
     {
    
     Beep_On();
    
     Delay_Ms(500);
    
     Beep_Off();
    
     Delay_Ms(500);
    
     }
    
 }
    
    
    
    
    代码解读

在此示例中

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

请特别注意这一案例仅仅作为一个参考案例,并建议根据实际应用场景进行相应调整。例如,在实际应用中你可能需要根据具体情况采取不同措施:比如考虑调节PWM信号的工作频率以及系统延迟时间等参数来实现最佳的声音效果。

全部评论 (0)

还没有任何评论哟~