STM32-PWM输入捕获的配置

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


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 解析

c 复制代码
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输入捕获配置,包括触发通道、触发极性、捕获通道映射的输入通道等
  • 中断配置,配置定时器中断优先级
c 复制代码
// 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的定时更新中断
}
相关推荐
阿华hhh11 分钟前
day4(IMX6ULL)<定时器>
c语言·开发语言·单片机·嵌入式硬件
钰珠AIOT13 分钟前
在电源的滤波电路中10uf 和100nF 的电容滤波的频率大概是多少?如何计算?
单片机·物联网
羽获飞40 分钟前
51单片机UART-串口通讯的配置方法
stm32·单片机·嵌入式硬件
猫猫的小茶馆42 分钟前
【Linux 驱动开发】一. 搭建开发环境
linux·汇编·arm开发·驱动开发·stm32·嵌入式硬件·mcu
猫猫的小茶馆1 小时前
【Linux 驱动开发】嵌入式 Linux 开发概念
linux·服务器·arm开发·stm32·单片机·嵌入式硬件·mcu
EVERSPIN1 小时前
单片机CH554电容触摸屏控制器方案
单片机·嵌入式硬件·单片机ch554
兆龙电子单片机设计1 小时前
【STM32项目开源】STM32单片机智能宠物喂养系统
stm32·单片机·开源·毕业设计·电子信息
Y1rong1 小时前
STM32之串口(三)
stm32·单片机·嵌入式硬件
Y1rong1 小时前
STM32之串口(二)
stm32·单片机·嵌入式硬件
夜月yeyue1 小时前
VFS (虚拟文件系统) 核心架构
linux·c++·单片机·嵌入式硬件·架构