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);
    }
}

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

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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值