STM32-HAL-定时器(无源蜂鸣器的驱动)

news2024/11/25 7:13:40

文章目录

  • 一、蜂鸣器的介绍
  • 二、常用的无源蜂鸣器的电路
  • 三、测试准备
  • 四、初始化片上外设
    • 4.1 初始化定时器4的通道2为PWM输出模式
    • 4.2 编写驱动代码
    • 4.3 Logic分析仪查看波形
    • 4.4 代码分析

一、蜂鸣器的介绍

  • 有源蜂鸣器:

    有源蜂鸣器内部有一个发声电路,也就是“源”(震荡源,与无源蜂鸣器的区别),只要通电就可以响。

  • 无源蜂鸣器:

    无源蜂鸣器相当于扬声器,无源蜂鸣器直接接直流电,只在刚接触和离开的时候发声(利用电磁感应现象,通电、断电时推动振膜发声),一般使用方波信号源驱动发声。

二、常用的无源蜂鸣器的电路

在这里插入图片描述

1、从电路图中可以看出,蜂鸣器的驱动源来自单片机的定时器4的通道2产生的PWM方波

2、其中添加了IN4148二极管为的是再使用方波信号源驱动时,防止突然断电产生的高压反向电动势击穿其他的原件以及使用寿命的缩短。

3、其中使用的SS8085三极管作为开关器件使用,当基极电压为高电平时,三极管处于饱和状态,电路通电。

三、测试准备

  • 基于STM32F407VGT6的网络开发板(其他也可)
  • 安装windows系统并安装CubemxKeil MDK的电脑

四、初始化片上外设

4.1 初始化定时器4的通道2为PWM输出模式

在这里插入图片描述设置定时器4的Clock Source Internal Clock

  • 时钟源设置为外部高速时钟

在这里插入图片描述
【重要】查看开发板的板载晶振的频率(根据自己的开发板的晶振频率设置),因此设置输入的时钟的频率为25Hz,经过分频后最后设置频率为最大168MHz

  • 时钟树设置,经过分频、倍频后

在这里插入图片描述
经过代码查看,在"stm32f4xx_hal_rcc_ex.h" 头文件中,定时器4所在的时钟桥为APB1,查看时钟树后定时器4所在的外设桥时钟频率为84MHz.

在这里插入图片描述

  • 针对TIM4-Channel2 -PWM生成进行参数设置
Internal Clock内部时钟源,即晶振震荡源作为时钟
PWM Generation CH2PWM输出为通道2
Prescaler-(16位计数)定时器的分频系数(PSC):84-1
Counter Mode向上计数模式:UP
Counter Period-(16位计数)自动重装载值(ARR):1000 - 1
Internal Clock Division(CKD)不分频,频率非很高:No Division
auto-reload-preload自动重装载:Enable
ModePWM mode 1 向上计数
Plus(CCR)寄存器值:500
CH PolarityPWM极性,初始电平为下降沿

在这里插入图片描述

PWM的频率计算式

PWM的频率

定时器的计数频率计算式

在这里插入图片描述

设置后的PWM的频率为PWM-Freq = 84MHz / (84*1000) = 1kHz
时钟的计数频率为 CLK_CNT = Clcok-Freq / (PSC + 1) = 1MHz
计数一次的时间为 1 / CLK_CNT = (PSC + 1) / Clock-Freq = 1 / 1MHz = 1us
完成一次整周期的计数时间为 (ARR + 1)*1us = 1000 * 1uS = 1ms
高点评占空时间为CCR * 1us = 500us
设置的CCR值为 500 因此占空比为 500 / 1000 = 50%
  • 设置生成Keil- MDK代码文件

4.2 编写驱动代码

简单写两个函数可以表达意思即可。

[设置定时器的CCR寄存器的值]
#define BELL_PWM_FREQ                   2000000

void beep_SetFreq(uint16_t freq)
{	
	uint32_t Period = BELL_PWM_FREQ / freq;
	uint16_t Pulse  = Period  / 2;
	
	 HAL_TIM_PWM_Init(&htim4);// 初始化定时器的PWM模式
	
	 HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);// 启动定时器的PWM模式	
	 
	/* Set the Autoreload value , frequency*/
	
	/*设置频率和占空比*/
	
	__HAL_TIM_SET_AUTORELOAD (&htim4, Period - 1);
	
	__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Pulse);	
}

void beep_off(void)
{	
	HAL_TIM_PWM_Stop(&htim4,TIM_CHANNEL_2);// 停止定时器的PWM输出
}

