【STM32HAL库学习】定时器功能、时钟以及各种模式理解

news2024/12/29 10:28:04

一、文章目的

记录自己从学习了定时器理论->代码实现使用定时->查询数据手册,加深了对定时器的理解以及该过程遇到了的一些不清楚的知识。

请添加图片描述

  • 上图为参考手册里通用定时器框图,关于定时器各种情况的工作都在上面了,在理论学习和实际应用后再来看这张图会觉得豁然开朗。

  • 定时器基本的单元为16位自动装载寄存器ARR,16位预分频器PSC,计数器CNT,另外有4个独立通道,在我看来只有两种大功能:
    输入捕获 (如测输入信号频率、占空比、编码器)
    输出比较 (如输出PWM波控制电机、舵机)
    根据这两种功能可以将定时器配置为不同模式,比如输出pwm的PWM模式、读取编码器的Encoder模式。

二、定时器时钟来源选择(极为重要)

内部时钟(CK_INT)
内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器
外部时钟模式1:外部输入脚(TIx) ,4个独立通道的输入
外部时钟模式2:外部触发输入(ETR) ,模式1和模式2看上去非常相似
在这里插入图片描述

清楚定时器的时钟来源,后续才能理解定时器的各种模式

三、 理解最基本的定时

在时钟的驱动下,计数器CNT递增+1(默认向上计数),当到达自动重装载寄存器ARR中的目标值时,溢出清零,产生中断,循环这个过程。

HAL库实现基本定时

  • 1、打开并设置基本定时器
      1. 选择为内部时钟,即内部时钟模式
      1. 设置以下参数:定时器的时钟频率 fc=f /(PSC+1)/(ARR+1),f为单片机时钟来源。
    • 预分频器Prescaler    PSC
      
    • 自动重装寄存器CouterPeriod   ARR
      
    • 输入滤波器的频率分频InternalClockDivision(一般不需要)
      

在这里插入图片描述

  • 2、打开中断
    在这里插入图片描述
  • 3、main函数中初始化TIM2
HAL_TIM_Base_Start_IT(&htim2);

4、驱动函数中找回调函数然后在main.c中重写

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim); //原型
//重写
uint16_t hhRetCount=0;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
	if(htim==&htim2){
		hhRetCount+=1;
	}
}

四 、输出比较

此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。

定时器的每个输出通道能够独立的产生一路PWM信号(由ARR寄存器确定频率、由CCR寄存器确定占空比的信号。)

HAL库实现生成PWM(驱动舵机、电机、呼吸灯)

  • 1、设置TIM2定时器相关参数

    • 生成1000HZ,占空比为20的PWM波形
      在这里插入图片描述

    HAL库实现编码器读取

  • 2、main函数中启动生成PWM

HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,Speed); //设置CCR值控制占空比

五 、输入捕获

输入捕获模式下,当通道输入引脚出现指定电平跳变时(类似于中断),当前CNT的值将被锁存到CCR中,可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数。

