[蓝桥杯嵌入式有手就行]11_TIM(下)

文章目录

[蓝桥杯嵌入式有手就行]系列文章

前言

一、内部结构

1、框图

二、定时器输入捕获原理分析

1、原理图

2、定时器同步

3、普通输入捕获模式

4、PWM输入模式(最常用)

三、代码示例

1、cubemx配置

2、上代码

四、问题

1、PSC和ARR取值问题

2、能否提供定时器例程

总结

前言

注:本系列基于2023年蓝桥杯实战情况就行编写,所有软件均采用2023年赛点资源包

上一节我们已经讨论了定时器输出部分,那么本节讨论相对麻烦的输入捕获。这里我还是建议直接读取寄存器 ,代码相对简洁明了。

定时器输出和输入的例程已经上传,看不见的话等待几天(23.11.4上传的,需要时间审核)。


一、内部结构

1、框图

在这里插入图片描述

这节我们只看中间左侧的粉色部分,即输入捕获部分。

这里需要注意一下三点


同一时刻,某个引脚只能作为输入/输出

一个引脚是输入/输出,该定时器所有的引脚都是输入/输出

如果CCxIE=1,使能中断位,产生中断,CCxIF(捕获中断标志)=1,计数值CNT将被锁存到CCRx中

二、定时器输入捕获原理分析

1、原理图

在这里插入图片描述


2、定时器同步

有些时候,我们可能需要定时启动定时器,比如每隔1分钟检测一次输入频率。这个时候我们救需要将一个定时器A作为主模式控制器,另一个作为从模式控制器B。

在这里插入图片描述


步骤如下:


使用A定时器作为B定时器的预分频器

使用A定时器使能B定时器的触发信号

使用A定时器去启动B定时器更新事件

使用一个外部触发器触发同步地启动2个定时器

3、普通输入捕获模式

详细过程可以查看参考手册28.3.9章节

在这里插入图片描述

核心功能:


捕获定时器的数值

产生中断

4、PWM输入模式(最常用)

以参考手册28.3.10章节内容为准,本文在其基础上有所简化。

首先,我们需要明确几个概念


一个通道的PWM输入捕获需要同时使用一个定时器的2个通道(1和2或者是3和4),但是只占用一个引脚。比如PA1输入PWM波,从引脚上看只占用了PA1引脚,但是对于定时器来说,TIM2_CH1和TIM_CH2都被占用了。

输入引脚通往的定时器通道的CCR寄存器保存周期值(两个连续上升沿之间的间隔),另一个没有占用引脚的定时器通道的CCR寄存器保存脉冲宽度 (两个连续上升沿和下降沿之间的间隔)。也就是Figure 300图中的IC1和IC2。

两个通道检测的极性是相反的(如Figure 300图所示)

从引脚输入信号的通道应该作为触发源(以PA1通过TIM2_CH2捕获为例,触发源应该设置为TI2FP2),并且将定时器的从模式设置为复位模式。

在这里插入图片描述

在这里插入图片描述


捕获过程:


当PWM信号由TI1进入,配置TI1FP1作为触发信号,上升沿捕获

当上升沿的时候,IC1和IC2同时捕获,计数器CNT清零

到达下降沿的时候,IC2捕获,此时CNT的值存入CCR2

到下一个上升沿的时候,IC1捕获,此时CNT的值存入CCR1

占空比=CCR2/CCR1


三、代码示例

1、cubemx配置


在这里插入图片描述

在这里插入图片描述


2、上代码

HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if (htim->Instance == TIM2)
  {
    f = 10000 / TIM2->CCR2;
    duty = 100 * TIM1->CCR1 / TIM2->CCR2;
  }
  
  HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
}



四、问题

1、PSC和ARR取值问题

一般题目输入信号都是通过PA1,也就默认了使用TIM2_CH2。虽然定时器2的ARR是一个32位的,但是CCR是16位的,在100M主频下,ARR溢出需要42s,但是CCR在655us后就会溢出,因此PSC和ARR的取值需要考虑应用场景。


2、能否提供定时器例程

23.11.4晚上传,点这里跳转。可能需要2天左右审核。


总结

定时器内容是最多的,最好结合上面截取的手册内的示意图进行理解。



请使用浏览器的分享功能分享到微信等