void beep_on(void)
{
	beep_SetFreq(2000);//设置自动重装载值为2000 ARR寄存器的值为1000 占空比为50%
	HAL_Delay(1000);
	beep_off();
}

  /* USER CODE BEGIN 2 */
 	beep_on();
  /* USER CODE END 2 */


[result]
鸣响一秒后结束
修改不同的值会得到不同频率的鸣叫声

4.3 Logic分析仪查看波形

逻辑分析仪分析的波形的PWM参数设置是基于代码修改的

  • ARR = 2000 000/2000 - 1 = 1000 - 1
  • CCR = 1000 / 2 = 500
  • PWM-Freq = 84M / (1000 * 84) = 1kHz
  • Duty = 500 / 1000 = 50%

在这里插入图片描述

4.4 代码分析

这是一个宏定义,用于设置STM32中的定时器的自动重装载寄存器的值,从而实现定时器的计数周期。

  • &htim4 是定时器4的句柄,表示要设置的定时器。
  • Period 表示要设置的定时器计数周期的值,单位为定时器时钟周期数。
__HAL_TIM_SET_COMPARE(&htim4,TIM_CHANNEL_2,Pulse);	

这是一个宏定义,用来设置STM32中的定时器的比较值,从而实现定时器的计数和输出控制。

  • &htim4 是定时器4的句柄,表示要设置的定时器。
  • TIM_CHANNEL_2 表示要设置的定时器通道,表示比较输出的通道。
  • Pulse 表示要设置的比较值,用于控制定时器的输出和计数。

使用时需要先配置好定时器的基本参数,如时钟源、分频系数、计数方式等,然后再使用宏定义来设置自动重装载寄存器的值和比较值,从而实现定时器的计数周期控制和计数输出控制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员那些“越早知道越好的”道理

目录 程序员那些“越早知道越好的”道理1、学会阅读文档2、学会调试代码3、学会使用版本控制工具4、学会编写测试代码5、学会提问6、学会使用搜索引擎7、学会读懂源代码 程序员那些“越早知道越好的”道理 作为一名程序员,有很多话想对新手说,因为这些话…

ctr特征重要性建模:FiBiNetFiBiNet++模型