可配置为PWMI模式(不清楚没关系),同时测量频率和占空比;也可配合主从触发模式`(下文中从模式的复位模式),实现硬件全自动测量(触发输入实现定时器的自动清零)。

对于同一个定时器,输入捕获和输出比较只能同时用一个。
输入捕获:将CNT的值写到CCR
输出比较:根据CNTCCR的比较后输出

输入捕获测频率、测占空比

在这里插入图片描述

从模式-复位模式下,上升沿触发,因此上升沿来临时,计数器CNT的值存进了CCR1中然后自动清零;下降沿来临时,CNT的值存进了CCR2中,并未清零。然后可以计算频率(用CCR1)和占空比(用CCR1和CCR2)。

在这里插入图片描述

HAL库实现输入测频率、占空比

  • 1、TIM2生成PWM待测信号、启动
  • 2、设置TIM3定时器相关参数
    • 通道1用于测频率
      1. 设置TI1FP1ResetMode,即清空计数
      1. 使用内部时钟
      1. 通道1设置为输入捕获模式
      1. 设置预分频器为72
      1. 自动重装寄存器为65535
      1. 输入捕获上升沿
    • 通道2用于测占空比
      1. 打开通道2为交叉模式、设置下降沿触发

通道1

通道2
在这里插入图片描述

  • 3、打开TIM3的全局中断、main中开启TIM3
    在这里插入图片描述
HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);

3、找到输入捕获回调函数并重写

uint32_t capture;
int32_t freq;
uint32_t DutyResult;
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == TIM3) {
		if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
		// 上升沿触发的中断
			capture =HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1)+1;
			uint32_t aa=HAL_RCC_GetPCLK1Freq();
			uint32_t bb=(htim->Instance->PSC+1);
			uint32_t cc=HAL_RCC_GetPCLK1Freq()/(htim->Instance->PSC+1);
			freq=1000000/capture;
		} else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
			// 下降沿触发的中断
			uint32_t capture2 =HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2)+1;
			DutyResult=capture2 *100 / capture;
		}
	}
}

可动态修改TIM2的频率和占空比

__HAL_TIM_SET_PRESCALER(&htim2,72-1);//10000HZ
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, 83);//83%

HAL库实现读取旋转编码器

每个高级定时器和通用定时器都拥有一个编码器接口,借用输入捕获IC的通道1和通道2。

在这里插入图片描述

当定时器设置为编码器接口时,定时器的计数器就不会由内外部时钟控制,而是由两个正交编码器信
号控制。另外,还可以根据选择的计数方式(TI1、TI2计数还是都计数)以及信号上下沿、电平高低的判断确定方向。
在这里插入图片描述
利用CUBMX配置编码器模式非常简单:

  • 1、设置相关参数
      1. 打开编码器模式(使用CH1、CH2两个通道)
      1. 设置定时器的相关参数。由于是检测速度,所以这里就不分频,尽可能让定时器快点。计数器 设置最大,防止输入信号频率太高溢出。
      1. 设置计数模式,TI1计数和TI2计数
      1. 设置信号不反向
        在这里插入图片描述
  • 2、main函数中打开定时器编码器模式
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
  • 3、显示计数值
    计数器CNT返回的是一个无符号的 uint32_t 数,因此如果希望反转能够显示负数,还需要将CNT值转换为有符号的 int16_t 数。
//得到计数值
int16_t CNT=__HAL_TIM_GET_COUNTER(&htim3);

  • 4、计算速度
    如果还希望计算编码器速度,那就秒钟读取一次定时器的计数值(编码器的脉冲)并清空,得到的数字就是当前的速度,单位是Plus/S
int16_t hhGetEncoderSpeedCountAndReset(){
	int16_t Speed;
	Speed=__HAL_TIM_GET_COUNTER(&htim3);
	__HAL_TIM_SET_COUNTER(&htim3,0);
	return Speed;
}

六、主从模式

请添加图片描述

根据定时器的时钟来源(或者说是否受到从模式控制器的控制),可以将定时器的工作状态分为主模式和从模式
首先,触发信号分两大类:触发输入信号TRGI,简单地讲就是从外部引入到本定时器的信号;另一类就是触发输出信号,即TRGO信号,它是定时器输出给其它定时器或外设的触发信号。

从数目上有讲一般可以多达8个,大致分为三类:
在这里插入图片描述

第一类来自定时器自身输入通道1或通道2的输入信号,经过极性选择和滤波以后生成的触发信号,连接到从模式控制器,进而控制计数器的工作。 (TI1FP1 、 TI2FP2、TI1F_ED

第二类来自于外部触发脚ETR脚经过极性选择、分频、滤波以后的信号,经过触发输入选择器,连接到从模式控制器 (ETRF

第三类来自其它定时器的触发输出信号TRGO,通过内部线路连接到本定时器的触发输入控制器而连接到从模式控制器。(ITR0、ITR1、ITR2、ITR3)

这3类信号有个共同特点:都要经过触发输入选择器而连接到从模式控制器,从而使得计数器的工作受到从模式控制器的控制或影响,基于这一点,定时器工作在从模式。而主模式:定时器内部信号映射到TRGO引脚用于触发别的外设。

七、定时器的4种从模式

  • 复位模式
  • 门控模式
  • 触发模式
  • 外部时钟模式2+触发模式
    在我看来从模式其实就是在正常使用定时器外再添加一个控制功能,根据实际的需要再配置即可。

复位模式

在发生一个触发输入事件时,计数器和它的预分频器能够重新被初始化;同时,如果TIMx_CR1寄存器的URS位为低,还会产生一个更新事件UEV;然后所有的预装载寄存器(TIMx_ARR,TIMx_CCRx)都会被更新。

例如TI1输入端的上升沿导致向上计数器被清零:计数器开始依据内部时钟计数,然后正常运转直到TI1出现一个上升沿;此时,计数器被清零然后从0重新开始计数。同时,触发标志(TIMx_SR寄存器中的TIF位)被设置,根据TIMx_DIER寄存器中TIE(中断使能)位和TDE(DMA使能)位的设置,产生一个中断请求或一个DMA请求。

门控模式

按照选中的输入端电平使能计数器。
例如下图,计数器只在TI1输入电平为低时计数+1
在这里插入图片描述

触发模式

按照输入端上选中的事件使能计数器。
例如下图,计数器在TI2输入的上升沿开始向上计数

在这里插入图片描述

外部时钟模式2+触发模式

外部时钟模式2可以与另一种从模式(外部时钟模式1和编码器模式除外)一起使用。
外部时钟模式2,ETR信号被用作外部时钟的输入,在复位模式、门控模式或触发模式时可以选择另一个输入作为触发输入。

例如下图,TI1输入上升沿使能计数器,然后在ETR信号每次的上升沿计数

在这里插入图片描述

八、其他

遇到查询数据手册即可

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

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

相关文章

spring常用注解(八)@Async

一、介绍 1、介绍 二、原理 三、集成与使用 1、集成方法 &#xff08;1&#xff09;开启 使用以下注解开启 EnableAsync &#xff08;2&#xff09;使用 在需要异步处理的方法上加上 Async 2、返回值 Async注解的方法返回值只能为void或者Future<T>。 &…

轻松实现App推广代理结算,Xinstall超级渠道功能助您一臂之力!

在App推广的广阔天地中&#xff0c;与渠道方建立合作关系&#xff0c;共同实现用户增长和品牌提升&#xff0c;已成为众多开发者和广告主的共识。然而&#xff0c;如何高效管理这些渠道、监测推广效果、实现代理结算&#xff0c;一直是困扰大家的难题。今天&#xff0c;我们就来…

比较器 XD393 XINLUDA(信路达) DIP-8 2.5mA 模拟比较器 双路差动

XD393是一款比较器集成电路&#xff0c;适用于各种电子设备中的信号比较和处理。它的应用领域可能包括但不限于以下几个方面&#xff1a; 1. 电源管理&#xff1a;在电源管理系统中&#xff0c;XD393可以用来监控电压水平&#xff0c;确保系统稳定运行&#xff0c;或者触发某…

振动分析-2-信号频域分析以及频率分辨率的理解

参考2023-11-26 什么是频率&#xff1f; 参考2016-10-31什么是固有频率&#xff1f; 参考2024-01-28什么是频率分辨率&#xff1f; 参考2024-01-07香农采样定理有两种描述&#xff0c;哪个正确&#xff1f; 1 什么是频率 1.1 频率的定义 我们把振动发生完成一个完整往复循环…

利用 AI 深度学习,实现化合物配比最优化解决方案

为什么需要化合物配比的优化&#xff1f; 在化合物制造行业中&#xff0c;化合物的配比是产品质量控制的关键环节。 化合物制造流程 目前&#xff0c;这一过程高度依赖于材料专家和工程技术人员的经验&#xff0c;通过反复试验来验证产品性能&#xff0c;确保其满足市场和客户的…

Redis实现分布式锁有哪些方案?

Redis实现分布式锁有哪些方案&#xff1f; 在这里分享六种Redis分布式锁的正确使用方式&#xff0c;由易到难。 本文已收录到Java面试网站 方案一&#xff1a;SETNXEXPIRE 方案二&#xff1a;SETNXvalue值(系统时间过期时间) 方案三&#xff1a;使用Lua脚本(包含SETNXEXPIRE…

谷粒商城实战(033 业务-秒杀功能4-高并发问题解决方案sentinel 2)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第332p-第p335的内容 熔断降级 开启对Feign远程服务的熔断保护机制 feign.sentinel.enabletrue 这里我们只是调用方加就行 被调用方不用加 正常…

【Ai】使用LabelStudio做数据标注

一、什么是LabelStudio LabelStudio是一个功能丰富、灵活便捷、易于使用的数据标注工具&#xff0c;适用于各种机器学习和深度学习项目中的数据标注工作。有特点如下&#xff1a; 多功能性&#xff1a;LabelStudio支持为多种数据类型创建自定义标注界面&#xff0c;包括图像、…

【会议征稿,五大海内外高校支持】第四届经济发展与商业文化国际学术会议(ICEDBC2024,6月21-23)

第四届经济发展与商业文化国际学术会议&#xff08;ICEDBC2024&#xff09;将于2024年6月21-23日在中国大连隆重召开。会议主要围绕“经济发展”“商业文化”等研究领域展开讨论。 旨在为经济&#xff0c;商业的专家学者及企业发展人提供一个分享研究成果、讨论存在的问题与挑战…

富瀚微FH8322 ISP图像调试—BLC校正

1、简单介绍 目录 1、简单介绍 2、调试方法 3、输出结果 富瀚微平台调试有一段时间了&#xff0c;一直没有总结&#xff0c;我们调试ISP的时候&#xff0c;首先一步时确定好sensor的黑电平值&#xff0c;黑电平如果不准&#xff0c;则会影响到后面的颜色及对比度相关模块。…

AI预测福彩3D采取888=3策略+和值012路或双胆下一测试6月11日新模型预测第1弹

很抱歉各位小伙伴&#xff0c;端午节三天去了趟外地&#xff0c;没有按时更新3D和排三的预测。前面跟大家说过&#xff0c;8码定位是关键&#xff0c;8码定位能稳定在80%的命中率&#xff0c;才有望通过缩号缩至200-250注以内通过等额方式进行投资。由于前面的模型对8码定位的效…

MONA来了 小鹏子品牌首车定名M03,20万内空间智能颜值都要能打

作者 |苗岭 编辑 |德新 小鹏汽车今日公布&#xff0c;MONA系列的第一款车正式命名为&#xff0c;小鹏M03。 9个月前&#xff0c;小鹏汽车从滴滴手中收购了代号为「达芬奇」的造车项目。 5月21日&#xff0c;何小鹏在小鹏汽车的第一季度财报会议上宣布&#xff0c;MONA系列的…

超详解——Python 编程中的类型和对象深入探讨——基础篇

目录 1. 内建类型的布尔值 1.1 布尔值的基本规则 1.2 进阶应用 2. 对象身份的比较 2.1 基本概念 2.2 示例代码 2.3 实际应用 3. 对象类型比较 3.1 基本概念 3.2 示例代码 3.3 实际应用 4. 类型工厂函数 4.1 常见的类型工厂函数 4.2 示例代码 4.3 实际应用 5. P…

【推荐收藏】2024年5款最佳 GPU 渲染引擎大盘点

2024年已经过半&#xff0c;对于从事3D渲染和数字内容创作的朋友来说&#xff0c;选择一款高效的GPU渲染引擎至关重要。今天&#xff0c;小编就来为大家盘点一下2024年5款最佳GPU渲染引擎。 1.V-Ray V-Ray是一款备受欢迎的3D GPU渲染引擎&#xff0c;被建筑、视觉特效、室内设…

阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的

dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具&#xff0c;可以帮助企业或者个人实现多数据源的切换&#xff0c;这里通过阅读源码的方式解析是如何动态的切换数据源的&#xff0c;采用的版本是3.5.1 源码解析 通过官方文档可以看到&#x…

leetcode 所有可能的路径(图的遍历:深度优先和广度优先)

leetcode 链接&#xff1a; 所有可能的路径 1 图的基本概念 1.1 有向图和无向图 左边是有向图&#xff0c;右边是无向图。对于无向图来说&#xff0c;图中的边没有方向&#xff0c;两个节点之间只可能存在一条边&#xff0c;比如 0 和 1 之间的边&#xff0c;因为是无向图&am…

抖音 根据sec uid获取个人详细信息(性别、年龄、属地、关注数、粉丝数、简介等)

本文带来用户的secuid获取用户信息以及其他基本信息&#xff1a; 话不多说看效果&#xff1a; 第一步输入用户sec_uid 根据secuid获取到用户基本信息&#xff1a; 可以支持接口批量转换&#xff0c;欢迎咨询

从数据采集到部署,手把手带你训练一个高质量的图像分类模型

本文来自社区投稿&#xff0c;作者李剑锋 MMPreTrain 是一款基于 PyTorch 的开源深度学习预训练工具箱&#xff0c;本文将从数据采集到部署&#xff0c;手把手带大家使用 MMPreTrain 算法库训练一个高质量的图像分类模型。 MMPreTrain 项目链接&#xff1a; https://github.co…

正则表达式(Linux 下搭配 grep 使用)

目录 1.基本正则表达式 2.扩展正则表达式 3.实操之grep筛选 3.1基本正则表达式 3.2扩展正则表达式 1.基本正则表达式 ^ 用于最左端,如^"abc",匹配以abc开头的行 $ 用于最右端,如"abc$",匹配以abc结尾的行 ^$ …

使用Oracle VM VirtualBox安装Centos7

下载软件 VirtualBox下载&#xff1a; https://www.virtualbox.org/ CentOS7下载&#xff1a;http://mirrors.aliyun.com/centos/7/isos/x86_64/(阿里云镜像下载快) VirtualBox下载好之后&#xff0c;双击运行后&#xff0c;根据提示直接下一步到底就行了。 下面开始安装cent…