问题分析
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);
}
|