无源蜂鸣器模块简介
-
功能:通过输入不同频率的 PWM 信号,产生不同音调的声音。
-
接口:单引脚控制,需外部提供 PWM 信号。
-
应用:报警、提示音等场景。
硬件连接
蜂鸣器引脚 | 功能 | STM32 连接 |
---|---|---|
VCC | 电源输入 (+3.3V) | 3.3V |
GND | 地 | GND |
SIG | 控制信号 | PA1 |
软件部分
蜂鸣器通过定时器外设生成 PWM 信号控制。我们通过使能定时器来决定是否生成PWM,从而来控制蜂鸣器是否发声,实现我们按键提示音的功能。
蜂鸣器初始化
void BEEP_PWM_Init(void)
{
TIMx_GPIO_Config();
TIM_Mode_Config();
}
TIMx_GPIO_Config();
初始化对应的IO口,相信大家非常的熟悉了,由于我们需要使用定时器通道生成PWM,所以需要设置成复用模式。
/**
* @brief 配置TIM复用输出PWM时用到的I/O
* @param 无
* @retval 无
*/
static void TIMx_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef类型的结构体*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启LED相关的GPIO外设时钟*/
RCC_AHB1PeriphClockCmd ( BEEP_GPIO_CLK, ENABLE);
GPIO_PinAFConfig(BEEP_GPIO_PORT,BEEP_PINSOURCE,BEEP_AF);
/*BEEPATH_LED1*/
GPIO_InitStructure.GPIO_Pin = BEEP_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(BEEP_GPIO_PORT, &GPIO_InitStructure);
}
TIM_Mode_Config();
很经典的一个利用定时器外设生成PWM的代码,注意我们最后使能了对应定时器,来决定是否成功PWM波形,从而通过这个来控制我们的蜂鸣器。
/**
* @brief 配置TIM输出的PWM信号的模式,如周期、极性
* @param 无
* @retval 无
*/static void TIM_Mode_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;BEEP_TIM_APBxClock_FUN(BEEP_TIM_CLK, ENABLE);
TIM_TimeBaseStructure.TIM_Period = (1000-1); //当定时器从0计数到 TIM_Period+1 ,为一个定时周期
TIM_TimeBaseStructure.TIM_Prescaler = 25; //设置预分频
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ; //设置时钟分频系数:不分频(这里用不到)
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式// 初始化定时器TIMx, x[2,3,4,5]
TIM_TimeBaseInit(BEEP_TIM, &TIM_TimeBaseStructure);
/*PWM模式配置*/
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //配置为PWM模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能输出
TIM_OCInitStructure.TIM_Pulse = 12; //设置初始PWM脉冲宽度为0
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //当定时器计数值小于CCR1_Val时为低电平 LED灯亮
BEEP_TIM_OCxInit(BEEP_TIM, &TIM_OCInitStructure); //使能通道/*使能通道重载*/
BEEP_TIM_OCxPreloadConfig(BEEP_TIM, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(BEEP_TIM, ENABLE); //使能TIM重载寄存器ARR// 使能计数器
TIM_Cmd(BEEP_TIM, DISABLE);
}
控制蜂鸣器
我们要使用蜂鸣器来发出按键提示音,其实就是一个短暂的发声,我们这个封装好了,在按键按下之后,我们只需要调用一次这个函数,就可以发出按键提示音了。
uint8_t BEEP_TOGGLE(uint8_t time, uint16_t nms)
{
uint16_t i;
for(i=0; i<time; i++)
{
BEEP_OUT;
delay_ms(nms);
BEEP_STOP;
delay_ms(nms);
}
}
就是开启蜂鸣器之后,延时一会,就又关掉了,这里我们开启蜂鸣器和关闭蜂鸣器也非常简单,就是使能以及使能定时器,我们跳转到 BEEP_OUT 和 BEEP_STOP 中可以看到。