[蓝桥杯嵌入式有手就行]系列文章
第一章 开发环境的配置
第二章 从点灯开始
第三章 学会看手册
第四章 GPIO(上)
第五章 GPIO(下)
第六章 LCD
第七章 串口
第八章 I2C
第九章 ADC
第十章 TIM(上)
第十一章 TIM(下)
第十二章 RTC
第十三章 14届模拟题1
第十四章 14届模拟题2
第十五章 14届真题解析
未完待续…
文章目录
前言
注:本系列基于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天左右审核。
总结
定时器内容是最多的,最好结合上面截取的手册内的示意图进行理解。