使用STM32定时器输入捕获的一些记录
(最近在学习六步换相驱动直流无刷电机,记录一下其中陌生的定时器功能)
英文标识含义
- TIx:TIM Input;
霍尔传感器接口
霍尔传感器接口大概功能逻辑:
- 将CH1~3的输入连接到异或器,输出TI1,实现同时对三个信号的边沿检测;
- TI1经过滤波、边沿检测 -> TI1F_ED信号 -> TRC;
- TRC被映射到IC1,使之触发输入捕获;
输入捕获一般都会开启从模式RESET实现硬件的计数器清零,这里在TRC映射为输入捕获信号的同时,也作为从模式RESET的触发信号。(但是二者不会相互冲突,在IC触发想要获取周期量之前,因为最先触发从模式而导致计数器清零?可能的原因是从模式有一定的延迟……)
PWM输入模式
程序需要对主控MCU(外部MCU)输入的PWM作周期、占空比等数据的解析,此时可配置输入捕获为PWM输入模式,比如将IC1、IC2映射到一个TI输入信号,使PWM信号通过一个输入给到两个通道:
选择TIMx CCR1的有效输入:置TIMx CCMR1寄存器的CC1S=01(选择TI1)
选择TIMx_CCR2的有效输入:置TIMx_CCMR1寄存器的CC2S=10(选择T1)
对应到代码,即对通过对两个通道分别配置TIM_ICSelection_DirectTI
和TIM_ICSelection_IndirectTI
:
/** @defgroup TIM_Input_Capture_Selection TIM Input Capture Selection
* @{
*/
#define TIM_ICSELECTION_DIRECTTI TIM_CCMR1_CC1S_0 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC1, IC2, IC3 or IC4, respectively */
#define TIM_ICSELECTION_INDIRECTTI TIM_CCMR1_CC1S_1 /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to IC2, IC1, IC4 or IC3, respectively */
#define TIM_ICSELECTION_TRC TIM_CCMR1_CC1S /*!< TIM Input 1, 2, 3 or 4 is selected to be connected to TRC */
/**
* @}
*/
配置后的效果是:
但是这样的输入路线,通道2无法进行边沿检测,如何实现两个信号极性相反?手册里面有说要“选择TI1FP2的有效极性(捕获数据到TIMx_CCR2):置CC2P=1(下降沿有效)”。但是结合结构框图,置CC2P=1(下降沿有效)配置的是TI2的边沿检测器。(可以实际测试以下不配置CC2P还能否实现PWM输入模式效果)
在野火的HAL库文档看到这样的描述:
作为触发输入的那一路信号还需要设置极性,是上升沿还是下降沿捕获,一旦设置好触发输入的极性,另外一路硬件就会自动配置为相反的极性捕获,无需软件配置。