1. 基本概念
输入捕获是嵌入式系统中定时器的重要功能,用于精确记录外部信号边沿(上升沿或下降沿)发生的时刻。通过捕获两次边沿事件的时间差,可测量脉冲宽度、周期、频率等参数。
2. 工作原理
  • 定时器核心
定时器以固定频率(由时钟源和预分频器决定)递增/递减计数。
  • 捕获触发
当检测到指定边沿(如上升沿)时,当前计数值自动存入捕获寄存器(CCR),并可触发中断。
  • 数据处理
通过两次捕获值的差值计算时间间隔,结合定时器时钟频率得出实际时间。
3. 典型应用场景
  • 脉冲宽度测量
捕获信号上升沿和下降沿的时刻,差值即为脉宽。
  • 频率测量
捕获相邻两个上升沿的时间差,倒数即为频率。
  • 编码器信号处理
测量旋转编码器的脉冲间隔,计算转速或位置。
  • 超声波测距
记录超声波发射与回波的时间差,计算距离。
4. 关键配置步骤
以STM32为例,配置输入捕获的流程如下:
步骤1:初始化定时器
  • 时钟源选择
内部时钟(如APB总线时钟)或外部时钟。
  • 预分频器(PSC)
调整定时器时钟频率,控制计数速度和分辨率。
  • 自动重装载值(ARR)
定义计数器溢出周期,影响最大可测量时间。
示例代码(HAL库):
TIM_HandleTypeDef htim;
htim.Instance = TIM2;                  // 选择定时器2
htim.Init.Prescaler = 71;             // 预分频72(72MHz → 1MHz)
htim.Init.CounterMode = TIM_COUNTERMODE_UP; // 递增计数
htim.Init.Period = 0xFFFF;            // ARR=65535(16位最大值)
HAL_TIM_IC_Init(&htim);

步骤2:配置输入捕获通道
  • GPIO设置
将引脚配置为复用功能,映射到定时器输入通道。
  • 边沿触发
选择上升沿、下降沿或双边沿触发。
  • 输入滤波
设置滤波器(如采样频率)抑制噪声干扰。
示例代码:
TIM_IC_InitTypeDef sConfigIC;
sConfigIC.ICPolarity = TIM_ICPOLARITY_RISING; // 上升沿触发
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI; // 直接输入通道
sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;      // 无预分频
sConfigIC.ICFilter = 0x0;                    // 无滤波
HAL_TIM_IC_ConfigChannel(&htim, &sConfigIC, TIM_CHANNEL_1);

步骤3:启用捕获与中断
  • 启动捕获
使能定时器及输入捕获通道。
  • 中断配置
开启捕获完成中断,处理数据读取与计算。
示例代码:
HAL_TIM_IC_Start_IT(&htim, TIM_CHANNEL_1); // 启动捕获并启用中断

步骤4:中断服务程序
在中断中读取捕获值,并计算时间参数。
示例代码:
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) {
    static uint32_t first_value = 0;
    static uint32_t pulse_width = 0;
    
    if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
        if (is_first_capture) { // 首次捕获上升沿
            first_value = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
            // 切换为下降沿触发
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_ICPOLARITY_FALLING);
            is_first_capture = 0;
        } else { // 捕获下降沿
            pulse_width = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1) - first_value;
            // 切换回上升沿,准备下一次测量
            __HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_ICPOLARITY_RISING);
            is_first_capture = 1;
        }
    }
}
5. 注意事项与优化
  • 溢出处理
若两次捕获间计数器溢出,需记录溢出次数。总时间计算为:总时间=(溢出次数×(ARR+1)+ΔCCR)×时钟周期总时间=(溢出次数×(ARR+1)+ΔCCR)×时钟周期
  • 分辨率与量程
  • 提高时钟频率(减小预分频)可提升分辨率,但缩短最大测量时间。
  • 增大ARR值可扩展量程,但降低分辨率。
  • 抗干扰设计
  • 启用输入滤波器(如设置ICFilter参数)抑制噪声。
  • 在软件中通过多次测量取平均提高稳定性。
  • DMA应用
对于高频信号,使用DMA自动传输捕获值,减少CPU中断负担。
6. 常见问题解决
  • 信号抖动
增加硬件滤波(RC电路)或软件去抖。
  • 测量误差
校准定时器时钟源,或补偿中断延迟。
  • 溢出未处理
在中断中检查溢出标志并计数,确保长时间测量的准确性。
7. 总结
输入捕获是嵌入式系统中实现高精度时间测量的核心技术,需合理配置定时器参数、处理中断与溢出,并结合抗干扰措施以确保可靠性。掌握其原理与实现方法,可广泛应用于传感器信号处理、电机控制、通信协议解析等领域。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