GPIO—蜂鸣器

14.1关于蜂鸣器

蜂鸣器是一种常见的电子发声元器件,采用直流电压供电,广泛应用于计算机、打印机、报警器、电子玩具、汽车电子设备等产品中,常见的蜂鸣器可分为有源蜂鸣器和无源蜂鸣器。

有源蜂鸣器:内部有震荡源,只要通电即可自动发出固定频率的声音。

无源蜂鸣器:内部无震荡源,需要外部脉冲信号驱动发声,声音频率可变。

两种蜂鸣器实物如图 14.1.1 所示,从外观上来看两种蜂鸣器形状相似,有源蜂鸣器底部有黑胶密封,无源蜂鸣器底部可看到电路板(图中绿色部分),两种蜂鸣器都标注有正负极。

14.2硬件设计

通常蜂鸣器需要的驱动电流比较大,使用GPIO直接驱动蜂鸣器比较吃力,通常使用如图 14.2.1 所示电路。由GPIO控制三极管通断,蜂鸣器由系统电源驱动,MCU只需要很小的电流便可控制蜂鸣器。 Q1为NPN三极管,发射极(E)接地,基极(B)接单片机引脚PA8,集电极(C)接蜂鸣器到电源。 当PA8输出低电平,UBEUon,三极管导通,此时蜂鸣器工作。

14.3软件设计

14.3.1软件设计思路

实验目的:本实验通过控制GPIO输出指定频率,驱动蜂鸣器发声。

引脚初始化:GPIO端口时钟使能、GPIO引脚设置为输出(PA8);封装蜂鸣器函数:其中方波周期的延时,使用HAL库延时函数HAL_Delay()实现;主函数改变方波的延时时间(即改变其周期),控制蜂鸣器声音;

本实验配套代码位于“5_程序源码\7_GPIO—蜂鸣器\”。

14.3.2软件设计讲解

GPIO选择与接口定义

代码段 14.3.1 蜂鸣器引脚宏定义(driver_buzzer.h)

/*********************

* 引脚宏定义

**********************/

#define Buzzer_GPIO_PIN GPIO_PIN_8

#define Buzzer_GPIO_PORT GPIOA

#define Buzzer_GPIO_CLK_EN() __HAL_RCC_GPIOA_CLK_ENABLE()

/*********************

* 函数宏定义

**********************/

#define Buzzer(flag) HAL_GPIO_WritePin(Buzzer_GPIO_PORT, Buzzer_GPIO_PIN, flag?GPIO_PIN_SET:GPIO_PIN_RESET)

根据原理图可知蜂鸣器的控制引脚是PA8,因此引脚组和引脚号分别对应GPIOG、GPIO_PIN_8,引脚 时钟使能函数是__HAL_RCC_GPIOA_CLK_ENABLE()。对其输出函数宏定义成接口Buzzer(flag),flag为1时输出高电平,三极管导通,flag为0时输出低电平,三极管不导通。

GPIO初始化

代码段 14.3.2 蜂鸣器引脚初始化(driver_buzzer.c)

/*

* 函数名:void BuzzerInit(void)

* 输入参数:无

* 输出参数:无

* 返回值:无

* 函数作用:初始化蜂鸣器的引脚

*/

void BuzzerInit(void) {

// 定义 GPIO 的结构体变量

GPIO_InitTypeDef GPIO_InitStruct = {0};

// 使能蜂鸣器的 GPIO 对应的时钟

Buzzer_GPIO_CLK_EN();

GPIO_InitStruct.Pin = Buzzer_GPIO_PIN; // 选择蜂鸣器的引脚

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 设置为推挽输出模式

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 引脚反转速度设置为快

// 初始化引脚配置

HAL_GPIO_Init(Buzzer_GPIO_PORT, &GPIO_InitStruct);

// 关闭蜂鸣器

Buzzer(0); }

引脚初始化内容与前面LED类似,这里不再赘述。

方波输出函数

代码段 14.3.3 方波输出函数(driver_buzzer.c)

/*

* 函数名:void ControlBuzzerRang(uint16_t period)

* 输入参数:period-蜂鸣器发出响声的周期,f=1/(2*period)

* *输出参数:无

* 返回值:无

* 函数作用:输出方波

*/

void ControlBuzzerRang(uint16_t period)

{

Buzzer(1);

HAL_Delay(period);

Buzzer(0);

HAL_Delay(period); }

通过HAL_Delay()延时函数来实现方波周期的变换,从而控制PA8输出方波的频率来改变蜂鸣器发声的 响度。

主函数测试

代码段 14.3.4 蜂鸣器主函数(main.c)

// 初始化蜂鸣器

BuzzerInit();

while(1) {

for(i=0; i<10; i++) {

ControlBuzzerRang(i); // 蜂鸣器响 i ms,然后不响 i ms,构成一个 1/(2*i)kHz 频率的蜂鸣器响应

} }

首先对蜂鸣器的引脚进行初始化;然后通过一个for()循环改变局部变量i的值使其从0每次递增1至10, 而这个i就是方波输出周期的一半。通过改变局部变量i来改变方波的周期,从而改变蜂鸣器的音调。

蜂鸣器实验本质和LED实验一样,生活中很多模块也一样,只需要控制GPIO即可控制模块,实现相应 效果。

这里只是简单的控制了蜂鸣器供读者参考,在一些应用中,通过定时器或PWM控制蜂鸣器频率,实现 播放简单音乐。

14.4实验效果

本实验对应配套资料的“5_程序源码\7_GPIO—蜂鸣器\”。打开工程后,编译,下载,可以听到蜂鸣器 发出声音。

百问网技术论坛: http://bbs.100ask.net/

百问网嵌入式视频官网: https://www.100ask.net/index

百问网开发板: 淘宝:https://100ask.taobao.com/ 天猫:https://weidongshan.tmall.com/

技术交流群(鸿蒙开发/Linux/嵌入式/驱动/资料下载) QQ群:869222007(已满)752871361

单片机-嵌入式Linux交流群: QQ群:536785813