05 HAL库驱动蜂鸣器唱出一首小歌

目录

一、蜂鸣器的基本知识

1、有源蜂鸣器

2、无源蜂鸣器

二、PWM的相关知识

1. PWM概念

2. PWM常见参数

3.PWM基本结构

三、蜂鸣器发出音调的原理

四、频率计算

五、实验开始


一、蜂鸣器的基本知识


     

  蜂鸣器是一种能够发出持续而连续的声音的电子设备,它被广泛应用于警报、提醒、提示等场合。

以下是关于蜂鸣器的基本知识和分类:

基本知识:

1. 构成:蜂鸣器由一个或多个压电陶瓷或电磁线圈构成,当输入电流或电压时,产生机械振动,从而产生声音。

2. 工作原理:蜂鸣器通过交变或直流电流或电压的作用,使压电陶瓷片或线圈振动,产生声音。

分类:

1. 压电式蜂鸣器(Piezoelectric Buzzer):这种蜂鸣器使用压电陶瓷片作为振动元件,通过外加的交变电压引起陶瓷片的振动,从而产生声音。它的优点是结构简单、功耗低、体积小,常见的有被动型和主动型压电蜂鸣器。

2. 电磁式蜂鸣器(Magnetic Buzzer):这种蜂鸣器使用电磁线圈和振动片组成,通过外加的交变电流引起线圈的振动,从而产生声音。它的优点是音量大、声音频率范围宽,常用于声音要求较高的应用场合。

此外,根据蜂鸣器输出的声音特性,还可以将蜂鸣器分为不同的类型,如持续音蜂鸣器和脉冲音蜂鸣器。持续音蜂鸣器发出持续不断的声音,适用于需要连续声音的场合;而脉冲音蜂鸣器则是以间断的脉冲声音来提醒或警告。 总的来说,蜂鸣器是一种实用的电子设备,通过不同的结构和工作原理,可以满足各种不同场景下的声音要求。

以上内容知识作为一个了解和知识拓展, 其实我们只需要知道这些。

1、有源蜂鸣器

有源蜂鸣器只要接上额定电源就可以发出声音, 内部内置得有震荡源, 但是频率固定

2、无源蜂鸣器

无源蜂鸣器利用电磁感应原理,为音圈接入交变电流后形成的电磁铁与永磁铁相吸或相斥而推动振膜发声, 这种蜂鸣器就比较适合我们由来播放对应频率的音乐。所以本实验想驱动蜂鸣器哼出一首歌的曲调也得使用无源蜂鸣器。

二、PWM的相关知识


1. PWM概念

PWM(Pulse Width Modulation)即脉冲宽度调制,通过对脉冲的宽度进行调制,来获得所需要波形, 大家不需要管PWM的是咱们实现的,正所谓术业有专攻嘛, 嵌入式开发技术这块记住这四个字:“够用就行”。因为学海无涯, 知识太多了。

2. PWM常见参数

3.PWM基本结构

三、蜂鸣器发出音调的原理


大家看以上这张图, 这就是各个音调的频率, 也就是说我们给蜂鸣器对应频率的PWM波,蜂鸣器就能发出对应的声音出来, 我们再结合我们需要播放的音乐的音调和每一个音调的间隔时间是不是就能驱动蜂鸣器播放音乐了。

四、频率计算


这里也是一样的, 我就带着大家配置了, 我以文字的形式给大家说一下, 大家配置一下工程, 咱们的重点放在频率的计算和代码实现上面。查看原理图, 看看蜂鸣器的连接情况, 查看蜂鸣器连接再哪一个定时器的哪一个通道上面, 接着配置该定时器, 根据定时器所在总线上的频率来计算, 这里不太清楚的可以看我单片机主题里面的定时器中断那篇文章。

重点在这:

该实验的重点在这, 或者说定时器的重点在这里, 根据预分频的值和计数值计算pwm波的频率

CK_PSC:为定时器所在总线上的频率

PSC:预分频的值

ARR:计数器周期里的值

大家看这张图

