034 - STM32学习笔记 - TIM定时器(三) - 高级定时器2

news2024/11/19 13:23:40

034 - STM32学习笔记 - TIM定时器(三) - 高级定时器2

在这里插入图片描述

哥们最近搞了个公众号,后面的文章会同步在公众号上发布,各位看官帮忙点点关注,后续一些其他方面的学习内容也会在公众号上发布,有兴趣的可以看看哟,扫描下方二维码(或搜索“自动化小白菜”)关注,感谢各位大佬对小弟的支持和指导!
在这里插入图片描述

上节内容将高级控制定时器内容都过了一遍,这节讲一下输入捕获和输出比较的应用。

一、输入捕获

输入捕获常用在脉冲跳变沿事件测量或者PWM输入测量。

1、测量脉宽或者频率

在这里插入图片描述

测量频率:当捕获通道TIx上出现上升沿时,发生第一次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,再中断服务子程序中记录一次捕获,并且把捕获寄存器中的值读取到value1中,当出现第二次上升沿时,发生第二次捕获,计数器CNT的值再次被锁存到捕获寄存器CCR中,并再次进入捕获中断,再捕获中断中,读取捕获寄存器的值到value3中,并清除捕获记录标志,如此就可以利用value3和value1的擦之计算信号周期(频率)。

测量脉宽:当捕获通道TIx上出现上升沿时,发生第一次捕获,计数器CNT的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,再中断服务子程序中记录一次捕获,并且把捕获寄存器中的值读取到value1中。然后捕获边沿变更为下降沿捕获,当下降沿到来时,发生第二次捕获,计数器将CNT的值再次锁存到捕获寄存器CCR中,并再次进入捕获中断,再中断中将捕获寄存器的值读取到value3中,并清除捕获标志,然后再将捕获标志变为上升沿捕获。

测量脉宽过程中,需要不停的切换捕获边沿的极性,如果测量的脉宽时间比较长,定时器会发生溢出,并产生更新中断,可以到中断中对溢出进行记录处理。

2、PWM输入模式

除了向上面的方式去测量脉宽和频率的方法外,还可以使用PWM输入模式测量,只是上面的办法只需要一个捕获寄存器就可以,但是PWM输入模式需要一次占用两个捕获寄存器。

在这里插入图片描述

当使用PWM输入模式时,输入通道TIx会占用两个捕获通道ICx,上图中以TI1为例,信号被分为两路,分别为TI1FP1和TI1FP2,这两路中分别为周期和占空比,具体那一路是周期,那一路是占空比,需要在程序上设置哪一路作为触发输入,触发输入的就是周期,另外一路就是占空比。再出发输入的一路上还需要设置捕获极性是上升沿还是下降沿,配置好后,另外一路会自动配置为相反的极性捕获。

当使用PWM输入模式时,需要将从模式控制器配置为复位模式(SMCR的SMS[2:0]设置为100),该设置可在当启动触发信号开始进行捕获时,同时把计数器CNT复位清零。

在这里插入图片描述

PWM信号由通道TI1进入,配置TI1FP1为触发信号,上升沿开始捕获,当上升沿到达时,IC1和IC2同时捕获,CNT计数器清零,到下降沿时IC2捕获,此时计数器CNT的值被所存到捕获寄存器CCR2中,到了下一个下降沿时,IC1捕获,计数器CNT的值被锁存到捕获寄存器CCR1中,此时CCR2测量的数据就是脉宽,CCR1测量的为周期。

相比于之前说的方法,从软件实现层面上来说,PWM输入模式测量脉宽和周期会更容易一些,但是需要占用两个捕获寄存器。

二、输出比较

输出比较模式一共由8种模式,这个在上节由说过,使用哪种模式具体由寄存器CCMRx的OCxM[2:0]进行配置。这届使用常用的PWM模式,其他几种模式后面找机会再学习。

1、PWM输出模式

PWM输出就是对外输出脉宽(即占空比)可调的方波信号,信号频率由自动重装寄存器ARR的值决定,占空比由比较寄存器CCR的值决定。

PWM分为两种模式,PWM1和PWM2,两者差别看一下下表格:

模式计数器CNT计算方式说明
PWM1递增CNT<CCR,通道CH为有效,否则为无效
递减CNT>CCR,通道CH为无效,否则为有效
PWM2递增CNT<CCR,通道CH为无效,否则为有效
递减CNT>CCR,通道CH为有效,否则为无效

