【STM32 基础实验蜂鸣器发声】

2023-05-16

文章目录

  • 一、认识蜂鸣器
    • (1)蜂鸣器
    • (2)蜂鸣器分类
  • 二、基于stm32f10c8t6 基础实验蜂鸣器发声
    • (1)本实验蜂鸣器型号说明
    • (2)蜂鸣器发声原理
    • (3)代码部分
    • (4)效果展示
  • 三、总结与扩展
      • 附上参考文献链接与视频链接出处

一、认识蜂鸣器

(1)蜂鸣器

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。

(2)蜂鸣器分类

BUZZER蜂鸣器的分类:
1、按其驱动方式的原理分,可分为:有源蜂鸣器(内含驱动线路,也叫自激式蜂鸣器)和无源蜂鸣器(外部驱动,也叫他激式蜂鸣器);
2、按构造方式的不同,可分为:电磁式蜂鸣器压电式蜂鸣器
3、按封装的不同,可分为:DIP BUZZER(插针蜂鸣器)和SMD BUZZER(贴片式蜂鸣器);
4、按电流的不同,可分为:直流蜂鸣器交流蜂鸣器,其中,以直流最为常见压电式蜂鸣器,用的是压电材料,即当受到外力导致压电材料发生形变时压电材料会产生电荷。同样,当通电时压电材料会发生形变。
电磁式蜂鸣器,主要是利用通电导体会产生磁场的特性,用一个固定的永久磁铁与通电导体产生磁力推动固定在线圈上的鼓膜。
由于两种蜂鸣器发音原理不同,压电式结构简单耐用但音调单一,适用于报警器等设备。而电磁式由于音质好,所以多用于语音、音乐等设备。

二、基于stm32f10c8t6 基础实验蜂鸣器发声

(1)本实验蜂鸣器型号说明

笔者本次实验用到的是有源蜂鸣器与无源蜂鸣器,见下图所示:
有源蜂鸣器模块:
无源蜂鸣器模块:

(2)蜂鸣器发声原理

有源蜂鸣器模块低电平触发,通过配置I/O口,给它低电平即可发声。可见电路图如下:
有源蜂鸣器电路图:
无源蜂鸣器模块,通过配置方波,方波的话可以联想到PWM,使配置PWM占空比、频率即可驱动发声。可见电路图如下:
无源蜂鸣器电路图:

然后了解一下PWM
我们就以以STM32单片机为例,其IO口只能输出高电平和低电平。

假设高电平为5V、低电平则为0V,那么要输出不同的模拟电压就要用到PWM。通过改变IO口输出的方波的占空比,从而获得使用数字信号模拟成的模拟电压信号。

电压是以一种脉冲序列被加到模拟负载上去的,接通时是高电平1,断开时是低电平0。接通时直流供电输出,断开时直流供电断开。通过对接通和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值5V的模拟电压。

比方说,占空比为50%那就是高电平时间一半,低电平时间一半。在一定的频率下,就可以得到模拟的2.5V输出电压。那么75%的占空比,得到的电压就是3.75V,如下图所示。

在这里插入图片描述

也就是说,在一定的频率下,通过不同的占空比即可得到不同大小的输出模拟电压,PWM就是通过这种原理实现数字模拟信号转换的。

PWM应用
以经常使用的呼吸灯举例。
LED呼吸灯本次实验也使用了一颗LED来实现呼吸灯,衬托无源蜂鸣器的实验现象,

一般人眼睛对于80Hz以上刷新频率则完全没有闪烁感,那么我们平时见到的LED灯,当它的频率大于50Hz的时候,人眼就会产生视觉暂留效果,基本就看不到闪烁了,而是误以为是一个常亮的LED灯。

由于频率很高时看不到闪烁,占空比越大LED越亮,占空比越小LED越暗。所以,在频率一定时,可以用不同占空比改变LED灯的亮度,使其达到一个呼吸灯的效果。

(3)代码部分

有源蜂鸣器部分代码:(用了一颗LED循环闪烁,表示正在跑程序)
beep.c

#include "sys.h"
#include "beep.h"

void BEEP_Init(void)
 {
	GPIO_InitTypeDef  GPIO_InitStructure;//声明结构体——GPIO
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//时钟使能GPIOB
	 //RCC APB2PeriphClockcmd(RCC APB2Periph GPIOB | RCC APB2Periph AFIO,ENABLE); 
	 //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//定义引脚pin_8 
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//频率50Mhz
	GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOB
	GPIO_SetBits(GPIOB,GPIO_Pin_8);//低电平触发所以置位高电平
 }
 

main.c

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"

int main()
{
	BEEP_Init();
	delay_init();	
	LED_Init();
	
	while(1)
	{

	  shansuo();
		GPIO_SetBits(GPIOB,GPIO_Pin_8);  
		delay_ms(500);
		GPIO_ResetBits(GPIOB,GPIO_Pin_8); 
		delay_ms(500);
		
	}
}



// An highlighted block
var foo = 'bar';

