GPIO—蜂鸣器

Posted 韦东山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GPIO—蜂鸣器相关的知识,希望对你有一定的参考价值。

14.1关于蜂鸣器

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

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

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

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

在这里插入图片描述

14.2硬件设计

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

14.3软件设计

14.3.1软件设计思路

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

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

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

14.3.2软件设计讲解

  1. 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时输出低电平,三极管不导通。

  1. 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类似,这里不再赘述。

  1. 方波输出函数

代码段 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输出方波的频率来改变蜂鸣器发声的
响度。

  1. 主函数测试

代码段 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

以上是关于GPIO—蜂鸣器的主要内容,如果未能解决你的问题,请参考以下文章

为啥树莓派有源蜂鸣器高低电平都响

STM32F407开发板用户手册第20章 STM32F407的GPIO应用之无源蜂鸣器

Linux——Linux驱动之完整的驱动操作硬件基础实践,Linux下如何像裸机那样通过GPIO控制蜂鸣器

Linux——Linux驱动之完整的驱动操作硬件基础实践,Linux下如何像裸机那样通过GPIO控制蜂鸣器

GPIO简介

STM32蜂鸣器实验(位操作)