LVGL+FreeRTOS实战项目:智能健康助手(无源蜂鸣器​​篇)

无源蜂鸣器模块简介

  • 功能:通过输入不同频率的 PWM 信号,产生不同音调的声音。

  • 接口:单引脚控制,需外部提供 PWM 信号。

  • 应用:报警、提示音等场景。

硬件连接

蜂鸣器引脚功能STM32 连接
VCC电源输入 (+3.3V)3.3V
GNDGND
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 中可以看到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值