STM32通用定时器TIM2~5实战:输入捕获测量PWM频率与占空比(附代码)

张开发
2026/5/10 21:27:06 15 分钟阅读
STM32通用定时器TIM2~5实战:输入捕获测量PWM频率与占空比(附代码)
STM32通用定时器TIM2~5实战输入捕获测量PWM频率与占空比附代码在嵌入式系统开发中精确测量外部PWM信号的频率和占空比是常见需求。无论是电机控制、LED调光还是传感器信号处理都需要对PWM参数进行准确捕获。STM32的通用定时器TIM2~TIM5提供了强大的输入捕获功能配合PWM输入模式(PWM Input Mode)仅需少量代码即可实现高精度测量。1. 硬件架构与测量原理STM32的通用定时器TIM2~TIM5每个都包含4个独立的输入捕获通道采用三级流水线架构实现信号处理信号调理层包含可编程数字滤波器和边沿检测器通道映射层支持输入通道与捕获通道的灵活交叉配置捕获逻辑层具有自动重装载和主从触发控制测量PWM参数时关键要理解双沿捕获机制频率测量需要捕获两个相同极性边沿(如连续上升沿)的时间间隔占空比测量需要捕获相反极性边沿(如上升沿和后续下降沿)的时间间隔// 典型PWM信号参数关系 周期T 上升沿n到上升沿n1的时间 占空比 高电平时间 / 周期T * 100%定时器工作在72MHz时理论最小可检测脉宽约13.89ns1/72MHz实际精度受滤波器配置影响。2. PWM输入模式配置详解PWM输入模式是STM32提供的高级测量功能其核心在于单输入双捕获架构特性常规输入捕获模式PWM输入模式所需通道数2个1个测量方式软件协调硬件自动触发逻辑独立配置主从联动适用场景简单信号精确PWM配置步骤可分为硬件层和软件层2.1 硬件电路设计要点信号接入PWM信号应接入TIMx_CH1或TIMx_CH2引脚滤波电路高频干扰环境下建议增加RC硬件滤波如100Ω100pF电平匹配确保输入信号电压在GPIO容忍范围内注意TIM2的CH1/CH2对应PA0/PA1TIM3对应PA6/PA7不同型号引脚可能不同需查阅具体芯片数据手册。2.2 软件配置流程时钟使能RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO初始化GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; // TIM3_CH1 GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure);时基配置TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler 72-1; // 1MHz计数频率 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);输入捕获配置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; TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter 0x0; TIM_ICInit(TIM3, TIM_ICInitStructure);3. 双通道捕获实战代码以下完整代码展示了如何利用TIM3测量PWM频率和占空比#include stm32f10x.h volatile uint32_t IC3ReadValue1 0, IC3ReadValue2 0; volatile uint32_t DutyCycle 0, Frequency 0; void TIM3_Config(void) { TIM_ICInitTypeDef TIM_ICInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* 时钟使能 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* GPIO配置 */ GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); /* 时基配置 */ TIM_TimeBaseStructure.TIM_Period 0xFFFF; TIM_TimeBaseStructure.TIM_Prescaler 72-1; // 1MHz TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); /* 输入捕获配置 - 通道1 */ TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter 0x0; TIM_ICInit(TIM3, TIM_ICInitStructure); /* 输入捕获配置 - 通道2 */ TIM_ICInitStructure.TIM_Channel TIM_Channel_2; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_IndirectTI; TIM_ICInit(TIM3, TIM_ICInitStructure); /* PWM输入模式特定配置 */ TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset); TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); /* 中断配置 */ NVIC_InitStructure.NVIC_IRQChannel TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority 1; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); TIM_ITConfig(TIM3, TIM_IT_CC1 | TIM_IT_CC2, ENABLE); TIM_Cmd(TIM3, ENABLE); } void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_CC1) ! RESET) { IC3ReadValue1 TIM_GetCapture1(TIM3); TIM_ClearITPendingBit(TIM3, TIM_IT_CC1); } if (TIM_GetITStatus(TIM3, TIM_IT_CC2) ! RESET) { IC3ReadValue2 TIM_GetCapture2(TIM3); DutyCycle (IC3ReadValue2 * 100) / IC3ReadValue1; Frequency 1000000 / IC3ReadValue1; // 单位Hz TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); } } int main(void) { TIM3_Config(); while(1) { // 测量结果存储在全局变量中 // DutyCycle - 占空比(百分比) // Frequency - 频率(Hz) } }4. 性能优化与误差处理实际应用中需要考虑以下关键因素来提升测量精度4.1 数字滤波器配置TIMx_CCMRx寄存器中的ICxF位控制滤波参数ICxF值采样频率采样次数适用场景0000无滤波1清洁环境0010fDTS/44轻度干扰0101fDTS/168工业环境1011fDTS/326强干扰// 设置通道1滤波器为8次采样 TIM3-CCMR1 | (0x05 4);4.2 测量范围与精度平衡通过调整预分频器实现不同量程预分频值计时频率最小分辨率最大周期072MHz13.89ns0.9ms711MHz1μs65.5ms719100kHz10μs655ms4.3 常见问题排查无中断触发检查GPIO模式应为浮空输入或上拉输入验证TIMx_CCER寄存器CCxE位是否使能确认NVIC中断控制器配置正确测量值不稳定增加数字滤波器设置检查电源稳定性缩短信号走线长度占空比计算异常确保两个通道极性配置相反检查通道映射关系直接/间接TI验证主从模式是否使能提示使用示波器对比实际信号与测量结果可以快速定位硬件或软件问题。

更多文章