无源蜂鸣器部分代码:(用了一颗LED循环呼吸灯,表示正在跑程序)
pwm.c

#include "stm32f10x.h"


void PWM_Init(void)
{
 	GPIO_InitTypeDef  GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;//输出比较的结构体
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//时钟使能GPIOA
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //时钟使能
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);  //复用时开启
	//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE); //重映射
	//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //解除PA15调试功能
	

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_7;//定义引脚pin_0|Pin_15
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出模式,改变引脚控制权给片上外设
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//频率50Mhz
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	
	TIM_InternalClockConfig(TIM2);
	TIM_InternalClockConfig(TIM3);
	
	TIM_TimeBaseInitStructure.TIM_ClockDivision =TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInitStructure.TIM_Period = 100-1; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到20为2ms  //ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720-1; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  //psc
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
	
	TIM_OCStructInit(&TIM_OCInitStructure);//用StructInit赋初始值函数,可避免语法错误
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出比较的模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较的极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较的使能
	TIM_OCInitStructure.TIM_Pulse = 0;//输出比较配置CCR条件码寄存器  //占空比50%  占空比10%   占空比90%  
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);//查看引脚定义表知道,非重映射默认只有PA0输出
	TIM_OC2Init(TIM3,&TIM_OCInitStructure);
	

	
	/*公式:PWM频率:Freq = CK_PSC/(PSC+1)/(ARR+1)
					PWM占空比:Doty = CCR/(ARR+1)
					PWM分辨率:Reso = 1/(ARR+1)   */
  TIM_Cmd(TIM2, ENABLE);  //使能TIMx外设
	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}

void PWM_SetCompare1(uint16_t Compare1)//单独更改通道1的值对应TIM_OC1Init ,从而改变CCR实现占空比变化
{
	TIM_SetCompare1(TIM2, Compare1);
	
}

void PWM_SetCompare2(uint16_t Compare2)//单独更改通道1的值对应TIM_OC2Init ,从而改变CCR实现占空比变化
{
	TIM_SetCompare2(TIM3, Compare2);
	
}


main.c

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "pwm.h"

uint8_t i;

int main(void)
{	
	
	delay_init();	    	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	PWM_Init();
	
	
	while(1)
	{
		for(i=0;i<=100;i++)
		{
			PWM_SetCompare1(i);
			PWM_SetCompare2(i);
			delay_ms(20);
		}
		for(i=0;i<=100;i++)
		{
			PWM_SetCompare1(100-i);
			PWM_SetCompare2(100-i);
			delay_ms(20);
		}
	}
}

(4)效果展示

(声音可能刺耳,注意调节音量;声音已做过处理)
实验现象:有源蜂鸣器发声鸣叫

有源蜂鸣器


实验现象:无源蜂鸣器发声鸣叫

无源蜂鸣器

三、总结与扩展

总结:
根据以上内容,学习有源蜂鸣器,跟LED类似还是容易理解的,给电信号驱动发声。
无源蜂鸣器主要是应用PWM使能方波,驱动发声。
针对可能出现的问题,说明一下:
(1)蜂鸣器模块的触发的电平与代码对应
(2)蜂鸣器声音小,可能是额定电压或功率不够,可适当提高电压;还可能是硬件坏了的问题,或者铜暴露出来导致的短路。
所以要有信心一步步积累理论和实践经验,一起学习加油!
扩展:可通过有源蜂鸣器可以做警报、提醒,如声光报警、人体红外等实验。无源蜂鸣器可以做闹铃、音乐等实验。那么就分享到这,大胆尝试实践探索吧,欢迎讨论。

附上参考文献链接与视频链接出处