我的定时器所在总线上的频率是64MHz, 预分频的值为6400-1, 计数器的值(ARR/count period)10000-1, 那么我的pwm波形的频率是不是64000000 / 6400 / 10000 = 1Hz, 这样我们去晚上随便弄个音乐的频率图来, 我们按照该音乐的各个音调分布和时间间隔是不是就能使蜂鸣器播放对应的音乐了。

五、实验开始


对了对了, 咱们驱动蜂鸣器播放音乐是不是得改变pwm波的怕频率, 又根据上面的频率计算公式,可以发现有两个参数可以修改频率, 一个是预分频的值, 一个是计数值(周期),在该代码种采用固定周期值, 修改预分频的值, 大家不用担心, 也是有函数可以修改预分频器的值的。

Beeper.h

#define  proport          72000 	//Tclk/(arr+1)=72000000/(1000)


#define COUNT_PERIOD 10000
 
//根据Tout= ((arr+1)*(psc+1))/Tclk推出psc值就是本句define定义的值,Tout为音调频率131Hz的倒数,Tclk=72MHz                                                
#define  L1       ((proport/262)-1)//低调 do 的频率
#define  L2       ((proport/296)-1)//低调 re 的频率
#define  L3       ((proport/330)-1)//低调 mi 的频率
#define  L4       ((proport/349)-1)//低调 fa 的频率
#define  L5       ((proport/392)-1)//低调 sol 的频率
#define  L6       ((proport/440)-1)//低调 la 的频率
#define  L7       ((proport/494)-1)//低调 si 的频率
                                               
#define  M1       ((proport/523)-1)//中调 do 的频率
#define  M2       ((proport/587)-1)//中调 re 的频率
#define  M3       ((proport/659)-1)//中调 mi 的频率
#define  M4       ((proport/699)-1)//中调 fa 的频率
#define  M5       ((proport/784)-1)//中调 sol的频率
#define  M6       ((proport/880)-1)//中调 la 的频率
#define  M7       ((proport/988)-1)//中调 si 的频率
 
#define  H1       ((proport/1048)-1)//高调 do 的频率
#define  H2       ((proport/1176)-1)//高调 re 的频率
#define  H3       ((proport/1320)-1)//高调 mi 的频率
#define  H4       ((proport/1480)-1)//高调 fa 的频率
#define  H5       ((proport/1640)-1)//高调 sol的频率
#define  H6       ((proport/1760)-1)//高调 la 的频率
#define  H7       ((proport/1976)-1)//高调 si 的频率
 
#define  Z0       0//

Beeper.c


void Solitary_brave(void)
{
	int16_t solitary_brave[]=
	{
		M6,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10,	//爱你孤身走暗巷
		H1,50,M7,50,H1,50,H2,50,M7,50,H1,50,H1,100,Z0,10, 	//爱你不跪的模样
		H1,50,H2,50,H3,50,H2,50,H3,50,H2,50,H3,100,H3,50,H3,50,H2,50,H3,100,H5,100,H3,100,Z0,10 //爱你对峙过绝望不肯哭一场
		
	};

	int length = sizeof(solitary_brave)/sizeof(solitary_brave[0]);
	for(uint8_t i=0;i<(length/2);i++)
	{
		__HAL_TIM_SET_COMPARE(&tim1, TIM_CHANNEL_1, COUNT_PERIOD / 2);
        __HAL_TIM_SET_PRESCALER(&tim1, solitary_brave[2 * i]);      //取出偶数,预分频的值
		HAL_Delay(5*solitary_brave[i*2+1]);
	}
}

以上代码的头文件是从别处弄来的,懒得写了,给大家再重复一下原理, 头文件种的#define  proport          72000     //Tclk/(arr+1)=72000000/(1000)这一句, 就是计算出经过72MHz/计数器的周期值之后的值, 咱们想得到262Hz的频率, 预分频的值是不是将经过72MHz/计数器的周期值之后的值除以262, 这样结果就是预分频的值了, 也就是头文件中的L, M, H。

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

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

相关文章

WINDOWS 批量修改图片文件名称(流星程序集之二十)

