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引脚时:
- 上升沿触发CH1捕获,定时器的CCR1寄存器保存当前计数器(CNT)值。这个值用于计算信号的周期。
- 下降沿触发CH2捕获,CCR2寄存器保存计数器值,用于计算信号的低电平持续时间。
- 通过读取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信号时表现如何?欢迎在评论区分享您的经验和看法!