STM32F4_蜂鸣器实验

目录

1. 硬件部分

2. 软件部分

2.1 库函数_蜂鸣器

2.1.1 书写步骤:

2.1.2 代码程序:


1. 硬件部分

        蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器电磁式蜂鸣器两种类型。 探索者STM32F4ZG开发板板载的蜂鸣器是电磁式的有源蜂鸣器;有源的意思是说蜂鸣器自带了震荡电路,一通电就会发声。无源蜂鸣器没有自带振荡电路,必须外部提供2-5KHz左右的方波驱动才能发声从对51单片机的学习中可以发现,51单片机的蜂鸣器想要发声,必须给到一个定时时间,在时间内使蜂鸣器的引脚BEEP=!BEEP;呈现方波振荡才能发声;而32单片机只要给到BEEP输出相应电平即可; 

        STM32F4xx系列的蜂鸣器部分原理图如图所示;BEEP接到MCU_PF8引脚上;我们知道,MCU单片机 IO口 的电流非常小,绝大多数起到控制作用,达不到驱动作用,尤其是对蜂鸣器等高耗能设备;所以需要通过三极管的放大作用对 IO口 的电流起到放大作用,蜂鸣器接到三极管的集电极,采用NPN型三极管; IO口不能直接驱动大功率器件NPN 三极管高电平运作;

        STM32F4 的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流是 30mA 左右;故需要三极管起放大作用;

R59的作用 基本三极管放大电路:防止输入电流过大,加一个电阻进行分流;但是需要注意:电阻阻值不能过大,否则会导致流入基级的电流过小;因此此处接的电阻阻值为1K;

R61的作用因为单片机默认 IO口 的状态为浮空状态(IO口 有三种状态:浮空、上拉和下拉);所以不确定的会出现有时的电流高,有时的电流低,但是基本上浮动不会很大;当出现电流偏高的情况时,可能对开发板一供电,GPIO内部处于一种上电状态,很不稳定,电流就会经NPN三极管放大后流入蜂鸣器,进而出现一通电蜂鸣器就会产生噪声;为了防止这种现象的发生,在基级接一个10K的下拉电阻,保证一旦电流过高,通过下拉电阻将电流导通至地;

STM32F4_蜂鸣器实验_第1张图片

2. 软件部分

2.1 库函数_蜂鸣器

2.1.1 书写步骤:

1. 使能 IO口 时钟。调用函数RCC_AHB1PeriphClockCmd();不同的外设调用的时钟使能的函数可能不一样;

2. 初始化IO口模式。调用函数GPIO_Init();

3. 操作IO口,输出高低电平;使用输出电平函数;

2.1.2 代码程序:

注意: 

        1. 当PF8输出高电平的时候,蜂鸣器将发声,当PF8输出低电平的时候,蜂鸣器停止发声。原理来自于NPN三极管的工作原理;

        2. NPN三极管高电平运作,所以在初始化上拉下拉时,需要初始化 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN(下拉);保证不会一通电就发声;

#include "stm32f4xx.h"


int main()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;  //推挽输出  直接控制GPIO口输出高低电平
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;  //设置GPIO下拉  因为蜂鸣器是高电平启动,为了防止开发板一启动蜂鸣器就会工作
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE); //时钟使能
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	while(1)
	{
		GPIO_SetBits(GPIOF,GPIO_Pin_8);
	}
}

LED0伴随BEEP进行发声、闪烁(也可以进行模块化)

#include "stm32f4xx.h"
#include "delay.h"

int main()
{
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_DOWN;
//	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	delay_init(168);
	while(1)
	{
		GPIO_ResetBits(GPIOF,GPIO_Pin_8);
		GPIO_ResetBits(GPIOF,GPIO_Pin_9);
		delay_ms(300);
		GPIO_SetBits(GPIOF,GPIO_Pin_8);
		GPIO_SetBits(GPIOF,GPIO_Pin_9);
		delay_ms(300);
	}
}
#ifndef _BEEP__H_
#define _BEEP__H_
#include "sys.h"


#define BEEP PFout(8)   //位段定义

void BEEP_Init(void);

#endif

你可能感兴趣的:(STM32,stm32,单片机,物联网)