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的下拉电阻,保证一旦电流过高,通过下拉电阻将电流导通至地;

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

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要控制无源蜂鸣器,你需要将其连接到STM32的某个GPIO引脚。然后,使用代码控制这个引脚的输出状态来控制蜂鸣器的开关。 以下是一个简单的示例代码,可以在STM32上控制无源蜂鸣器发声: ```c #include "stm32f4xx.h" #define BEEP_PIN GPIO_Pin_15 #define BEEP_PORT GPIOD void delay_ms(uint32_t ms) { SysTick->LOAD = 168000; // 1ms @168MHz SysTick->VAL = 0; SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk; for (uint32_t i = 0; i < ms; i++) { while (!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk)); } SysTick->CTRL = 0; } int main(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); GPIO_InitStruct.GPIO_Pin = BEEP_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(BEEP_PORT, &GPIO_InitStruct); while (1) { GPIO_SetBits(BEEP_PORT, BEEP_PIN); delay_ms(500); GPIO_ResetBits(BEEP_PORT, BEEP_PIN); delay_ms(500); } } ``` 在这个示例中,我们将无源蜂鸣器连接到了STM32的PD15引脚上,然后使用`GPIO_SetBits()`和`GPIO_ResetBits()`函数来控制这个引脚的电平状态。我们还定义了一个`delay_ms()`函数来进行延时,以便蜂鸣器能够发出声音。在`main()`函数中,我们循环地让蜂鸣器发出“哔哔”声。 需要注意的是,由于无源蜂鸣器没有内置的驱动电路,因此需要通过外部电路来提供驱动电压,否则它将无法发声。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值