输入捕获详解
输入捕获是嵌入式系统中实现高精度时间测量的核心技术,需合理配置定时器参数、处理中断与溢出,并结合抗干扰措施以确保可靠性。总时间计算为:总时间=(溢出次数×(ARR+1)+ΔCCR)×时钟周期总时间=(溢出次数×(ARR+1)+ΔCCR)×时钟周期。输入捕获是嵌入式系统中定时器的重要功能,用于精确记录外部信号边沿(上升沿或下降沿)发生的时刻。当检测到指定边沿(如上升沿)时,当前计数值自动存入捕获寄存
·
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. 总结
输入捕获是嵌入式系统中实现高精度时间测量的核心技术,需合理配置定时器参数、处理中断与溢出,并结合抗干扰措施以确保可靠性。掌握其原理与实现方法,可广泛应用于传感器信号处理、电机控制、通信协议解析等领域。
更多推荐



所有评论(0)