博主家里有一台电脑&#xff0c;存放家庭全部的照片和视频&#xff0c;从智能手机和3G网络发展开始&#xff0c;家里的照片和视频越来越多&#xff0c;已经达到上万个文件。终于&#xff0c;博主找到一个方法整理和保存这些珍贵的数据资料。 一、按年代目录整理照片和视频 按年…

低成本TB级数据库技术选型之思考两三点

一、背景 前段时间在搞毕业论文的选题&#xff0c;最头疼的就是大量的文献检索和阅读&#xff0c;从研究的角度上我们可以将文献分为四类&#xff1a; 理论文献&#xff1a;为研究提供理论的框架和基础的文献。这些文献可能并不会和所做的研究直接相关&#xff0c;甚至由于理…

「网络编程」其他重要的协议或技术_ DNS协议 | ICMP协议 | NAT技术

「前言」文章内容是DNS协议、ICMP协议、NAT技术的讲解。 「归属专栏」网络编程 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、DNS协议1.1 背景1.2 域名简介1.3 域名解析的过程 二、ICMP协议2.1 ICMP简介2.2 ping命令2.3 traceroute命令 三、NAT技术3.1 NAT技术背景3.2 …

elasticsearch系列五:集群的备份与恢复

概述 前几篇咱们讲了es的语法、存储的优化、常规运维等等&#xff0c;今天咱们看下如何备份数据和恢复数据。 在传统的关系型数据库中我们有多种备份方式&#xff0c;常见有热备、冷备、全量定时增量备份、通过开发程序备份等等&#xff0c;其实在es中是一样的。 官方建议采用s…

Python 基础语法01

变量声明 #运算 num 1 num 1 print("num 1",num)num - 1 print("num - 1", num)num * 4 print("num * 4",num)num 3 num % 2 print("num%2",num)num ** 2 print("num ** 2", num)num 9 num // 2 print("num // …

20231228在Firefly的AIO-3399J开发板的Android11的挖掘机的DTS配置单前置摄像头ov13850

20231228在Firefly的AIO-3399J开发板的Android11的挖掘机的DTS配置单前置摄像头ov13850 2023/12/28 10:42 【碰到一个很神奇的问题】&#xff1a; 昨天晚上前置摄像头怎么也点不亮&#xff01;改了巨多的地方&#xff01;晚上睡觉之前把开发板彻底断电了&#xff01;今天开电脑…

【JavaFX】JDK11 基于Gson、hutool、Jackson持久化存储实体类数据的解决方案 (读取、追加、去重、写入json对象)

文章目录 开发环境效果前言一、Gson是什么?二、使用步骤1.引入依赖2.创建实体类创建 JsonFileService类创建JsonFileService的实现类 JsonFileServiceImpl三、实现效果开发环境 JDK11IDEA 2023.3Gson、hutool、JacksonJavaFX 11效果 前言 使用JDK1

Easy Rules规则引擎实战

文章目录 简介pom 规则抽象规则Rule基础规则BasicRule事实类Facts&#xff1a;map条件接口动作接口 四种规则定义方式注解方式RuleBuilder 链式Mvel和Spel表达式Yml配置 常用规则类DefaultRuleSpELRule&#xff08;Spring的表达式注入&#xff09; 组合规则UnitRuleGroup 规则引…

在线智能防雷监控检测系统应用方案

在线智能防雷监控检测系统是一种利用现代信息技术&#xff0c;对防雷设施的运行状态进行实时监测、管理和控制的系统&#xff0c;它可以有效提高防雷保护的安全性、可靠性和智能化程度&#xff0c;降低运维成本和风险&#xff0c;为用户提供全方位的防雷解决方案。 地凯科技在…

爬取豆瓣电影评论内容、星级、评论时间、支持人数

大家好&#xff0c;我是带我去滑雪&#xff0c;每天教你一个小技巧&#xff01; 本期爬取豆瓣电影评论人、评论时间、星级、支持人数、评论内容。话不多说&#xff0c;直接上代码&#xff1a; import requests from bs4 import BeautifulSoup import pandas as pd import time…

轻松注册谷歌账号,获取谷歌邮箱(Gmail)

