STM32-PWM输入捕获的配置

发布于:2025-07-27 ⋅ 阅读:(14) ⋅ 点赞:(0)

本文以STM32F4为例介绍PWM输入捕获的概念、配置方法与配置实例。



基本概念

支持PWM输入捕获模式的定时器

定时器可分为基本定时器、通用定时器和高级定时器三种,三种定时器的资源不同,支持的功能不同,具体可查看STM32中文参考手册查询。

STM32F4系列有2个高级定时器、10个通用定时器和2个基本定时器:
高级定时器:TIM1、TIM8
通用定时器:TIM2、TIM3、TIM4、TIM5、TIM9、TIM10、TIM11、TIM12、TIM13、TIM14
基本定时器:TIM6、TIM7

不是所有定时器都支持配置为PWM输入捕获,也不是支持PWM输入捕获模式的定时器的所有通道都可以配置,具体需查看STM32参考手册的定时器框图。这里以STM32F4为例介绍如何查看哪些定时器的哪些通道支持PWM输入捕获模式。

定时器框图中,有捕捉/比较寄存器的通道,才支持输入捕获模式。注意,支持输入捕获模式不一定支持PWM输入捕获模式,PWM输入捕获模式还需要满足可配置从模式的条件。

因此,基本定时器不支持输入捕获模式,肯定也不支持PWM输入捕获模式,因为基本定时器没有捕获通道,没有捕捉/比较寄存器。
在这里插入图片描述
通用定时器均有捕获通道,因此均支持输入捕获模式,但因为PWM输入捕获模式需要占用两个捕获通道CH1和CH2,所以TIM2、TIM3、TIM4、TIM5、TIM9、TIM12支持PWM输入捕获模式。而只有1个的捕获通道TIM10、TIM11、TIM13、TIM14,不支持PWM输入捕获模式,只支持普通输入捕获。

TIM2~TIM5框图:
在这里插入图片描述
TIM9和TIM12框图:
在这里插入图片描述

TIM10/11/13/14框图:
在这里插入图片描述
高级定时器TIM1、TIM8均可配置为PWM输入捕获模式。
在这里插入图片描述
注意:PWM 输入模式只能与 TIMx_CH1/TIMx_CH2 信号配合使用,即TIMx的通道1、2,因为只有 TI1FP1 和 TI2FP2 与从模式控制器相连。(看高级定时器和支持PWM输入捕获的通用定时器的框图可知)

比如,TIM4_Channel1与TIM4_Channel2可以配置为PWM输入模式,但TIM4_Channel3和TIM_Channel4只能配置为普通输入捕获模式,不能配置为PWM输入模式。配置为PWM输入模式时,捕获/比较通道CC1和CC2同时被占用,且极性相反。

输入捕获

参考链接:定时器的输入捕获模式

输入捕获的过程:测量信号TIx(如TI1)输入定时器引脚TIMx_Channelx(如TIM3_Channel1)经过滤波器滤波生成TIxF(如TI1F),再经过带极性选择功能的边沿检测器生成信号TIxFPx(如TI1FP1),用于捕获命令。该信号进行预分频,得到ICxPS(如IC1PS),再进入捕获寄存器。输入捕获 1 预分频器 IC1PSC[1:0] 设置每来几次事件执行一次捕获。

简单理解就是,检测定时器输入TIx的边沿信号,在边沿信号发生跳变(上升沿/下降沿)的时候,将当前定时器计数器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
在这里插入图片描述
在这里插入图片描述
捕获/比较预装载寄存器:CCRx寄存器。通道1、通道 2、通道 3、通道 4 就分别对应 CCR1、CCR2、CCR3、CCR4。
我们从 TIMx_CCR1 就可以读出通道 1 捕获事件发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度(注意,对于高电平脉宽太长的情况,还要计算定时器溢出的次数)。

PWM输入捕获