链接: 参考PWM知乎
链接: 参考PWM视频
链接: 有源蜂鸣器视频
链接: 无源蜂鸣器视频
链接: 源码例程
提取码:3232

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【STM32 基础实验蜂鸣器发声】 的相关文章

  • 6.小项目.图片解码播放器-朱有鹏-专题视频课程

    6 小项目 图片解码播放器 6707人已学习 课程介绍 本课程是 朱有鹏老师嵌入式linux核心课程 第6部分 xff0c 是一个课程后的小项目 用开发板本身自带的硬件完成一个基于linux API开发的图片解码播放器 xff0c 实现了对
  • 思科arp欺骗攻击,cdp攻击,DHCP攻击实验命令笔记

    目录 Kali主机扫描 双向攻击 Cdp攻击防护 Stp攻击防护 Kali主机扫描 fping s r 2 g 192 168 1 0 24 扫描网段内存活的主机 arping 192 168 1 1 探测主机是否存活 双向攻击 Arpso
  • 命令草稿集

    port hybrid pvid vlan vlan id 指定Hybrid接口的缺省VLAN ID xff0c 缺省VLAN 1 以太网帧在无线接入控制器中都是以Tagged的形式处理转发的 xff0c 设备必须给接口收到的Untagge
  • mkdir和chmod命令

    1 在 usr目录中新建一个目录名称为 xff1a mytest 并在mytest目录中新建文件net txt 设置文件的属性为文件属主 xff08 u xff09 增加执行权限 文件属主同组用户 xff08 g xff09 增加写入权限
  • Eigen中的SparseMatrix(稀疏矩阵)元素的快速插入

    Eigen中的SparseMatrix xff08 稀疏矩阵 xff09 元素的快速插入 辰宸的备忘录 licc tech Eigen SparseMatrix lt float gt m 3 3 std vector lt Eigen T
  • 【Ubuntu22.04.2中文系统转换,添加中文输入法,修改快捷键】

    上一篇带大家完成了Ubuntu的安装 xff0c 现在来看看答应大家的后续吧 好多人安装Ubuntu后发现是英文 xff0c 找不到怎么切换中文系统和中文输入法 xff0c 今天本多就带大家来看看吧 xff08 看完哦 xff0c 最后面有
  • curl (7) Failed connect to localhost8080; Connection refused

    curl 7 Failed connect to localhost 8080 Connection refused 如果你也是curl 百度是正常的 xff0c curl xff08 自己IP xff09 正常 xff0c 但是 一 cu
  • Java面试基础篇

    Java面试基础篇 基础总结 博客链接导航 Java语言基础常识 https blog csdn net article details 88531257 J2EE基础知识 https blog csdn net article detai
  • 关于Mysql1251解决办法

    问题 xff1a 相信有些小伙伴在用Navicat连接Mysql时 xff0c 都遇到了这样的情况 xff0c 这其实是8 0以后的加密规则问题 解决办法 xff1a 1 我们打开以管理员身份打开cmd管理器 2 输入cdC Program
  • vue-router4路由报“[Vue Router warn] No match found for location with path“

    这里出现该问题的原因 xff1a 在路由配置了参数路径 但是 xff0c 跳转的路径没有参数 xff1a 因此控制台出现了 xff1a
  • Chrome(谷歌浏览器)安装Vue插件vue-devtools(图文详细教程)

    使用Vue开发项目时 xff0c 常会用到一款谷歌浏览器插件 xff0c vue devtools 安装成功后 xff0c 运行本地Vue项目 xff0c 打开浏览器控制台就如下 xff1a 其中可以便捷的查看vueX的数据以及组件结构等
  • 你不能错过的单片机课程-1.1.第1季第1部分-朱有鹏-专题视频课程

    你不能错过的单片机课程 1 1 第1季第1部分 3111人已学习 课程介绍 本课程是 朱有鹏老师单片机完全学习系列课程 第1季第1个课程 xff0c 旨在对整个课程体系 学习方法和思路 配套开发板等进行介绍 xff0c 学习完本课程将对整个
  • redis如何设置密码

    密码设置 这里简单介绍一下redis如何设置密码 redis密码设置有两种方式 xff0c 一种需要重启redis服务 xff0c 一种不需要重启redis服务 首先 xff0c 介绍一下需要重启redis服务的设置方式 即找到redis的
  • linux 查看IP地址

    参考资料整理 一 在 linux 下可以通过两个命令来查看本机的 IP 地址 xff1a 1 支持包括 Linux 在内的所有 Unix 系统 sbin ifconfig 2 对于Linux 而言 xff0c 也可以使用 ip 命令查看 x
  • Docker 查看镜像信息

    本文中 xff0c 我们将需要学习 Docker 如何查看镜像信息 xff1f 一 images 命令列出镜像 通过使用如下两个命令 xff0c 列出本机已有的镜像 xff1a docker images 或 xff1a docker im
  • Google Chrome(谷歌浏览器)安装使用

    谷歌浏览器官网https www google cn chrome Chrome是由Google开发的一款简单便捷的网页浏览工具 谷歌浏览器 Google Chrome 可以提帮助你快速 安全的搜索到自己需要的内容 xff0c 功能强大 x
  • IDEA创建一个JavaWeb项目详细步骤

    刚好最近在写数据库大作业任务书 xff0c 留了一份 xff0c 发在博客上 提前说明 使用IDEA 43 Html5 43 CSS 43 JavaWeb 43 MySql开发 并使用Tomcat部署在本地服务器上 其中JDK版本为1 8
  • Nacos集群配置以及在springboot中使用

    1 下载nacos 官方地址为https github com alibaba nacos 2 将nacos解压 最好不要有中文路径 将cluster conf example文件改名为cluster conf 添加如下配置127 0 0
  • Windows下安装Nginx

    一 引言 Nginx 是一个很强大的高性能Web和反向代理服务 也是一种轻量级的Web服务器 可以作为独立的服务器部署网站 应用非常广泛 特别是现在前后端分离的情况下 而在开发过程中 我们常常需要在window系统下使用Nginx作为Web
  • Linux安装curl完整步骤

    文章目录 1 安装步骤 1 安装步骤 下载curl安装包 xff1a wget http curl haxx se download curl 7 38 0 tar gz 解压 xff1a tar xzvf curl 7 38 0 tar

随机推荐