“ 国内手机号无法注册谷歌账户&#xff08;邮箱&#xff09;&#xff1f;很好解决呀&#xff01;” 经常遇到某些朋友需要一个谷歌邮箱&#xff0c;却总是卡在某些步骤。今天特地出个详细教程帮助大家轻松注册谷歌账号&#xff0c;获取谷歌邮箱&#xff08;Gmail&#xff09;。…

解密C++中的forward<int>(a)和forward<int >(a):你真的了解它们之间的区别吗?

一文看尽C中的forward完美转发 一、前言二、深入理解forward和完美转发三、对forward<int>(a)的解析四、对forward<int &&>(a)的解析五、forward<int>(a)和forward<int &&>(a)的区别总结 一、前言 完美转发在C中具有重要性&#xff0…

vmware安装openEuler操作系统

vmware安装openEuler操作系统 1、下载openEuler操作系统镜像文件2、安装openEuler操作系统3、配置使用openEuler操作系统 1、下载openEuler操作系统镜像文件 官网下载链接 链接: https://www.openeuler.org/zh/download/ 这里选择 openEuler 22.03 LTS SP2 版本 标准镜像包 文…

Dungeon Scrawl——在线虚拟世界地图制作器

今天带来一款十分有趣的地图应用&#xff0c;同样也是在线地图工具&#xff0c;如果我们想要制作此类风格的地图&#xff0c;这款工具定能助我们一臂之力。 按照惯例先给出网址&#xff1a; Dungeon Scrawl | Free Online D&D Map Maker 进入网站&#xff0c;点击Start S…

Post-hoc Concept Bottleneck Models (PCBM)

ICLR 2023 spotlight 文章链接&#xff1a;https://arxiv.org/abs/2205.15480 代码链接&#xff1a;https://github.com/mertyg/post-hoc-cbm 一、概述 Post-hoc CBM&#xff08;PCBM&#xff09;也是CBM大家族中的一员&#xff0c;因此它的基本逻辑与CBM一致&#xff0c;就是…

从登录测试谈测试用例

谈谈登录测试&#xff1a; 可能你会说&#xff0c;“用户登录”这个测试对象也有点太简单了吧&#xff0c;我只要找一个用户&#xff0c;让他在界面上输入用户名和密码&#xff0c;然后点击“确 认”按钮&#xff0c;验证一下是否登录成功就可以了。的确&#xff0c;这构成了一…

C/C++ 函数的默认参数

下面介绍一项新内容 - 默认参数。 默认参数指的是当函数调用中省略了实参时自动使用的一个值。 例如&#xff0c;如果将 void wow (int n)设置成n 有默认值为1&#xff0c;则函数调用 wow()相当于 wow(1)这极大地提高了使用函数的灵活性。 假设有一个名为left()的函数&#xff…

构建安全的SSH服务体系

某公司的电子商务站点由专门的网站管理员进行配置和维护&#xff0c;并需要随时从Internet进行远程管理&#xff0c;考虑到易用性和灵活性&#xff0c;在Web服务器上启用OpenSSH服务&#xff0c;同时基于安全性考虑&#xff0c;需要对 SSH登录进行严格的控制&#xff0c;如图10…

记一次JSF异步调用引起的接口可用率降低 | 京东云技术团队

前言 本文记录了由于JSF异步调用超时引起的接口可用率降低问题的排查过程&#xff0c;主要介绍了排查思路和JSF异步调用的流程&#xff0c;希望可以帮助大家了解JSF的异步调用原理以及提供一些问题排查思路。本文分析的JSF源码是基于JSF 1,7.5-HOTFIX-T6版本。 起因 问题背景…

【MATLAB】【数字信号处理】基本信号的仿真与实现

目的 1、用MATLAB软件实现冲激序列 2、用MATLAB软件实现阶跃序列 3、用MATLAB软件实现指数序列 4、用MATLAB软件实现正弦序列 内容与测试结果 1、用MATLAB软件实现冲激序列 程序如下&#xff1a; % 1 冲激序列 clc; clear all; n0 -10; nf 50; ns 1; A 1;%起点为-1&…