PWM输入捕获模式是输入捕获模式的一个特例,输入捕获只需要1个捕获通道,PWM输入捕获需要2个捕获通道,两个捕获通道CC1和CC2同步采集一个信号,可以实现更精确的,对高频信号的采集,适合计算高频信号的占空比、频率、脉宽。二者配置方式不同,初始化的库函数也不同。

输入捕获与PWM输入捕获的区别在于:

  • 两个ICx信号被映射至同一个TIx输入。如IC1与IC2被映射于TI1。
  • 两个ICx信号在边沿处有效,且极性相反。如IC1上升沿有效,则IC2下降沿有效。
  • 选择两个TIxFPx信号之一作为触发输入,并将从模式控制器配置为复位模式。如选择TI1FP1信号作为触发输入。

TI1FP1‌和‌TI1FP2‌是同一输入通道(TI1)经过滤波和边沿检测后产生的两个信号,分别映射到不同的捕获通道。(从定时器框图也可以看出)
参考链接:关于STM32定时器中TI1FP1 与TI1FP2及相关话题

TI1FP1‌:来自通道TI1,经过滤波器后连接到捕捉比较通道IC1。
‌TI1FP2‌:来自同一通道TI1,经过滤波器后连接到捕捉比较通道IC2。
二者都是来自同一TI1输入通道,经过输入滤波和边沿检测器后所产生的具有相同特征的信号,然后映射到不同的输入捕捉通道,本质上还是同一路信号。在不做过滤和反相处理的前提下,TI1=TI1FP1=TI1FP2。

在PWM输入捕获模式下,TI1FP1与TI1FP2会配置为反向的。一个上升沿触发,一个下降沿触发,便于获取两个触发时刻的CCR寄存器插值,计算脉宽信息。

例如,可通过以下步骤对应用于 TI1 的 PWM 的周期(位于 TIMx_CCR1 寄存器中)和占空比(位于 TIMx_CCR2 寄存器中)进行测量(取决于 CK_INT 频率和预分频器的值):
● 选择 TIMx_CCR1 的有效输入:向 TIMx_CCMR1 寄存器中的 CC1S 位写入 01(选择 TI1)。
● 选择 TI1FP1 的有效极性(用于在 TIMx_CCR1 中捕获和计数器清零):向 CC1P 位和CC1NP 位写入“0”(上升沿有效)。
● 选择 TIMx_CCR2 的有效输入:向 TIMx_CCMR1 寄存器中的 CC2S 写入 10(选择 TI1)。
● 选择 TI1FP2 的有效极性(用于在 TIMx_CCR2 中捕获):向 CC2P 位和 CC2NP 位写入“1”(下降沿有效)。
● 选择有效触发输入:向 TIMx_SMCR 寄存器中的 TS 位写入 101(选择 TI1FP1)。
● 将从模式控制器配置为复位模式:向 TIMx_SMCR 寄存器中的 SMS 位写入 100。
● 使能捕获:向 TIMx_CCER 寄存器中的 CC1E 位和 CC2E 位写入“1”。

在这里插入图片描述


配置PWM输入模式

配置输入捕获模块和配置PWM输入捕获模式的结构体都是 TIM_ICInitTypeDef 。配置输入捕获时,使用库函数TIM_ICInit();配置PWM输入捕获模式时,使用库函数TIM_PWMIConfig()。

输入捕获结构体 TIM_ICInitTypeDef 解析

