问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

有源蜂鸣器与无源蜂鸣器的区别及单片机驱动方法详解

创作时间:
作者:
@小白创作中心

有源蜂鸣器与无源蜂鸣器的区别及单片机驱动方法详解

引用
CSDN
1.
https://blog.csdn.net/qq_42250136/article/details/142332886

蜂鸣器是电子项目中常用的声学元件,用于产生声音提示。根据内部结构的不同,蜂鸣器可分为有源蜂鸣器和无源蜂鸣器两种类型。本文将详细介绍这两种蜂鸣器的区别,并提供使用单片机驱动它们的具体方法和代码示例。

有源蜂鸣器与无源蜂鸣器区别

有源蜂鸣器与无源蜂鸣器的主要区别在于是否有振荡源。

  • 有源蜂鸣器:内部自带振荡源,只需在正负极上加对应的供电电压即可驱动发声。
  • 无源蜂鸣器:没有振荡源,需要外接驱动电路才能发声。

有源蜂鸣器

有源蜂鸣器内部已经集成了驱动电路,使用时只需在两端加上对应的电压即可。通常,有源蜂鸣器的引脚区分正负极,且输出频率是固定的。

无源蜂鸣器

无源蜂鸣器需要外接驱动电路才能发声,引脚不分正负极。驱动电路通常使用PWM信号,通过控制频率和占空比来产生声音。

模块化有源蜂鸣器及无源蜂鸣器驱动方式的说明

模块化的蜂鸣器外观相似,可通过以下方法区分:

  1. 供电测试:给VCC和GND供电,然后在I/O口输入低电平(或高电平,取决于模块规格)。
  • 如果蜂鸣器发声,则为有源蜂鸣器。
  • 如果蜂鸣器无声,可能是无源蜂鸣器或模块损坏。
  1. 方波信号测试:在I/O口输入方波信号。
  • 如果蜂鸣器发声,则为无源蜂鸣器。
  • 如果依旧无声,需要检查信号驱动能力和地线连接情况。

有源、无源蜂鸣器代码驱动

有源蜂鸣器驱动代码

有源蜂鸣器只需通过单片机IO口输出一个高/低电平信号即可驱动。

int main(void)
{
    /*开启时钟*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);	//开启GPIOB的时钟
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;					//定义结构体变量
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//GPIO模式,赋值为推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;				//GPIO引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		//GPIO速度,赋值为50MHz
    GPIO_Init(GPIOB, &GPIO_InitStructure);				    //实现GPIOB的初始化
    while (1)
    {
        GPIO_ResetBits(GPIOB, GPIO_Pin_9);		//将PB9引脚设置为低电平,蜂鸣器鸣叫
        Delay_ms(200);							//延时100ms
        GPIO_SetBits(GPIOB, GPIO_Pin_9);		//将PB9引脚设置为高电平,蜂鸣器停止
        Delay_ms(200);							//延时100ms
    }
}

无源蜂鸣器驱动代码

无源蜂鸣器需要通过单片机IO口输出一个方波信号来驱动。

void PWM_Init(void)
{
    /*开启时钟*/
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
    /*GPIO初始化*/
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA0引脚初始化为复用推挽输出	
    /*配置时钟源*/
    TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
    
    /*时基单元初始化*/
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
    TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;					//计数周期,即ARR的值
    TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;				//预分频器,即PSC的值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);             
    /*输出比较初始化*/
    TIM_OCInitTypeDef TIM_OCInitStructure;							//定义结构体变量
    TIM_OCStructInit(&TIM_OCInitStructure);							//结构体初始化,若结构体没有完整赋值
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//输出比较模式,选择PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;		//输出极性,选择为高,若选择极性为低,则输出高低电平取反
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输出使能
    TIM_OCInitStructure.TIM_Pulse = 0;								//初始的CCR值
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);						//将结构体变量交给TIM_OC1Init,配置TIM2的输出比较通道1
    /*TIM使能*/
    TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
}

void PWM_SetCompare1(uint16_t Compare)
{
    TIM_SetCompare1(TIM2, Compare);		//设置CCR1的值
    //这里的ARR+1正好是100 所以CCR设置为多少占空比就是多少
}

无源蜂鸣器驱动代码主要是PWM的输出,通过改变频率可以改变输出声音的音调。

总结

  1. 区分好有源、无源蜂鸣器后再进行驱动,不要不发声就认为模块是坏的。
  2. 有些贴片式的无源蜂鸣器有多个引脚,需要查看手册区分引脚功能。
  3. 有源蜂鸣器区分正负,一般长脚正、短脚负;无源蜂鸣器不分正负。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号