stm32定时器与pwm波

文章目录

  • 4 TIM
    • 4.1 SysTick系统定时器
    • 4.2 TIM定时器中断与微秒级延时
    • 4.3 TIM使用PWM波
      • 4.3.1 PWM介绍
      • 4.3.2 无源蜂鸣器实现
    • 4.4 TIM ,PWM常用函数

4 TIM

4.1 SysTick系统定时器

​ Systick系统滴答,(同时他有属于自己的中断,可以利用它来做看门狗):一般是一个24位的向下递减的计数器,一个时钟周期减1,减少到0时,触发中断。大小是从0~2的24次方-1。它的作用是用来做分时调动,维持os系统心跳,确定时间等,甚至有自己的中断SysTick_Hander,因为它的上限是24位的,所以对应的时钟的频率最高是16Mhz,主频如果超过它了,那就无法实现秒级延迟了,但是可以实现毫秒级延迟。Systick的赋值我们一般取HCLK时钟。所有时钟的来源最终都来源于内部RC震荡电路或者外部晶振。SysTick也不例外。

TIM计时器模型:

在这里插入图片描述

  1. 是RCC给该计时器的时钟源,通过时钟树配置。
  2. PSC预分频器,会将时钟源频率分成n+1份(因为是从0开始的),所以假如需要分成80份,那么要写80-1。
  3. CK_CNT:这个寄存器中存放着当前计数的值。
  4. ARR:即自动重装载计数器。

**TIM寄存器:**一般有四种寄存器

  1. 控制状态寄存器(CTRL):

    位段名称可读写类型复位值描述
    16COUNTFLAGR0主要是用来防止多读和误读。如果在上次读取本寄存器后,SysTick已经数到了0,则该位置设置为1,如果读取该位,该位将自动清零。
    2CLKSOURCER/W0时钟源的选择寄存器: 0=外部时钟源 (STCLK) 1=内部时钟源 (FCLK)
    1TICKINTR/W0即是否产生异常请求: 1=倒数到0时产生SysTick异常请求 0=数到0时无动作。
    0ENABLER/W0使能位,即SysTick定时器是否使能。
  2. 装载和重装载寄存器

    位段名称可读写类型复位值描述
    23:0RELOADR/W0当倒数至0时,将被重装载的值
    影子寄存器LOADR/W-RELOAD被重装载的值就在这里存储
  3. 当前数字寄存器(VAL):

    位段名称可读写类型复位值描述
    23:0CURRENTR/Wc0读取时返回当前倒计时的值,读取没有问题,但当写它则使之清零,同时还会清除在Systick控制及状态寄存器中的COUNTFLAG标志
  4. 校准数值寄存器(CALIB)

    位段名称可读写类型复位值描述
    31NOREFR-1=没有外部参考时钟(即不可用) 0=外部参考时钟可用
    30SKEWR-1=校准值不是准确的10ms 0=校准值准确的10ms
    23:0TENMSR/W00=无法使用校准功能 >0倒计数的格数

4.2 TIM定时器中断与微秒级延时

  • 通用定时器:只有定时功能,一般16位(0~65535)。
  • 高级定时器:除了定时功能,还有PWM功能。以及DAC为DMA提供时钟的功能。

计数器模式:有如上三种模式,使用定时器时有一些常用的参数如下:

  • PSC:分频器。
  • ARR:自动装载值,到这个值就触发自动重装载,即恢复到初始值。
  • 当前的值存放在CURRENT寄存器中。

微秒级延时实现:

​ 实现原理:例如80Mhz的工作频率,意味着1s中跳动了80M次,我们先使用分频器将定时器的工作频率分为80份,也就是1Mhz,那么对应的1hz就是1us。接下来我们基于这个原理来是实现它。

在这里插入图片描述

//如上,将PSC分频率器设置为80-1,由于计时器是16位的,所以滴答范围是0~65535.共65536个滴答,下面我们通过代码来实现。(tim是up模式)
void delay_us(uint16_t us)
{
  if (us>60000)
	{
		return ;
	}
  
	uint16_t				differ=60000-us;
	
	HAL_TIM_Base_Start(&htim6);
	
	__HAL_TIM_SET_COUNTER(&htim6, differ);
	
	while(differ<60000)
	{
		differ = __HAL_TIM_GET_COUNTER(&htim6);
	}
	
	HAL_TIM_Base_Stop(&htim6);
	
	return ;
}

//之后修改tim.h头文件,添加extern void delay_us(uint16_t us);

4.3 TIM使用PWM波

4.3.1 PWM介绍

​ 定时器除了定时以外,还能够产生PWM波。首先我们先来介绍一下PWM波。即脉冲宽度调制Pulse-width modulation)。pwm波可以简单理解为可以调试占空比的方波。占空比(即脉宽时间占整个周期的比例),整个周期就是一个脉冲信号的时间,而脉宽时间就是高电平的时间。PWM波可以用来模拟不同的输出电压。其原理就是通过不同的占空比比例实现D/A转化。