下面主要使用PWM1模式,以及暑期CNT计数的方向不同还分为边沿对齐模式和中心对齐模式。OWM信号主要都是用来控制电机,一般的电机控制用的都是边沿对其模式,FOC电机一般用中心对齐模式。

1.1、PWM边沿对齐模式

在递增计数模式下,计数器从0计数到自动重载值,然后重新从0还是计数并生成计数器上溢事件。

在这里插入图片描述

在边沿对齐模式下,计数器CNT只工作在一种模式,递增或者递减模式。这里我们以CNT工作在递增模式为例,ARR=8,CCR=4,CNT从0开始计数,当CNT<CCR时,OCxREF为有效的高电平,与此同时比较中断寄存器CCxIF置位。当CCR=<CNT<=ARR时,OCxREF为无效的低电平,然后CNT又从0开始计数,并生成计数器上溢事件,以此循环往复。

1.2、PWM中心对齐模式

在中心对齐模式下,CNT时工作在递增/递减模式下,开始时,计数器CNT从0来时计数到ARR-1,生成计数器上溢事件,然后从ARR值开始递减计数到1,生成计数器下溢事件,之后从0开始从新计数。

在这里插入图片描述

上图中ARR=8,CCR=4。第一阶段计数器CNT工作在递增模式下,从0开始计数,当CNT<CCR时,OCxREF为有效的高电平,当CCR=<CNT<ARR时,OCxREF为无效的低电平。第二阶段计数器CNT工作在递减模式,从ARR的值开始递减,当CNT>CCR时,OCxREF为无效的低电平,当CCR=>CNT>=1时,OCxREF为有效的高电平。

在波形图上,可以分为两个阶段,第一阶段是计数器CNT工作在递增模式的波形,在这儿给阶段分为①和②两个阶段,在第二阶段时计数器CNT工作在递减模式的波形,这个阶段我们分为③和④两个阶段,在中心对齐的波形下,①③阶段时间相等,②④阶段时间相等。

中心对其模式分为三种。分别为中心对齐模式1/2/3,具体由寄存器CR1位的CMS[1:0]进行配置。具体的区别就是比较中断标志位CCxIF在什么时候置1:

  • 中心对齐模式1在CNT递减计数时置1;
  • 中心对齐模式2在CNT递增计数时置1;
  • 中心对齐模式3在CNT递增和递减计数时都置1。
三、定时器初始化结构体详解

定时器的四个初始化结构体在基本定时器那节已经学习过关于时基初始化结构体TIM_TimeBaseInitTypeDef结构体的内容了,这节再看一下其他几个结构体

  • 输出比较初始化结构体TIM_OCInitTypeDef
  • 输入捕获初始化结构体TIM_ICInitTypeDef
  • 断路和死区初始化结构体TIM_BDTRInitTypeDef

在高级控制定时器中,这四个结构体都可以用到,通用定时器不使用TIM_BDTRInitTypeDef结构体,基本定时器只是用时基结构体。初始化结构体成员用于设定定时器工作环境参数,并由定时器相应初始化配置函数调用。

1、输出比较初始化结构体TIM_OCInitTypeDef

输出比较初始化结构体TIM_OCInitTypeDef用于输出比较模式,与TIM_OCxInit函数配合使用完成指定定时器输出通道初始化配置。高级控制定时器由四个定时器通道,使用的时候必须都单独设置一下。

typedef struct {
	uint16_t TIM_OCMode;		// 比较输出模式
	uint16_t TIM_OutputState;	// 比较输出使能
	uint16_t TIM_OutputNState;	// 比较互补输出使能
	uint32_t TIM_Pulse;			// 脉冲宽度
	uint16_t TIM_OCPolarity;	// 输出极性
	uint16_t TIM_OCNPolarity;	// 互补输出极性
	uint16_t TIM_OCIdleState;	// 空闲状态下比较输出状态
	uint16_t TIM_OCNIdleState;	// 空闲状态下比较互补输出状态
}TIM_OCInitTypeDef;

参数解析:

TIM_OCMode:比较输出模式选择,在前面有提到过共有八种,常用的为PWM1/PWM2。通过设定CCMRx中OCxM[2:0]来进行配置。配置模式可以参考用户手册查询一下。

