嵌入式学习---蜂鸣器篇

1. 蜂鸣器分类

蜂鸣器是一种电子发声器件,采用直流电压供电,能够发出声音。广泛应用于计算机、打印机、报警器、电子玩具等电子产品中作为发声部件。一般仅从外形不易分辨蜂鸣器的种类。但是有些蜂鸣器使用广泛,见得多了就很容易分辨。例如常见的有源蜂鸣器会带一个白色贴纸,而无源蜂鸣器不带(当然这并不是绝对的)。

一般在单片机系统中,会按照驱动方式,将蜂鸣器分为以下两类:

  • 有源蜂鸣器:内部自带振荡源,接通电压即可发声,振荡频率固定,常用作报警器。
  • 无源蜂鸣器:内部不带振荡源,需要外加振荡信号,频率可改变,更加灵活实用。
无源蜂鸣器
有源蜂鸣器

有源蜂鸣器只需一个高低电平即可发声,和之前讲的LED的驱动方式完全相同。

无源蜂鸣器需要外部频率变化的震荡信号才可以发声,相对稍复杂一点。

其他分类:

(1)按工作原理分类

压电式蜂鸣器
电磁式蜂鸣器

1. 压电式蜂鸣器
原理:利用压电效应,当施加电压时,压电材料(如钛酸钡或锆钛酸铅)会发生形变,从而产生振动并发出声音。
特点:

  • 高效节能,功耗低。
  • 结构简单,体积小,适合空间有限的应用场景。
  • 适用于高频范围(通常在2kHz到4kHz之间),音质较为清脆。
  • 耐用性强,没有移动部件,不易损坏。

2. 电磁式蜂鸣器
原理:通过电磁铁吸引膜片振动发声。当电流通过线圈时,产生磁场,该磁场与永久磁铁相互作用,使膜片振动。
特点:

  • 可以发出较低频率的声音,音质较为浑厚。
  • 相对压电式蜂鸣器,功耗较高。
  • 结构相对复杂一些,但价格通常较低。

(2)按结构特点分类

敞开式蜂鸣器
封闭式蜂鸣器

1. 封闭式蜂鸣器
特点:

  • 内部结构被完全封装在一个外壳中,具有较好的防护性能。
  • 适合在恶劣环境中使用,能够防止灰尘、湿气等进入影响工作。
  • 外观美观,便于安装。

2. 敞开式蜂鸣器
特点:

  • 没有外壳保护,直接暴露在外。
  • 更适合用于需要散热或不需要严格防护的应用场景。
  • 成本较低,但在某些环境下可能需要额外的防护措施。

(3)按供电类型分类

交流蜂鸣器
直流蜂鸣器

1. 直流蜂鸣器
特点:

  • 使用直流电源供电,通常为5V、12V等常见电压等级。
  • 广泛应用于电子设备中,特别是那些依赖电池供电的便携式设备。

2. 交流蜂鸣器
特点:

  • 使用交流电源供电,通常为市电电压(如110V或220V)。
  • 主要应用于工业控制、家用电器等领域,由于其功率较大,常用于报警系统。

2. 两种蜂鸣器的区别

特性无源蜂鸣器有源蜂鸣器
内置振荡电路
驱动方式需要外部方波信号直流电源
音调可调性可调固定
控制复杂度较高(需生成信号)简单(直接供电)
功耗根据信号可变较高
应用场景多音调、复杂音频单一音调、简单提示

3.驱动代码

有源蜂鸣器驱动方式和LED是一样的,因此它的驱动代码也是和LED通用的。这里就不再赘述。

无源蜂鸣器不像有源蜂鸣器那样内置振荡电路,因此需要外部提供一个振荡信号来驱动。具体来说,你需要通过微控制器或其他信号源生成一定频率的方波信号,并将其施加到无源蜂鸣器上,才能产生声音。

包括STM32在内的大多数微控制器,都会使用PWM方波信号来驱动无源蜂鸣器。

先初始化PWM,在PA1 IO口输出PWM波。