FiBiNET(Feature Importance and Bilinear feature Interaction NETwork)为推荐系统的CTR模型提出了一些创新方向: 引入一个SENet模块,可以动态学习特征的重要性;引入一个双线性模块(Bilinear-Interaction…

在当前互联网行情下,Android想转音视频开发,会有前景吗?

前言 近年来,由于三年疫情的影响,很多公司都开始陆陆续续的在裁员,Android开发工作岗位也是,可能有些从事Android开发的朋友还没有意识到,Android开发岗位正在变少,求职者,僧多粥少&#xff0c…

数据可视化大屏电商数据展示平台开发实录(Echarts柱图曲线图、mysql筛选统计语句、时间计算、大数据量统计)

数据可视化大屏电商数据展示平台 一、前言二、项目介绍三、项目展示四、项目经验分享4.1 翻牌器4.1.1 翻牌器-今日实时交易4.1.2.翻牌器后端统计SUM函数的使用 4.2 不同时间指标的数据MySql内部的时间计算 4.3 实时交易播报MySql联表查询和内部遍历循环 4.4 每日交易量4.4.1.近…

Flutter开发日常练习-小猫咪杂货店(新增欢迎页,广告页和侧滑页面)

养小猫咪的伙伴来我的店铺逛逛吧!抖音商城搜索#早睡早起的猫咪小铺子 Flutter开发日常练习-小猫咪杂货店(新增动画和跳转抖音)_workersJiaDa的博客-CSDN博客URL Launcher是一个Flutter插件,它允许您的应用程序启动网络浏览器、地图应用程序、拨号器应用程序、邮件应…

Object Manager中的Hierarchy Columns

【前言】:最近偶然发现Object Manager中多了一项Hierarchy Columns,正好在做Case Mgmt这块的业务,需要做Case Hierarchy,或许熟悉这个新概念对后续方案的落地有一定启发。 #1. Account Hierarchy - 这个是标准功能,Acc…

【Winform学习笔记(二)】TextBox文本框实现按回车键触发Button事件

TextBox文本框实现按回车键触发Button事件 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 TextBox 文本框实现按回车键触发 Button 事件,该功能可实现在文本框中输入密码后不需要按登录或确定按钮,直接回…

如果建立一个由AI组成的社会……

你有没有想过,如果我们建立一个完全由AI组成的公民社会团体,让它们模仿人类的文明发展,那么这个AI社会最终将会进化到何种文明程度?需要明确的是AI社会只有AI,没有人类,完全是AI之间互相沟通交流&#xff0…

制作剧本杀小游戏系统

制作剧本杀小游戏软件的功能可以包括以下几点: 角色设定和分配:提供多种角色供玩家选择,根据玩家数量随机分配角色。 剧情框架:提供预设的剧情框架,或者允许用户自定义剧情。 背景设定:提供游戏…

图像处理:高斯滤波算法

目录 前言 概念介绍 基本原理 卷积核的大小 卷积核的形状和权重比 卷积核的归一化 结论 Opencv实现高斯滤波 Python手写实现高斯滤波 参考文章 前言 在此之前,我曾在此篇中推导过图像处理:推导五种滤波算法(均值、中值、高斯、双边…

linux 命令之 tar -czvf和 tar -xzvf

文章目录 一、概述:二、基础知识 一、概述: tar 用于linux 系统中压缩和解压 二、基础知识 tar常用命令参数说明 tar命令的czvf/xzvf参数分别代表的意义如下: -c 或–create 建立新的备份文件。 -x或–extract或–get 从备份文件中还原文件…

为什么用Selenium做自动化测试

手工测试的问题 手工操作点点点借助的是人脑的反应和聪明,为什么不用手点了呢?手会酸,脑子会累,会占据太多的时间。想一想为什么会学习自动化测试。我们都希望通过工具来解放我们的双手,大脑,眼睛。 为什…

蚂蚁安全科技 Nydus 镜像加速实践

蚂蚁安全科技 Nydus 镜像加速实践 原创 曦栖 金融级分布式架构 文|蚂蚁集团 ZOLOZ 团队 使用全球领先安全科技,为用户和机构提供安全、便捷的安全风控解决方案。 本文 6386 字 阅读 12 分钟 背景简介 ZOLOZ[1]是蚂蚁集团旗下的全球安全风控平台&…

84.qt qml-Sprite精灵、SpriteSequence、ImageParticle使用Sprite精灵动画(三)

在上章我们学习了83.qt qml-初步学习2D粒子影响器(二)_诺谦的博客-CSDN博客 然后还有两个影响器没有学习: 粒子精灵影响器SpriteGoal 粒子组影响器GroupGoal 本章我们便来学习粒子精灵和粒子精灵影响器 ImageParticle通过sprites来设置精灵列表,如下图所示: 所以我们需要…

JVM学习(八):运行时数据区——虚拟机栈(字节码程度深入剖析)

目录 一、概述 1.1 基于栈结构的虚拟机 1.2 栈和堆 二、虚拟机栈(Java Virtual Machine Stack)详述 2.1 虚拟机栈介绍 2.2 虚拟机栈作用 2.3 虚拟机栈特点 三、栈中常见的异常 3.1 StackOverflowError异常 3.2 OutOfMemoryError异常 四、…

OpenGL学习笔记(一)

文章目录 1. 顶点2. 着色器(Shader) 1. 顶点 OpenGL本质是一个状态机,点作为表示图形最基本的元素,如何告诉OpenGL点的基本信息就是我们要做的事情 1.1VertexArray VertexArray是所有顶点的集合,我们可以将VertexBuffer分成很多组&#xff…

Volatile系列(一):Volatile测试案例一可见性

系列文章 Volatile测试案例一可见性 目录​​​​​​​ 前言 测试1 逻辑 代码 结果 测试2 逻辑 代码 结果 结论 原理探讨(可见性) 前言 多线程是 JAVA 并发编程的主要应用,并发环境能大幅提高应用性能,提高 CPU 使用…

基于springboot+mysql+html实现智能停车场管理系统

基于springbootmysqlhtml实现智能停车场管理系统 一、系统介绍1、系统主要功能:2.涉及技术框架:3.本项目所用环境: 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能: 系统管理:角色管理、接口管…

华为OD机试真题(Java),货币单位换算(100%通过+复盘思路)

一、题目描述 记账本上记录了若干条多国货币金额,需要转换成人民币分 (fen),汇总后输出每行记录一条金额,金额带有货币单位,格式为数字单位,可能是单独元,或者单独分,或者元与分的组合要求将这…

解决方案:Zotero实现参考文献中英文混排,将英文文献中的“等”转成“et al.”

Zotero 是一款非常实用且易于使用的参考文献管理工具,可帮助用户收集、整理和引用各种类型的文献,包括图书、期刊文章、网页等。在学术写作中起着重要作用。 但是其在中文世界中,运行起来偶尔会出现问题,这里记录一个问题及其解决…