TIM_OutputState:比较输出使能,决定最终的输出比较信号OCx是否通过外部引脚输出,该成员设定TIMx_CCER的CCxE/CCxNE位的值。

TIM_OutputNState:比较互补输出使能,决定 OCx 的互补信号 OCxN 是否通过外部引脚输出。该成员设定CCER的CCxNE位的值。
TIM_Pulse:比较输出脉冲宽度,实际设定比较寄存器CCR的值,决定脉冲宽度。可设置范围为0至65535。
TIM_OCPolarity:比较输出极性,可选OCx为高电平有效或低电平有效。它决定着定时器通道有效电平。该成员设定CCER寄存器的CCxP位的值。
TIM_OCNPolarity:比较互补输出极性,可选OCxN为高电平有效或低电平有效。该成员设定 TIMx_CCER 寄存器的CCxNP位的值。
TIM_OCIdleState:空闲状态时通道输出电平设置,可选输出1或输出0,即在空闲状态(BDTR_MOE位为0)时,经过死区时间后定时器通道输出高电平或低电平。该成员设定CR2寄存器的OISx位的值。
TIM_OCNIdleState:空闲状态时互补通道输出电平设置,可选输出1或输出0,即在空闲状态(BDTR_MOE位为 0)时,经过死区时间后定时器互补通道输出高电平或低电平,设定值必须与TIM_OCIdleState相反。该成员设定是CR2寄存器的OISxN位的值。

2、输入捕获初始化结构体TIM_ICInitTypeDef

输入捕获结构体TIM_ICInitTypeDef用于输入捕获模式,与TIM_ICInit函数配合使用完成定时器输入通道初始化配置。如果使用 PWM 输入模式需要与TIM_PWMIConfig函数配合使用完成定时器输入通道初始化配置。

typedef struct {
	uint16_t TIM_Channel;		// 输入通道选择
	uint16_t TIM_ICPolarity;	// 输入捕获触发选择
	uint16_t TIM_ICSelection;	// 输入捕获选择
	uint16_t TIM_ICPrescaler;	// 输入捕获预分频器
	uint16_t TIM_ICFilter;		// 输入捕获滤波器
}TIM_ICInitTypeDef;

TIM_Channel:捕获通道ICx选择,可选TIM_Channel_1、TIM_Channel_2、TIM_Channel_3或TIM_Channel_4四个通道。它设定CCMRx寄存器CCxS位的值。
TIM_ICPolarity:输入捕获边沿触发选择,可选上升沿触发、下降沿触发或边沿跳变触发。它设定CCER寄存器CCxP位和CCxNP位的值。
TIM_ICSelection:输入通道选择,捕获通道ICx的信号可来自三个输入通道,分别为TIM_ICSelection_DirectTITIM_ICSelection_IndirectTITIM_ICSelection_TRC。它设定CCRMx寄存器的CCxS[1:0]位的值。

TIM_ICPrescaler:输入捕获通道预分频器,可设置1、2、4、8 分频,它设定CCMRx寄存器的ICxPSC[1:0]位的值。如果需要捕获输入信号的每个有效边沿,则设置1分频即可。
TIM_ICFilter:输入捕获滤波器设置,可选设置0x0至0x0F。它设定CCMRx寄存器ICxF[3:0]位的值。一般我们不使用滤波器,即设置为0。

3、断路和死区初始化结构体TIM_BDTRInitTypeDef

断路和死区结构体TIM_BDTRInitTypeDef用于断路和死区参数的设置,属于高级定时器专用,用于配置断路时通道输出状态,以及死区时间。它与TIM_BDTRConfig函数配置使用完成参数配置。 这个结构体的成员只对应BDTR这个寄存器,有关成员的具体使用配置请参考手册BDTR寄存器的详细描述。

typedef struct{
	uint16_t TIM_OSSRState;			// 运行模式下的关闭状态选择
	uint16_t TIM_OSSIState;			// 空闲模式下的关闭状态选择
	uint16_t TIM_LOCKLevel;			// 锁定配置
	uint16_t TIM_DeadTime;			// 死区时间
	uint16_t TIM_Break;				// 断路输入使能控制
	uint16_t TIM_BreakPolarity;		// 断路输入极性
	uint16_t TIM_AutomaticOutput;	// 自动输出使能
}TIM_BDTRInitTypeDef;

