STM32入坑(四)让你的蜂鸣器响起来


简介

名称:驱动蜂鸣器
功能:蜂鸣器实现报警音,类似于哔哔哔哔…
硬件资源:STM32开发板,有源蜂鸣器及外围电路

蜂鸣器原理

1、按其驱动方式的原理分,可分为:有源蜂鸣器(内含驱动线路)和无源蜂鸣器(外部驱动,本文所说的即是此蜂鸣器);
无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。
在这里插入图片描述
①从图a、b外观上看,如将两种蜂鸣器的引脚朝上放置时,可以看出有绿色电路板的一种是无源蜂鸣器,没有电路板而用黑胶封闭的一种是有源蜂鸣器。
②万用表测电阻区别用万用表电阻档Rxl档测试:用黑表笔接蜂鸣器 "+"引脚,红表笔在另一引脚上来回碰触,如果触发出咔、咔声的且电阻只有8Ω(或16Ω)的是无源蜂鸣器;如果能发出持续声音的,且电阻在几百欧以上的,是有源蜂鸣器。
③同时有源蜂鸣器直接接上额定电源(新的蜂鸣器在标签上都有注明)就可连续发声;而无源蜂鸣器则和电磁扬声器一样,需要接在音频输出电路中才能发声。

2、按构造方式的不同,可分为:电磁式蜂鸣器和压电式蜂鸣器;

压电式蜂鸣器,用的是压电材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变。

电磁式蜂鸣器,主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜。

由于两种蜂鸣器发音原理不同,压电式结构简单耐用但音调单一音色差,适用于报警器等设备。而电磁式由于音色好,所以多用于语音、音乐等设备。

3.优点不同
无源蜂鸣器的优点是:
①便宜;
②声音频率可控,可以做出“多来米发索拉西”的效果;
③在一些特例中,可以和LED复用一个控制口。

有源蜂鸣器的优点是:
①程序控制方便

蜂鸣器电路

在这里插入图片描述
蜂鸣器电路并不向前文所说的LED电路一样,由于蜂鸣器是感性器件,瞬间断电会有很大的反向电动势,因此对电路的要求比较严谨。好多电路中都没有蜂鸣器两端的二极管。

D09二极管的作用是续流作用,防止瞬间的反向电流击穿器件。
R15的作用是B极刚开始有信号的瞬间限流用的。
R18的作用是为了IO浮空时,下拉,确认电平。而且有一定的防静电的作用。三极管断开后也可以释放BE寄生电容的电量。

R15 R18不可接反,接反则无法正常导通

配置方法及程序

虽然蜂鸣器电路较LED电路的要求比较严谨,但是其控制方式和LED无差别,主要有以下几个步骤:

1. 配置LED和蜂鸣器端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void BEEP_Init()
{
    GPIO_InitTypeDef GPIO_InitStruct;
    //配置BEEP
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //使能GPIOC时钟
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOC,&GPIO_InitStruct);
    GPIO_SetBits(GPIOC,GPIO_Pin_8);
   
    //配置LED
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能GPIOA时钟
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
    GPIO_Init(GPIOA,&GPIO_InitStruct);
    GPIO_SetBits(GPIOA,GPIO_Pin_8);
}

2.main函数中对BEEP和delay进行初始化

1
2
    delay_init();
    BEEP_Init();

3.在while中实现蜂鸣器哔哔哔

1
2
3
4
5
6
7
8
9
    while(1)
    {
        GPIO_SetBits(GPIOC,GPIO_Pin_8);     //BEEP响
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);   //LED灯亮
        delay_ms(10000);
        GPIO_ResetBits(GPIOC,GPIO_Pin_8);   //BEEP不响
        GPIO_SetBits(GPIOA,GPIO_Pin_8);     //LED灯灭
        delay_ms(10000);
    }

注意事项

  1. 蜂鸣器电路必须要有续流二极管或续流电阻,切记
  2. 这里用的是有源蜂鸣器,给特定电平就会发声,如果是无源蜂鸣器,则不会发声

程序已经过调试验证,蜂鸣器和LED灯工作正常

完整程序传送门:
//download.csdn.net/download/m0_46195580/12504040