[M4] HAL_TIM_IC_CaptureCallback中断好像不是每次都能进去。

[复制链接]
20572|2
 楼主| mbutterfly 发表于 2024-7-4 09:55 | 显示全部楼层 |阅读模式
最近用STM32的一个芯片测PWM输入,发现频率有的时候不对,原因是HAL_TIM_IC_CaptureCallback函数里测量的上升沿之间间隔和上升沿下降沿之间间隔,发现有的时候丢了一个上升沿或者下降沿。将这个定时器的优先级该成0,状况好点,但是还出错。
 楼主| mbutterfly 发表于 2024-7-4 11:31 | 显示全部楼层
输入频率是10000Hz的时候,__HAL_TIM_GetCounter函数测的值,比HAL_TIM_ReadCapturedValue要多2个,即使__HAL_TIM_GetCounter放到前面。
sunjd 发表于 2025-10-27 09:21 | 显示全部楼层
问题分析
1. 中断响应延迟:即使优先级设为0,仍可能因其他高优先级中断或代码阻塞导致丢失边沿
2. 计数器溢出处理:未正确处理定时器计数器溢出
3. 测量时序问题:读取计数器值的时机不当
建议使用DMA方式,完全避免中断延迟问题
增加溢出计数,处理长时间测量
使用硬件滤波,消除信号抖动
实现软件去抖,过滤异常测量值
#define CAPTURE_BUFFER_SIZE 4
uint32_t capture_buffer[CAPTURE_BUFFER_SIZE];

void start_pwm_measurement(void)
{
    // 启动DMA捕获
    if (HAL_TIM_IC_Start_DMA(&htim, TIM_CHANNEL_1,
                           capture_buffer, CAPTURE_BUFFER_SIZE) != HAL_OK) {
        Error_Handler();
    }
}

// DMA传输完成回调
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
    // 处理完整的捕获数据
    process_capture_data(capture_buffer, CAPTURE_BUFFER_SIZE);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

5473

帖子

10

粉丝
快速回复 在线客服 返回列表 返回顶部