在这里插入图片描述

  • ARR:自动装载值。

  • CRR:决定了占空比,PWM波从CRR处电平反转。

4.3.2 无源蜂鸣器实现

​ 首先我们先明白有源蜂鸣器和无源蜂鸣器的区别,这个“源”指的是震荡源,所以:

  • 有源蜂鸣器内部带震荡源,所以只要一通电(给高电平或低电平)就会叫,即电平触发;
  • 而无源蜂鸣器内部不带震荡源,直流信号无法令其鸣叫,必须用 2K~5K 的方波去驱动它;

​ 无源蜂鸣器配置:

在这里插入图片描述

  1. 配置预分频:TIM2 的输入时钟为 APB1 时钟 80MHz,这个速率对定时器来说实在太快,
    这时需要对它做个预分频:CK_CNT = TIMxCLK/(PSC+1)=80MHz/(80-1+1)=1MHz;
  2. 配置 PWM 时钟:通过 TIM2 定时器的 ARR(自动重装载寄存)的值可以调整 PWM 的输出。
    频率,这里想让蜂鸣器工作在 2.7KHz,则:ARR=1MHz/2700 ~= 370。
  3. 配置占空比: 这里我们设置占空比为 50%,则 Pulse=370/2=185。

PWM波蜂鸣器实现:找到蜂鸣器对应的引脚的TIM的通道,我这里是TIM1的CHANNEL_4

//buzzer.h文件
#ifndef __BUZZER_H__
#define __BUZZER_H__
#include "tim.h"

extern void beep_start(uint8_t times, uint16_t interval);
#endif

//buzzer.c文件
#include "buzzer.h"

void beep_start(uint8_t times, uint16_t interval)
{
	while(times--)
	{
		if (HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4) != HAL_OK)
		{
			Error_Handler();
		}
		HAL_Delay(interval);
		
		if (HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4) != HAL_OK)
		{
			Error_Handler();
		}	
		HAL_Delay(interval);
	}
}

4.4 TIM ,PWM常用函数

//启动计时器tim1
HAL_TIM_Base_Start(&htim1);

//设置/获取COUNTER寄存器中的值
__HAL_TIM_SET_COUNTER(&htim1, differ);
__HAL_TIM_GET_COUNTER(&htim1);

//停止计时器tim1
HAL_TIM_Base_Stop(&htim1);

//启动PWM波型输出(定时器1的通道4),若成功返回HAL_OK
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4)
    
//关闭PWM波形输出(定时器1的通道4),若成功返回HAL_OK
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_4)

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

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

相关文章

Star CCM+界面显示字体大小调整

前言 打开界面字体显示大小是默认的&#xff0c;软件内设置调整默认字体的大小是无法实现&#xff0c;需要在图标属性中进行设置&#xff0c;操作方法与中英文切换很类似&#xff0c;具体方法如下&#xff1a; 操作流程 1. 右击Star-CCM快捷⽅式&#xff0c;选择“属性”&…

【Mindspore进阶】-03.ShuffleNet实战

ShuffleNet图像分类 当前案例不支持在GPU设备上静态图模式运行&#xff0c;其他模式运行皆支持。 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有…

lodash-es 基本使用

中文文档&#xff1a;https://www.lodashjs.com/ cloneDeep方法文档&#xff1a;https://www.lodashjs.com/docs/lodash.cloneDeep#_clonedeepvalue 参考掘金文章&#xff1a;https://juejin.cn/post/7354940462061715497 安装&#xff1a; pnpm install lodash-esnpm地址&a…

Ad-hoc命令和模块简介

华子目录 Ad-hoc命令和模块简介1.概念2.格式3.Ansible命令常用参数4.模块类型4.1 三种模块类型4.2Ansible核心模块和附加模块 示例1示例2 Ad-hoc命令和模块简介 1.概念 Ansible提供两种方式去完成任务&#xff0c;一是ad-hoc命令&#xff0c;一是写Ansible playbook(剧本)Ad-…

理解抽象工厂设计模式

目录 抽象工厂模式抽象工厂模式结构抽象工厂模式适合应用场景抽象工厂模式优缺点练手题目题目描述输入描述输出描述提示信息题解 抽象工厂模式 抽象工厂模式是一种创建型设计模式&#xff0c; 它能创建一系列相关的对象&#xff0c; 而无需指定其具体类。 抽象工厂模式结构 抽…

