STM32定时器捕获单脉冲测量原理与实现
1. 定时器捕获单输入脉冲的核心原理在嵌入式系统开发中定时器捕获功能是测量外部信号时间特性的重要手段。以STM32系列单片机为例其通用定时器的输入捕获功能可以精确测量单个脉冲的宽度或频率。这个功能本质上是通过记录特定边沿触发时刻的计数器值来实现的。当配置为输入捕获模式时定时器会持续运行其计数器TIMx_CNT。当检测到指定边沿上升沿或下降沿时当前计数器的值会被自动锁存到捕获/比较寄存器(CCRx)中同时可能产生中断或DMA请求。通过比较两次不同边沿触发时捕获的计数器值就能计算出脉冲的宽度。关键细节大多数定时器支持边沿极性选择可以配置为上升沿、下降沿或双边沿触发。对于单脉冲测量通常需要先后捕获上升沿和下降沿的时刻。2. 硬件电路与信号连接方案2.1 输入信号调理电路设计实际工程中待测脉冲信号可能需要经过调理才能接入MCU对于5V TTL信号需通过分压电阻降至3.3V对高频噪声敏感的应用应加入RC低通滤波如100Ω100pF对于长线传输建议使用施密特触发器整形如74HC14典型连接方式脉冲源 → 分压/滤波 → 定时器TIx引脚 ↑ 可选施密特触发器2.2 定时器通道配置要点以STM32F103为例配置TIM2_CH1为输入捕获的步骤使能TIM2时钟RCC_APB1PeriphClockCmd()配置GPIO为浮空输入GPIO_InitStruct.GPIO_Mode GPIO_Mode_IN_FLOATING时基初始化设置预分频器(PSC)和自动重载值(ARR)输入捕获配置IC1Filter设置输入滤波通常4-8个时钟周期ICPolarity边沿极性选择ICSelection选择直接输入(ICx)或间接输入(TRC)ICPrescaler捕获分频通常不分频3. 单脉冲测量的软件实现流程3.1 基本测量算法测量正脉冲宽度的典型流程// 变量定义 uint32_t riseValue, fallValue, pulseWidth; // 初始配置为上升沿捕获 TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; TIM_ICInit(TIM2, TIM_ICInitStructure); // 上升沿中断服务程序 void TIM2_IRQHandler() { if(TIM_GetITStatus(TIM2, TIM_IT_CC1)) { riseValue TIM_GetCapture1(TIM2); // 切换为下降沿捕获 TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Falling); TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } } // 下降沿中断服务程序 void TIM2_IRQHandler() { if(TIM_GetITStatus(TIM2, TIM_IT_CC1)) { fallValue TIM_GetCapture1(TIM2); // 计算脉冲宽度考虑计数器溢出 if(fallValue riseValue) { pulseWidth fallValue - riseValue; } else { pulseWidth (ARR_MAX - riseValue) fallValue; } // 恢复为上升沿捕获 TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising); TIM_ClearITPendingBit(TIM2, TIM_IT_CC1); } }3.2 误差处理与优化技巧计数器溢出处理启用定时器更新中断维护溢出计数器变量最终宽度 (溢出次数 × ARR) (fallValue - riseValue)提高测量精度选择更高的定时器时钟如使用APB总线倍频减小预分频系数(PSC)对于STM32F4/F7/H7可使用定时器链接模式抗干扰措施合理设置输入滤波器(ICxFilter)软件去抖连续多次采样确认启用噪声抑制模式部分型号支持4. 典型应用场景与实例分析4.1 旋转编码器脉冲测量光电编码器常见参数线数500-5000线/转输出频率通常100kHz信号类型A/B相正交脉冲配置方案使用两个定时器通道分别捕获A/B相启用正交编码器接口模式测量转速公式转速(RPM) (脉冲数 × 60) / (编码器线数 × 采样时间)4.2 超声波测距应用HC-SR04模块时序特性触发脉冲10μs的高电平回波脉冲150μs-25ms距离换算距离(mm) 回波宽度(μs) / 5.8实现要点触发引脚用普通GPIO控制回波引脚连接定时器输入捕获测量流程发送10μs触发脉冲等待回波上升沿开始计时检测回波下降沿停止计时计算时间差并转换为距离4.3 红外遥控信号解码NEC协议典型特征载波频率38kHz逻辑0560μs低560μs高逻辑1560μs低1680μs高帧间隔9ms解码实现策略配置定时器输入捕获为双边沿触发记录每个边沿的时间戳通过脉冲宽度判断逻辑值校验地址码和命令码5. 进阶技巧与性能优化5.1 使用DMA减轻CPU负载对于高频脉冲测量如100kHz可采用DMA传输捕获值配置定时器捕获事件触发DMA设置循环缓冲存储捕获值定期处理缓冲数据STM32配置示例DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)TIM2-CCR1; DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)captureBuffer; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize BUF_SIZE; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode DMA_Mode_Circular; DMA_Init(DMA1_Channel5, DMA_InitStructure); TIM_DMACmd(TIM2, TIM_DMA_CC1, ENABLE);5.2 多定时器级联方案对于超宽范围测量如ns级到秒级可采用主从定时器配置主定时器高频时钟如72MHz测量短时间从定时器低频时钟如10kHz记录长时间段通过定时器同步信号触发配置步骤配置主定时器为内部时钟模式配置从定时器为外部时钟模式1设置TRGO触发输出启用从定时器的从模式5.3 基于HRTIM的高精度测量STM32G4/F3系列的高分辨率定时器(HRTIM)提供ps级分辨率主计数器频率可达4.6GHz217ps支持波形自动拼接内置死区时间控制典型配置HRTIM_TimeBaseInitTypeDef TimeBaseInit; TimeBaseInit.Period 0xFFFF; TimeBaseInit.RepetitionCounter 0; TimeBaseInit.PrescalerRatio HRTIM_PRESCALER_RATIO_DIV1; TimeBaseInit.Mode HRTIM_MODE_CONTINUOUS; HRTIM_TimeBaseInit(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, TimeBaseInit); HRTIM_ICInitTypeDef ICInit; ICInit.ICPolarity HRTIM_ICPOLARITY_RISING; ICInit.ICInput HRTIM_ICINPUT_TI1; ICInit.ICPrescaler HRTIM_ICPSC_DIV1; ICInit.ICFilter 0; HRTIM_ICInit(HRTIM1, HRTIM_TIMERINDEX_TIMER_A, HRTIM_ACTIVE_CHANNEL_1, ICInit);6. 常见问题排查指南6.1 捕获不到信号的问题排查检查信号路径用示波器确认信号是否到达MCU引脚检查GPIO配置是否正确输入模式、复用功能验证定时器配置确认定时器时钟已使能检查时基单元配置PSC/ARR验证捕获通道映射关系中断/DMA配置检查NVIC中断是否启用中断优先级是否被屏蔽DMA通道配置是否正确6.2 测量值不稳定的处理方法硬件层面增加RC滤波典型值100Ω100nF缩短信号走线长度添加适当的阻抗匹配软件层面增大输入滤波器值(ICxFilter)实现软件滑动平均滤波启用定时器的噪声抑制模式系统层面检查电源纹波建议50mVpp确保时钟源稳定使用晶体而非HSI避免高频中断干扰6.3 特殊案例短脉冲捕获技巧对于宽度小于2个时钟周期的脉冲使用定时器的脉冲宽度累积模式部分型号支持配置为门控模式用外部信号控制计数采用高频时钟的定时器如HRTIM硬件方案先用高速比较器展宽脉冲实现示例门控模式TIM_SlaveConfigTypeDef sSlaveConfig; sSlaveConfig.SlaveMode TIM_SLAVEMODE_GATED; sSlaveConfig.InputTrigger TIM_TS_TI1FP1; sSlaveConfig.TriggerPolarity TIM_TRIGGERPOLARITY_RISING; sSlaveConfig.TriggerFilter 0; HAL_TIM_SlaveConfigSynchro(htim2, sSlaveConfig);我在实际项目中发现对于低频但要求高精度的时间测量如超声波测距采用定时器捕获结合温度传感器校准的方案效果显著。具体做法是定期读取内部温度传感器值根据芯片温度-时钟漂移特性曲线进行补偿动态调整时间计算参数 这种方案在-40°C到85°C范围内可将测量误差控制在0.5%以内。