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。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Kubernetes】kubectl 常用命令

kubectl 常用命令 1.基础命令2.部署命令3.集群管理命令4.故障诊断与调试命令5.高级命令6.设置命令7.其他命令 kubectl 是 Kubernetes 提供的命令行管理工具。通过使用 kubectl&#xff0c;可以管理和操作 Kubernetes。 1.基础命令 命令 说明 create通过文件名或标准输入创建 …

2023年03月22日_腾讯2022年财报解读

文章目录 1 - 腾讯营收增长停滞2 - 腾讯游戏业务低迷3 - 小程序和视频号拉动广告增长4 - 腾讯云和金融科技表现不佳5 - 营销费用减半6 - 裁员但福利上涨 2023年03月22日 今天晚上呢 腾讯披露了2022年第四季度和全年的财报 看过之后呢不禁要说 腾讯在2022年真的是过得不容易啊…

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项样题卷③

2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 目录 2023年“中银杯”四川省职业院校技能大赛“云计算应用”赛项&#xff08;高职组&#xff09; 样题&#xff08;第3套&#xff09; 模块…

Python序列之集合

系列文章目录 Python序列之列表Python序列之元组Python序列之字典Python序列之集合&#xff08;本篇文章&#xff09; Python序列之集合 系列文章目录前言一、集合是什么&#xff1f;二、集合的操作1.集合的创建&#xff08;1&#xff09;使用{}创建&#xff08;2&#xff09;…

[python]基于faster whisper实时语音识别语音转文本

语音识别转文本相信很多人都用过&#xff0c;不管是手机自带&#xff0c;还是腾讯视频都附带有此功能&#xff0c;今天简单说下&#xff1a; faster whisper地址&#xff1a; https://github.com/SYSTRAN/faster-whisperhttps://link.zhihu.com/?targethttps%3A//github.com…

docker小白第十天

redis集群主从容错切换案例 3主3从的redis集群&#xff0c;某个主机宕机了&#xff0c;需要对应的从机补位。 docker exec -it redis-node-1 /bin/bash # 进入容器1的命令行 redis-cli -p 6381 # 进入节点1的命令行 cluster nodes # 查看集群信息可以看到1号和6号对应是主从关…

HTML教程(1)——概述和第一个网页

一、什么是HTML HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language)HTML 不是一种编程语言&#xff0c;而是一种标记语言 (markup language)标记语言是一套标记标签 (markup tag)HTML 使用标记标签来描述网页 二、什么是HTML 标签 H…

HDFS客户端UnknownHostException事故解析

文章目录 前言事故现场问题分析是否是整个域名解析服务当时都出问题了是否是出问题的pods本身的域名解析有问题 异常发生的全部过程域名的解析是什么时候发生的&#xff0c;怎么发生的域名解析的详细流程 重试发生在什么地方为什么重试会无效 Bugfix代码详解关于StandardHostRe…

C实现数组奇数在前偶数在后排序

一、运行结果&#xff1b; 二、源码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现调整函数move_odd_even函数&#xff1b; void move_odd_even(int arr[], int sz) {//初始化变量值&#xff1b;int left 0;int right sz - 1;//循环判断和…

【MySQL表的增删查改】

文章目录 前言1 Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2 Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重 2.2 WHERE 条件2.2.1 英语不及格的同学及英语成绩 ( &…

[Verilog] 加法器实现

1. 4位的加法器 先来一个最基本的的Verilog加法器 设计代码 module adder_4bit (input [3:0] a, b, output [3:0] sum, output carry);assign

CentOS 7 lvm 裸盘的扩容和缩容减盘 —— 筑梦之路

背景介绍 之前写过比较多的关于lvm的文章&#xff1a; CentOS 7 lvm 更换坏盘操作步骤小记 —— 筑梦之路_centos更换硬盘操作-CSDN博客 xfs ext4 结合lvm 扩容、缩容 —— 筑梦之路_ext4扩盘-CSDN博客 LVM逻辑卷元数据丢失恢复案例 —— 筑梦之路_pve lvm数据恢复-CSDN博客…