【STM32】标准库与HAL库对照学习教程外设篇--蜂鸣器
一、前言
本篇文章是对STM32驱动蜂鸣器的讲解,通过原理的简单介绍与工程的配置,能让您快速掌握蜂鸣器的使用。 |
二、准备工作
- STM32开发板(我用的是普中的STM32F103ZE开发板)
- cubemx软件、keil 5(MDK)
- 开发板原理图
三、蜂鸣器简介
蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电。
蜂鸣器在结构上分为:压电式蜂鸣器和电磁式蜂鸣器。
- (1)压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成,当接通电源后(1.5~15V直流工作电压),多谐振荡器起振,输出1.5~5kHZ的音频信号,阻抗匹配器推动压电蜂鸣片发声。
- (2)电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。
蜂鸣器在驱动上分为:有源蜂鸣器与无源蜂鸣器。“源”是指有没有自带震荡电路。
- (1)有源蜂鸣器自带了震荡电路,一通电就会发声,电磁式蜂鸣器属于有源蜂鸣器。
- (2)无源蜂鸣器则没有自带震荡电路,必须外部提供 1.5~5Khz 左右的方波驱动才能发声,压电式蜂鸣器属于无源蜂鸣器。
四、硬件图
硬件图根据自己开发板的原理图,我的是无源蜂鸣器。 根据 STM32F103 芯片数据手册可知, 单个 IO 口的最大输出电流是 25mA,而蜂鸣器的驱动电流是 30mA 左右。
这时有的朋友就想直接用IO口来驱动蜂鸣器,但没有考虑整个芯片的电流,整个芯片最大输出也就150mA,如果在驱动蜂鸣器上耗掉了30mA,STM32使用其他的IO输出的电流就会变少。
因此IO做了外围电路,通过上图的NPN三级管(S8050)放大电流,IO只需要输出不到1mA的电流就可以控制蜂鸣器。
上图的R38主要用于防止蜂鸣器的误发声,当IO口输出高电平时,蜂鸣器发声,当IO口输出低电平时,蜂鸣器停止发声。 有关GPIO口不懂的可以看这篇文章: 【STM32】标准库与HAL库对照学习教程特别篇–GPIO详讲 有关IO口配置可以看这篇文章: 【STM32】标准库与HAL库对照学习教程三–使用库函数配置GPIO点亮LED灯
五、标准库驱动蜂鸣器
main.c
#include "LED.h"
#include "Delay.h"
#include "System.h"
#include "beep.h"
int main()
{
SysTick_Init(72);
LED_Init();
BEEP_Init();
while(1)
{
LED_0 = !LED_0;
BEEP = !BEEP;
Delay_ms(500);
}
}
beep.c
#include "beep.h"
void BEEP_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(BEEP_RCC, ENABLE);
GPIO_InitStruct.GPIO_Pin = BEEP_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(BEEP_GPIO_Port, &GPIO_InitStruct);
GPIO_ResetBits(BEEP_GPIO_Port, BEEP_Pin);
}
beep.h
#ifndef BEEP_H_
#define BEEP_H_
#include "stm32f10x.h"
#define BEEP_GPIO_Port GPIOB
#define BEEP_Pin GPIO_Pin_8
#define BEEP_RCC RCC_APB2Periph_GPIOB
#define BEEP PBout(8)
void BEEP_Init(void);
#endif
本程序使用了有关于位带的文件,有关于位带不懂的可以看这篇文章:【STM32】标准库与HAL库对照学习教程六–位带操作
六、HAL库驱动蜂鸣器
HAL库我们使用cubemx配置工程,相关配置操作在【STM32】标准库与HAL库对照学习教程三–使用库函数配置GPIO点亮LED灯里已经有详细说明,这里只放相关配置图,具体生成工程不再详细阐述。 ① ② ③ ④ ⑤ ⑥ main.c
HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin);
HAL_Delay(500);
到这里就结束啦!
|