pwm.c
void PWM_Init(void)
{
	GPIO_InitTypeDef  		    GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef     TIM2_InitStructure;
	TIM_OCInitTypeDef   		TIM_OCInitStructure;
    NVIC_InitTypeDef    		NVIC_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
	//5ms
	TIM2_InitStructure.TIM_Period = 4999;
	TIM2_InitStructure.TIM_Prescaler = 71;
	TIM2_InitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM2_InitStructure.TIM_CounterMode = TIM_CounterMode_Up;  
	TIM_TimeBaseInit(TIM2, &TIM2_InitStructure);
	
	//PWM输出引脚配置  TIM2_CH2 PA1  
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //不是常规引脚功能,因此配置为复用推挽
	GPIO_InitStructure.GPIO_Pin = PWM_PIN; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(PWM_PORT, &GPIO_InitStructure);

	//PWM配置  TIM2_CH2 PA1  占空比:2500/(4999+1) = 50%
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  //PWM模式1 
	TIM_OCInitStructure.TIM_Pulse = 2500;              //初始值2500个高电平
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //主通道使能
	TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //TIM2无此功能  随便写或不写
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  //开始时输出高
	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;  //TIM2无此功能  随便写或不写
	TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;//TIM2无此功能  随便写或不写
	TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;//TIM2无此功能  随便写或不写
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  
	//中断分组配置
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);
	TIM_Cmd(TIM2, ENABLE);
}


//TIM2中断服务程序  
void TIM2_IRQHandler(void)                		
{
	u8 i=0;
	if(TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)  //TIM2捕获比较中断
	{
		i++;
		if(i==255)  //产生一次PWM后做的事情 根据自己需求修改
		{
		  i=0;
		}
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);  //清除中断标志位
	}
}
​
main.c

main()
{
    SystemTinerInit(7200-1, 1000-1);
    Delay_Init();
	USART1_Init(115200);
	LED_Init();
	PWM_Init();

    while(1)
    {
      TIM_SetCompare2(TIM2, 300);  //输出占空为300/5000=6%的方波。
    }
}

虽然有些无源蜂鸣器没有明确的正负极标识,但最好确认一下。如果蜂鸣器有标记(如“+”号),则该端应接至PWM信号输出端;如果没有明确标识,则一般情况下不会因为接反而损坏,但仍建议按照制造商提供的指南进行连接。

在这里我们把无源蜂鸣器的随便一个引脚(或“+”)接到PA1,另一引脚接地。代码是上一章节的PWM的代码,具体配置细节可到上一章节查看。

另外,通过改变PWM占空比,可以调节无源蜂鸣器的音调,利用这一特点,再结合适当的延迟,可以演奏简单的音乐。但是要注意蜂鸣器并不能像扬声器那样直接播放音乐,只能播放简单的节拍(就像纯音乐一样,还只能是简单的)。假如你想播放一首MP3音乐,应该选择扬声器作为输出,而不是蜂鸣器。这是很多小白的一个误区,在此提醒一下。

制作不易,如果对你有帮助可否点个赞再走~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/964022.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解析PHP文件路径相关常量

PHP文件路径相关常量包括以下几个常量: __FILE__:表示当前文件的绝对路径,包括文件名。 __DIR__:表示当前文件所在的目录的绝对路径,不包括文件名。 dirname(__FILE__):等同于__DIR__,表示当前…

C++底层学习预备:模板初阶

文章目录 1.编程范式2.函数模板2.1 函数模板概念2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则 3.类模板希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 进入STL库学习之前我们要先了解有关模板的…

【腾讯前端面试】纯css画图形

之前参加腾讯面试,第一轮是笔试,面试官发的试卷里有一题手写css画一个扇形、一个平行四边形……笔试时间还是比较充裕的,但是我对这题完全没有思路😭于是就空着了,最后也没过。 今天偶然翻到廖雪峰大佬的博客里提到了关…

智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制

内容概要 在当前快速发展的城市环境中,智慧园区综合管理系统正在成为各类园区管理的重要工具,无论是工业园、产业园、物流园,还是写字楼与公寓,都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统,用…

自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)

开源地址:VMwork 要使终端不弹出&#xff0c; #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…

如何确认Linux嵌入式系统的触摸屏对应的是哪个设备文件(/dev/input/event1)?如何查看系统中所有的输入设备?输入设备的设备文件有什么特点?

Linux嵌入式系统的输入设备的设备文件有什么特点&#xff1f; 在 Linux 中&#xff0c;所有的输入设备&#xff08;如键盘、鼠标、触摸屏等&#xff09;都会被内核识别为 输入事件设备&#xff0c;并在 /dev/input/ 目录下创建相应的 设备文件&#xff0c;通常是&#xff1a; …

HTTP异步Client源码解析

我们知道Netty作为高性能通信框架&#xff0c;优点在于内部封装了管道的连接通信等操作&#xff0c;用户只需要调用封装好的接口&#xff0c;便可以很便捷的进行高并发通信。类似&#xff0c;在Http请求时&#xff0c;我们通过调用HttpClient&#xff0c;内部使用java NIO技术&…