typedef struct
{
  uint16_t TIM_Channel;      /*!< Specifies the TIM channel.
                                  This parameter can be a value of @ref TIM_Channel */
  uint16_t TIM_ICPolarity;   /*!< Specifies the active edge of the input signal.
                                  This parameter can be a value of @ref TIM_Input_Capture_Polarity */
  uint16_t TIM_ICSelection;  /*!< Specifies the input.
                                  This parameter can be a value of @ref TIM_Input_Capture_Selection */
  uint16_t TIM_ICPrescaler;  /*!< Specifies the Input Capture Prescaler.
                                  This parameter can be a value of @ref TIM_Input_Capture_Prescaler */
  uint16_t TIM_ICFilter;     /*!< Specifies the input capture filter.
                                  This parameter can be a number between 0x0 and 0xF */
} TIM_ICInitTypeDef;
  • TIM_Channel:选择捕获ICx通道,用于设定 捕获/比较模式寄存器CCMRx 的 CCxS 位的值。
  • TIM_ICPolarity:输入捕获边沿触发选择,上升沿/下降沿/边沿跳变触发,用于设定 CCER 寄存器 CCxP 位和 CCxNP 位的值。
  • TIM_ICSelection:输入通道选择,捕获通道 ICx 的信号可来自三个输入通道,TIM_ICSelection_DirectTI、TIM_ICSelection_IndirectTI 或 TIM_ICSelection_TRC,用于设定 CCRMx 寄存器的 CCxS[1:0]位的值。
    下图圈出的为IC1的三种输入通道选择。
    在这里插入图片描述
  • TIM_ICPrescaler:输入捕获通道预分频器,可设置 1、2、4、8 分频,用于设定 CCMRx寄存器的 ICxPSC[1:0]位的值。也即捕获多少个有效边沿时触发。
  • TIM_ICFilter:输入捕获滤波器设置,可选设置 0x0 至 0x0F。用于设定 CCMRx 寄存器ICxF[3:0]位的值。一般我们不使用滤波器,即设置为 0。

实例:通用定时器TIM4_Channel2配置PWM输入捕获

以复用STM32F4(LQFP144封装)的PB7为通用定时器TIM4的通道2,并配置为PWM输入捕获为例说明:

  • GPIO配置,与TIM复用需同时使能GPIO时钟和定时器时钟
  • 定时器基本配置,需配置周期、分频、计数方向等
  • 定时器PWM输入捕获配置,包括触发通道、触发极性、捕获通道映射的输入通道等
  • 中断配置,配置定时器中断优先级
// stm32f407
void PWMInCapture_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_ICInitTypeDef  TIM_ICInitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	RCC_ClocksTypeDef RCC_ClocksStatus;

    /* TIM4 clock enable */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);

    /* GPIOB clock enable */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB , ENABLE);

    /* TIM4 chennel 2 configuration : PB.7 */
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF; // 复用定时器TIM4_Channel2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP ;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    /* Connect TIM pin to AF_TIM4 */
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_TIM4);
	
	RCC_GetClocksFreq(&RCC_ClocksStatus);
    
    /* Time base configuration */
    TIM_TimeBaseStructure.TIM_Period = 0XFFFFFFFF;
    TIM_TimeBaseStructure.TIM_Prescaler = 83;
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; // 配置TIM4的通道1,也就是TIM4通道2的相反极性,在TIM_PWMIConfig中,会自动将TI2配置为TI1的相反极性
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_IndirectTI;
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    TIM_ICInitStructure.TIM_ICFilter = 0;

    TIM_PWMIConfig(TIM4, &TIM_ICInitStructure);

    /* Select the TIM4 Input Trigger: TI2FP2 */
    TIM_SelectInputTrigger(TIM4, TIM_TS_TI2FP2); // 选择TI2FP2作为触发通道。TIM通道2只有TI2FP2连接从模式控制器

    /* Select the slave Mode: Reset Mode */
    TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Reset);
    TIM_SelectMasterSlaveMode(TIM4,TIM_MasterSlaveMode_Enable);

    /* TIM enable counter */
    TIM_Cmd(TIM4, ENABLE);

    /* Enable the TIM4 global Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    /* Enable the CC1 Interrupt Request */
    TIM_ITConfig(TIM4, TIM_IT_CC1, ENABLE); // 使能TIM4的捕获通道1
	/* Enable the CC1 Interrupt Request */
    TIM_ITConfig(TIM4, TIM_IT_CC2, ENABLE); // 使能TIM4的捕获通道2
	/* Enable the Update Request */
    TIM_ITConfig(TIM4, TIM_IT_Update, ENABLE); // 使能TIM4的定时更新中断
}

网站公告

今日签到

点亮在社区的每一天
去签到