TIM_OSSRState:运行模式下的关闭状态选择,它设定BDTR寄存器OSSR位的值。
TIM_OSSIState:空闲模式下的关闭状态选择,它设定BDTR寄存器OSSI位的值。
TIM_LOCKLevel:锁定级别配置,BDTR寄存器LOCK[1:0]位的值。
TIM_DeadTime:配置死区发生器,定义死区持续时间,可选设置范围为0x0至0xFF。它设定BDTR寄存器DTG[7:0]位的值。
TIM_Break:断路输入功能选择,可选使能或禁止。它设定BDTR寄存器BKE位的值。
TIM_BreakPolarity:断路输入通道BRK极性选择,可选高电平有效或低电平有效。它设定BDTR寄存器BKP位的值。
TIM_AutomaticOutput:自动输出使能,可选使能或禁止,它设定BDTR寄存器AOE位的值。
TIM_Break:断路输入功能选择,可选使能或禁止。它设定BDTR寄存器BKE位的值。
TIM_BreakPolarity:断路输入通道BRK极性选择,可选高电平有效或低电平有效。它设定BDTR寄存器BKP位的值。
TIM_AutomaticOutput:自动输出使能,可选使能或禁止,它设定BDTR寄存器AOE位的值。

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

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

相关文章

电脑可以连接网络但浏览器无法访问部分或全部网页

啾咪&#xff01;离大谱了&#xff0c;电脑一段时间没有用&#xff0c;最近打开却发现可以连接网络但是无法访问部分网页&#xff08;如CSDN&#xff09;&#xff0c;显示如下&#xff1a; 有三种解决方法&#xff1a; &#xff08;1&#xff09;清除DNS缓存 步骤&#xff1a;…

为什么删掉MySQL表中一半的数据,表文件大小却不变?

一个InnoDB表包含两部分&#xff1a;表结构定义和数据。表结构定义占用空间很小&#xff0c;所以主要来看一下表数据。 表数据既可以存放在共享表空间里&#xff0c;也可以是单独的文件。由参数innodb_file_per_table控制&#xff0c;这个参数值为OFF&#xff0c;则表示存放在…

Unity——VContainer的依赖注入

一、IOC控制反转和DI依赖倒置 1、IOC框架核心原理是依赖倒置原则 C#设计模式的六大原则 使用这种思想方式&#xff0c;可以让我们无需关心对象的生成方式&#xff0c;只需要告诉容器我需要的对象即可&#xff0c;而告诉容器我需要对象的方式就叫做DI&#xff08;依赖注入&…

亚马逊店铺账号在申诉中需要注意的几点?

切勿推卸责任 如需提供证明材料&#xff0c;确保证明材料的真实性(比如有时候要拆料) 不要给自己加罪名。问题是什么只承认这个错误。有申诉勘查机构&#xff0c;还会升级查询。 不要重复发一模一样的申诉信。起码要修改一下顺序&#xff0c;或者提醒没有收到&#xff0c;我再发…

为什么基于树的模型在表格数据任务中比深度学习更优?

论文 | Why do tree-based models still outperform deep learning on tabular data? 代码 | https://github.com/LeoGrin/tabular-benchmark 虽然深度学习在计算机视觉、自然语言处理等领域取得了显著的成果&#xff0c;但在处理表格数据任务方面&#xff0c;深度学习模型的…

Logback框架基本认识

文章目录 一.什么是Logback1.1 初识Logbcak 二.Logbcak的结构三.日志的级别四.配置组件详解4.1 logger 日志记录器属性的介绍如何在配置文件里配置 4.2 appender 附加器 配合日志记录器的输出格式4.2.1 控制台附加器4.2.2 文件附加器4.3.3滚动文件附加器 4.3 Filter: 过滤器&am…

机器学习激活函数

激活函数 激活函数是人工神经网络中的一个重要组成部分。它们用于向神经网络中添加非线性因素&#xff0c;使得网络能够解决复杂问题&#xff0c;如图像识别、语言处理等。激活函数的作用是决定一个神经元是否应该被激活&#xff0c;也就是说&#xff0c;它帮助决定神经元的输…

大模型关于Lora论文集合

《Chain of LoRA:Efficient Fine-tuning of Language Models via Residual Learning》 Chain of LoRA (COLA)&#xff0c;这是一种受 Frank-Wolfe 算法启发的迭代优化框架&#xff0c;旨在弥合 LoRA 和全参数微调之间的差距&#xff0c;而不会产生额外的计算成本或内存开销。CO…