代码随想录Day69(图论Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查询 找到的祖先直接返回&#xff0c;未进行路径压缩 int.find(int i){if(fa[i] i)return i;// 递归出口&#xff0c;当到达了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…

nginx的知识面试易考点

Nginx概念 Nginx 是一个高性能的 HTTP 和反向代理服务。其特点是占有内存少&#xff0c;并发能力强&#xff0c;事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx 专为性能优化而开发&#xff0c;性能是其最重要的考量指标&#xff0c;实现上非常注重效率&#…

EasyExcel 单元格根据图片数量动态设置宽度

在使用 EasyExcel 导出 Excel 时&#xff0c;如果某个单元格是图片内容&#xff0c;且存在多张图片&#xff0c;此时就需要单元格根据图片数量动态设置宽度。 经过自己的研究和实验&#xff0c;导出效果如下&#xff1a; 具体代码如下&#xff1a; EasyExcel 版本 <depen…

SQL使用join查询方式找出没有分类的电影id以及名称

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 现有电影信息…

UE5 03-物体碰撞检测

在你需要碰撞的物体上添加一个碰撞检测组件 碰撞预设 设置为NoCollision,这样移动过程中就不会有物理碰撞阻挡效果,只负责检测是否碰撞,比较难解释,如果学过Unity的话,可以把它理解成 Collision 为 Trigger -------------------下面这个有点像Unity的OnTriggerEnter,跟OnColli…

TinyDB,既是python模块也是数据库

目录 什么是TinyDB&#xff1f; 为什么选择TinyDB&#xff1f; 安装TinyDB TinyDB的基本使用 创建数据库 存储数据 查询数据 更新数据 删除数据 高级功能 索引 事务 结论 什么是TinyDB&#xff1f; 在Python的世界中&#xff0c;处理数据是编程中不可或缺的一部分…

【优化论】基本概念与细节

优化论&#xff08;Optimization Theory&#xff09;是数学和计算机科学中一个重要的分支&#xff0c;旨在寻找给定问题的最优解。这个领域的应用非常广泛&#xff0c;从经济学、工程学到机器学习、金融等各个领域都有其踪迹。我们可以通过一系列直观的比喻来理解优化论的基本概…

这篇文章演示几种典型的编程模式

依赖注入使我们可以将依赖的功能定义成服务&#xff0c;最终以一种松耦合的形式注入消费该功能的组件或者服务中。除了可以采用依赖注入的形式消费承载某种功能的服务&#xff0c;还可以采用相同的方式消费承载配置数据的Options对象&#xff0c;这篇文章演示几种典型的编程模式…

Unity 简单载具路线 Waypoint 导航

前言 在游戏开发和导航系统中&#xff0c;"waypoint" 是指路径中的一个特定位置或点。它通常用于定义一个物体或角色在场景中移动的目标位置或路径的一部分。通过一系列的 waypoints&#xff0c;可以指定复杂的移动路径和行为。以下是一些 waypoint 的具体用途&…

5款文案自动生成器,快速创作高质量文案

随着科技的发展&#xff0c;市面上出现了许多文案自动生成器&#xff0c;为我们的创作过程提供了极大的便利。无论是为了社交媒体内容创作&#xff0c;还是产品的文案的宣传&#xff0c;文案自动生成器就能为我们快速且高效地生成高质量的文案。以下将为大家分享5款备受赞誉的文…

nexus未开启匿名访问Anonymous Access,访问maven元数据maven-metadata,报401未授权Unauthorized错误

一、背景 下午在调试nexus的时候&#xff0c;其他同事不小心把匿名访问停用了&#xff0c;导致客户端android打包的时候&#xff0c;报错&#xff1a; Received status code 401 from server: Unauthorized。 访问http://192.168.xx.xx:8081/repository/public/com/xxx/xxxcor…

es6新语法

es6新语法 1 什么是ES6 JS语法分三块 ECMAScript : 基础语法BOM 浏览器对象 history location windowDOM 文档对象 document 编程语言JavaScript是ECMAScript的实现和扩展 。ECMAScript是由ECMA&#xff08;一个类似W3C的标准组织&#xff09;参与进行标准化的语法规范。ECMAS…

Selenium的这些自动化测试技巧你知道几个?

Selenium自动化测试技巧 与以前瀑布式开发模式不同&#xff0c;现在软件测试人员具有使用自动化工具执行测试用例套件的优势&#xff0c;而以前&#xff0c;测试人员习惯于通过测试脚本执行来完成测试。 但自动化测试的目的不是完全摆脱手动测试&#xff0c;而是最大程度地减少…

阶段总结——基于深度学习的三叶青图像识别

阶段总结——基于深度学习的三叶青图像识别 文章目录 一、计算机视觉图像分类系统设计二、训练模型2.1. 构建数据集2.2. 网络模型选择2.3. 图像数据增强与调参2.4. 部署模型到web端2.5. 开发图像识别小程序 三、实验结果3.1. 模型训练3.2. 模型部署 四、讨论五、参考文献&#…

js函数扩展内容---多参数,函数属性,字符串生成函数

1.多参数 在js中&#xff0c;Math.max()方法可以接受任意数量的参数&#xff0c; Math.max(1,2,3,4);//4 Math.max(1,2,3,4,5,6,7,8,9,10)//10 在max方法里面有一个rest参数&#xff0c;它接受了所有参数全部合成到了一个number数组里面&#xff0c; function rest(a,b,...a…