1. STM32输入捕获实验深度解析
作为一名嵌入式开发工程师,我经常需要测量各种数字信号的脉宽和频率。STM32的输入捕获功能正是解决这类问题的利器。今天我就来分享一个基于TIM2定时器的完整输入捕获实现方案,这个方案已经在我多个实际项目中验证过稳定性。
输入捕获本质上是通过记录信号边沿触发时刻的定时器计数值,来计算信号特征。相比外部中断+定时器的方案,硬件输入捕获具有更高的精度和更低的CPU开销。特别是在测量高频信号时,硬件捕获的优势更加明显。
2. 硬件设计与配置要点
2.1 定时器时钟树分析
在STM32F1系列中,TIM2挂载在APB1总线上。通过时钟树配置,我们可以让TIM2获得72MHz的时钟源。这里有个关键点:APB1预分频器如果设置为非1的值(如2/4/8/16),定时器时钟会自动倍频x2。
例如:
- APB1时钟=36MHz
- APB1预分频=2
- 实际TIM2时钟=36MHz×2=72MHz
这种设计保证了即使APB1总线降频,定时器仍能获得较高时钟频率。在我们的实验中,直接配置APB1不分频,获得72MHz时钟源。
2.2 GPIO配置细节
PA0作为TIM2_CH1的输入引脚,需要特别注意:
- 配置为浮空输入模式(GPIO_MODE_INPUT)
- 不使用上拉/下拉电阻(根据信号特性选择)
- 确保GPIO时钟已使能(__HAL_RCC_GPIOA_CLK_ENABLE)
提示:如果信号源阻抗较高,建议启用内部上拉电阻,避免悬空状态导致误触发。
3. 定时器参数计算
3.1 计数频率与测量范围
我们选择PSC=71(72-1),得到:
- 计数频率 = 72MHz / (71+1) = 1MHz
- 计数周期 = 1/1MHz = 1μs
ARR设置为65535(16位定时器最大值),这样:
- 单次最大测量时间 = 65535 × 1μs ≈ 65.5ms
- 配合溢出计数,理论上可测量任意长度脉宽
3.2 测量精度与误差分析
理论最小分辨率为1μs,实际误差来源包括:
- 中断响应延迟(约0.5-2μs)
- 信号边沿抖动(可通过滤波器改善)
- 时钟源精度(晶振误差通常±50ppm)
在1MHz计数频率下,典型测量误差在±2μs以内