利用Vue和javascript分别编写一个“Hello World”的定时更新

目录 一、利用Vue编写一个“Hello World”的定时更新&#xff08;1&#xff09;vue编码在Html文件中&#xff08;2&#xff09;vue编码在js文件中 二、利用javascript编写一个“Hello World”的定时更新 一、利用Vue编写一个“Hello World”的定时更新 &#xff08;1&#xff…

leetcode27.删除有序数组中的重复项

目录 问题描述判题标准示例提示 具体思路思路一思路二 代码实现 问题描述 给你一个非严格递增排列的数组nums&#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;返回删除后数组的新长度。元素的相对顺序应该保持一致 。然后返回nums中唯一元…

Vue 图片引用方式详解:静态资源与动态路径访问

目录 前言1. 引用 public/ 目录2. assets/ 目录3. 远程服务器4. Vue Router 动态访问5. 总结6. 扩展&#xff08;图片不显示&#xff09; 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 在 Vue 开发中&#x…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.18 对象数组:在NumPy中存储Python对象

2.18 对象数组&#xff1a;在NumPy中存储Python对象 目录 #mermaid-svg-shERrGOBuM2rBzeB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-shERrGOBuM2rBzeB .error-icon{fill:#552222;}#mermaid-svg-shERrGOBuM2rB…

Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

pstricks PGFTikz 在CTeX套装中绘图Transparency或Opacity失效的问题

我在CTeX中画图的时候&#xff0c;习惯用Geogebra先画好&#xff0c;然后生成pstricks或PGFTikz代码&#xff1a; 这样不用插入eps或pdf之类的图片&#xff0c;也是一种偷懒的方法。以前往arXiv.org上面传论文也是这样&#xff1a;代码出图&#xff0c;就不用另外上传一幅eps或…

deepseek 本地化部署和小模型微调

安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署&#xff0c; 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…

Java_类加载器

小程一言类加载器的基础双亲委派模型核心思想优势 各类加载器的职责 类加载器的工作流程举例&#xff1a;如何在Java中使用类加载器启动类加载器、扩展类加载器与系统类加载器输出解释自定义类加载器 类加载器与类冲突总结 小程一言 本专栏是对Java知识点的总结。在学习Java的过…

Baklib推动数字化内容管理解决方案助力企业数字化转型

内容概要 在当今信息爆炸的时代&#xff0c;数字化内容管理成为企业提升效率和竞争力的关键。企业在面对大量数据时&#xff0c;如何高效地存储、分类与检索信息&#xff0c;直接关系到其经营的成败。数字化内容管理不仅限于简单的文档存储&#xff0c;更是整合了文档、图像、…

【ComfyUI专栏】如何为ComfyUI工作流写上节点名称与顺序

有些朋友可能在网上看到视频的时候能够看到所有的节点都是按照顺序进行排列,我们可以看到当前节点顺序,也能够看到当前的节点的名称是什么? 这个其实并不是默认设置,也不是ComfyUI本身的设置,而是在Manager 节点,在Manager节点设置中有个标签设置。 这里标签设置有如下的…

Med-R2:基于循证医学的检索推理框架:提升大语言模型医疗问答能力的新方法

Med-R2 : Crafting Trustworthy LLM Physicians through Retrieval and Reasoning of Evidence-Based Medicine Med-R2框架Why - 这个研究要解决什么现实问题What - 核心发现或论点是什么How - 1. 前人研究的局限性How - 2. 你的创新方法/视角How - 3. 关键数据支持How - 4. 可…

【实践案例】基于大语言模型的海龟汤游戏

文章目录 项目背景提示词构建海龟汤主持人真相判断专家 具体实现流程文心一言大语言模型“海龟汤”插件参考 项目背景 “海龟汤”作为一种聚会类桌游&#xff0c;又称情境推理游戏&#xff0c;是一种猜测情境还原事件真相的智力游戏。其玩法是由出题者提出一个难以理解的事件&…

探秘Linux IO虚拟化:virtio的奇幻之旅

在当今数字化时代&#xff0c;虚拟化技术早已成为推动计算机领域发展的重要力量。想象一下&#xff0c;一台物理主机上能同时运行多个相互隔离的虚拟机&#xff0c;每个虚拟机都仿佛拥有自己独立的硬件资源&#xff0c;这一切是如何实现的呢&#xff1f;今天&#xff0c;就让我…