写在前面——
《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.9 TIM—输入捕获(脉冲频率测量)实验,讲解TIM输入捕获的原理,以及STM32CubeMX配置和程序设计方法
官方例程下载:https://pan.baidu.com/s/1QC5BnDgY1m1me6-ihQ_OUQ?pwd=nqb1
提取码:nqb1
目录
4.9 TIM—输入捕获(脉冲频率测量)实验
4.9.1. 实验任务
- TIM普通输入捕获模式:参看官方例程HAL_11_TIM_FRQ,实现板载信号的输入捕获,测量其频率。
- TIM输入捕获PWM模式:测量脉宽/占空比。
4.9.2. TIM输入捕获的原理解析
输入捕获可以对输入信号的上升沿,下降沿或者双边沿进行捕获,可以测量输入信号的脉宽和测量 PWM 输入信号的频率和占空比。
输入捕获分为普通输入捕获模式(测频)和PWM输入模式(测频+占空比)。
输入通道与捕获通道的区别
输入通道:需要被测量的信号从定时器的外部引脚 TIMx_CH1/2/3/4 进入,通常叫 TI1/2/3/4,在后面的捕获讲解中对于要被测量的信号我们都以 TIx 为标准的叫法
捕获通道:捕获通道就是输入捕获整体结构图中的 IC1/2/3/4,每个捕获通道都有相对应的捕获寄存器 CCR1/2/3/4,当发生捕获的时候,计数器 CNT 的值就会被锁存到捕获寄存器。
输入通道是用来输入信号的,捕获通道是用来捕获输入信号的通道,一个输入通道的信号可以同时输入给两个捕获通道。
普通输入捕获模式
当捕获到信号的跳变沿的时候,把计数器 CNT 的值锁存到捕获寄存器 CCR 中,这就是普通输入捕获模式。
普通输入捕获模式,通常用于测量频率。其原理简单来说,以上升沿捕获为例,如上图:
第一次上升沿来临时,发生捕获中断,记录value1=当前计数值CNT。
当第二次上升沿来临,再次发生捕获中断,记录value3=当前计数值CNT,并清除捕获记录标记。
根据value3和value1差值,计算出输入信号的频率。
PWM输入模式
普通输入捕获模式也可以用来计算脉宽(占空比),但是配置复杂。一般使用PWM输入模式,同时计算频率和脉宽。
PWM 输入模式需要占用两个捕获通道IC1和IC2。
当使用 PWM 输入模式的时候,因为一个输入通道(TIx)会占用两个捕获通道(ICx),所以一个定时器在使用 PWM 输入的时候最多只能使用两个输入通道(TIx),如下图。
如上图,PWM 信号由输入通道 TI1 进入,信号会被分为两路,一路是 TI1FP1,另外一路是 TI2FP2。其中一路是测周期,另一路是测占空比。由此,定时器的输入捕获有两个功能,直接捕获模式和间接捕获模式;
直接捕获:只能捕获本身通道的脉冲信号;
间接模式:可以捕获此定时器每个通道的脉冲信号。
通常,测频支路设置成直接捕获模式,而测脉宽的支路设置成间接模式。
PWM 输入模式原理:
当第一次上升沿时,IC1和IC2同时捕获中断,计数器CNT清零;
到了下降沿的时候,IC2捕获中断,此时计数器CNT的值被锁存到捕获寄存器CCR2中;
到了下一个上升沿的时候,IC1捕获中断,计数器CNT的值被锁存到捕获寄存器CCR1中
CCR2测量的是脉宽,CCR1测量的是周期。
可见,输入捕获的两大核心功能:
1)捕获定时器的数值。
2)产生中断,类似于外中断,比如,上升沿产生中断。
开发板上配置了两个555作为信号发生器(U8,U7),通过可调电阻R40,R39调节信号频率,两个输出引脚分别连接在PA15和PB4引脚上,如下图。
查阅芯片资料,可以得知这两个引脚可用作以下定时器的输入捕获:PA15–> TIM2_CH1(AF1); PB4 --> TIM3_CH1(AF2)。
4.9.3. 初始化配置(STM32CubeMX)
以PA15输入信号进行TIM2_CH1输入捕获、测频为例,在STM32CubeMX中进行配置。
对PA15引脚,选择TIM2_CH1。
这里选择复位Reset模式、Tl1FP1(由定时器的输入信号触发)、内部时钟。
定时频率设置为1MHz;上升沿触发;直接捕获方式。
NVIC中,打开TIM2中断,可设置中断服务优先级,
SYS、时钟树(80MHz)、项目名称、路径等配置,参看前述章节。
LCD无需在STM32CubeMX中配置,参看前述方法,复制相关文件到本项目工程中。
4.9.4. 应用程序设计(KEIL5)
1. TIM输入捕获HAL库函数
TIM相关的HAL库函数在stm32g4xx_hal_tim.h文件中可查询到。这里,仅使用TIM作输入捕获(中断方式),主要使用的库函数有:
- //中断方式启动捕获–启动输入捕获功能,并使能相应的中断
HAL_StatusTypeDef HAL_TIM_IC_Start_IT (TIM_HandleTypeDef *htim, uint32_t Channel) - //中断方式停止捕获–关闭定时器某一通道的输入捕获功能和相应中断
HAL_StatusTypeDef HAL_TIM_IC_Stop_IT (TIM_HandleTypeDef *htim, uint32_t Channel) - //获取当前的捕获值–读取CCRx寄存器的值
uint32_t HAL_TIM_ReadCapturedValue (TIM_HandleTypeDef *htim, uint32_t Channel)
还可以使用已定义宏(也在stm32g4xx_hal_tim.h):
读取计数值:__HAL_TIM_GET_COUNTER (&htim)
重新设置计数值:__HAL_TIM_SET_COUNTER (&htim, COUNTER)
建议使用函数HAL_TIM_ReadCapturedValue捕获计数值。
- //输入捕获中断回调函数
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
2. TIM输入捕获与测频、LCD显示
根据前面4.9.3节,完成TIM输入捕获的STM32CubeMX配置。KEIL5打开工程项目后,首先把LCD初始化相关的操作完成,参看4.4 LCD显示实验,添加lcd.c、lcd.h、font.h到本项目中,并在main.c中完成初始化。
1)编写输入捕获的中断回调函数
输入捕获发生中断时,自动执行其中断回调函数HAL_TIM_IC_CaptureCallback,但是中断回调函数需要在main.c中手动编写,如:
/* USER CODE BEGIN 0 */
uint32_t Freq;//获得频率值,全局变量
uint16_t Counter;//获得计数值,全局变量
/* 输入捕获中断服务函数 上升沿中断 */
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef