1. 前言

在上篇文章中,我们详细介绍了STM32输入捕获模式的基本原理和应用方法,包括测频法和测周法。本文将重点探讨如何通过STM32的PWI(PWM Input)模式实现对PWM信号的频率和占空比测量。我们将结合具体的硬件电路,解释定时器的两个通道(如CH1和CH2)如何连接到同一引脚并实现输入捕获,同时分析数据在寄存器和内部电路中的传输过程。

2. PWI模式概述

PWI模式是专为捕获PWM信号设计的输入捕获模式。在该模式下,定时器的两个输入捕获通道(通常为CH1和CH2)协同工作,通过捕获PWM信号的两个不同特征(通常是上升沿和下降沿)来实现对信号频率占空比的测量。

  • CH1通常用于捕获PWM信号的上升沿,以此来测量信号的周期。
  • CH2则用于捕获PWM信号的下降沿,用于计算占空比。

3. 定时器内部电路与工作原理

3.1 定时器两个通道的协作

在PWM输入捕获模式中,定时器的两个输入通道(CH1 和 CH2)连接到同一个GPIO引脚(如PA6)。输入信号经过GPIO后,通过内部的**输入选择电路(TIx)**进入定时器。定时器的内部捕获逻辑会将CH1设置为检测上升沿,而CH2设置为检测下降沿。

这种模式下,两个通道共用一个引脚,通过寄存器配置使得两个通道的输入源保持同步。CH1通道负责捕获PWM周期,CH2负责捕获低电平持续时间,通过这两个时间的差值,可以计算信号的占空比。

3.2 数据传输过程

当PWM信号进入GPIO引脚时:

  1. 上升沿触发CH1捕获,定时器的CCR1寄存器保存当前计数器(CNT)值。这个值用于计算信号的周期。
  2. 下降沿触发CH2捕获,CCR2寄存器保存计数器值,用于计算信号的低电平持续时间。
  3. 通过读取CCR1和CCR2的值,软件可以计算出PWM信号的频率和占空比。

4. PWI模式的寄存器配置

PWI模式依赖于STM32的输入捕获寄存器配置。以下几个关键寄存器需要配置:

  • TIMx_CCR1: 用于存储CH1捕获到的计数器值(上升沿)。
  • TIMx_CCR2: 用于存储CH2捕获到的计数器值(下降沿)。
  • TIMx_SMCR: 用于配置定时器的触发输入和从模式。
  • TIMx_CR1: 用于启动定时器。

为了使两个通道共用同一个引脚,通常需要将TIMx_CH1设置为输入触发源,并启用从模式控制寄存器(SMCR),将定时器设置为复位模式(Reset Mode)。这样可以确保在检测到上升沿时,定时器会重新开始计数,从而确保两个捕获值的差值能够精确反映信号特性。

5. PWI模式的代码实现

以下代码展示了如何使用STM32定时器的PWI模式来捕获PWM信号,并计算信号的频率和占空比。代码基于你提供的初始化函数,并进行了标准库配置。

5.1 PWI模式初始化

void IC_Init(void)
{
    // 使能GPIOA和TIM3时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

    // 配置PA6为输入模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  // 上拉输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;      // PA6引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 配置TIM3基本参数
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructre;
    TIM_TimeBaseInitStructre.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructre.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructre.TIM_Period = 65536 - 1;      // 自动重装载值 (ARR)
    TIM_TimeBaseInitStructre.TIM_Prescaler = 72 - 1;      // 预分频值 (PSC)
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructre);

    // 配置TIM3输入捕获通道1(上升沿捕获)
    TIM_ICInitTypeDef TIM_ICInitStructure;
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;   // 上升沿捕获
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; // 直接TI输入
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;         // 输入分频
    TIM_ICInitStructure.TIM_ICFilter = 0xf;                       // 滤波
    TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);

    // 配置从模式为复位模式
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1);  // 选择TI1作为触发输入
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);  // 从模式为复位模式

    // 启动定时器
    TIM_Cmd(TIM3, ENABLE);
}

5.2 读取频率和占空比

// 获取PWM信号的频率
uint32_t IC_GetFreq(void)
{
    return 1000000 / (TIM_GetCapture1(TIM3) + 1);  // 单位为Hz
}

// 获取PWM信号的占空比
uint32_t IC_GetDuty(void)
{
    return (TIM_GetCapture2(TIM3) + 1) * 100 / (TIM_GetCapture1(TIM3) + 1);
}

6. 测频法与测周法的应用

在PWI模式下,测频法和测周法都可以应用于捕获信号特性。通过测量上升沿和下降沿的捕获值,频率和占空比计算如下:

  • 测频法:利用CH1通道捕获的上升沿之间的时间差(周期),并根据定时器的时钟频率计算信号频率。

    公式

  • 测周法:通过捕获的上升沿和下降沿之间的时间差,计算信号的周期。

    公式

然后,通过周期的倒数得到信号频率。对于占空比,公式如下:

7. 小结

通过本文的讲解,您应该对STM32的PWI模式有了较为深入的理解。我们介绍了定时器的两个通道如何协同工作,通过CH1捕获上升沿,CH2捕获下降沿,实现对PWM信号频率和占空比的测量。结合具体的电路和内部数据传输过程,PWI模式为信号的精确捕获提供了高效的解决方案。在实际应用中,您是否使用过PWI模式?该模式在处理复杂PWM信号时表现如何?欢迎在评论区分享您的经验和看法!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