【清华社机器之心】视频生成前沿研究与应用特别活动

在视频生成即将迎来技术和应用大爆发之际&#xff0c;为了帮助企业和广大从业者掌握技术前沿&#xff0c;把握时代机遇&#xff0c;机器之心AI论坛就将国内的视频生成技术力量齐聚一堂&#xff0c;共同分享国内顶尖力量的技术突破和应用实践。 论坛将于2024.01.20在北京举办&am…

股东分红模式玩法解析!

股东分红模式股东分红模式是指公司通过向股东支付现金或股票的方式&#xff0c;将公司利润分配给股东的一种方式。不同的股东分红模式有着不同的特点和应用场景。 ​一、模式概述 一个私域电商平台&#xff0c;非常重要的一个角色是“团队长”&#xff0c;尤其是能够带动业绩和…

Win11安装与卸载Oracle 19c数据库

一、官网下载安装包 进入官网&#xff0c;选择产品-Oracle DataBase&#xff0c;点击进入下载界面 官网 二、安装 将下载的压缩包进行解压&#xff0c;解压路径随意即可 1 双击exe文件开始安装 等待出现如下页面 2 选择所示&#xff0c;点击下一步 3 选择桌面类安装 4 创…

openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题

文章目录 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题194.1 分析查询语句长时间运行的问题194.1.1 问题现象194.1.2 原因分析194.1.3 处理办法 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时…

leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

518.零钱兑换II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111 示例 2: 输入: amount 3, coi…

conda安装和配置以及处理OSError: [WinError 123]异常

conda安装和配置 由于更换电脑&#xff0c;浅浅记录下conda安装和配置。以及处理这次安装的 OSError: [WinError 123] 异常。 conda的作用 下载之前&#xff0c;先了解下为什么需要使用conda&#xff0c;它是一个开源的Anaconda是专注于数据分析的Python发行版本&#xff0c;…

RK3399平台入门到精通系列讲解(驱动篇)eventpoll结构体详解

🚀返回总目录 文章目录 一、eventpoll 结构体二 、epitem 结构体三、eppoll_entry 结构体eventpoll 结构体:eventpoll 结构体是 epoll 在内核中的核心结构epitem 结构体:epitem 结构体用于表示 epoll 实例中的事件项eppoll_entry 结构体:它的作用就是关联Socket等待队列中…

VUE3相比VUE2升级了哪些内容

目录 一、Vue 3 、Vue 2 对比及提升项 二、 Vue 3 创建app.vue示例 三、Vue3 的setup、Vue2 的 data对比 一、Vue 3 、Vue 2 对比及提升项 性能提升&#xff1a;Vue 3 做了大量的优化工作&#xff0c;提升了运行时的性能。例如&#xff0c;在模板编译时进行的静态分析和优化…

DLinear模型:Are Transformers Effective for Time Series Forecasting?

本文发表于2022年8月份 Abstract 基于Transformer的长时间序列预测模型不断涌现&#xff0c;并且性能在过去几年力不断提高&#xff0c;但Transformer是否对长时间序列问题有效&#xff1f; 具体来说&#xff0c;Transformer是提取长序列中各元素间语义关联最成功的模型&…

模型评估:A/B测试的陷阱

互联网公司中&#xff0c;A/B测试是验证新模块、新功能、新产品是否有效&#xff1b;新算法、新模型的效果是否有提升&#xff1b;新设计是否受到用户欢迎&#xff1b;新更改是否影响用户体验的主要测试方法。在机器学习领域中&#xff0c;A/B测试是验证模型最终效果的主要手段…

js逆向第16例:猿人学第12题入门级js

文章目录 一、前言二、定位关键参数三、代码实现一、前言 任务:抓取这5页的数字,计算加和并提交结果 既然是入门级,那肯定很简单了 二、定位关键参数 控制台查看请求数据,m值应该就是关键参数了 进入堆栈 马上定位到了m值"m": btoa(yuanrenxue + window.pag…

商品源数据如何采集,您知道吗?

如今&#xff0c;电子商务已经渗透到了人们生活的方方面面。2020年新冠肺炎突如其来&#xff0c;打乱了人们正常的生产生活秩序&#xff0c;给经济发展带来了极大的影响。抗击疫情过程中&#xff0c;为避免人员接触和聚集&#xff0c;以“无接触配送”为营销卖点的电子商务迅速…