STM32CubeMX配置HAL库输入捕获
STM32的输入捕获功能可以用来测量脉冲宽度或者频率。其工作原理是,通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如
上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。
硬件
- STM32F407IGT6
- Stlink
- USB-TTL
软件
配置

默认输入捕获通道可以设置低电平,上升沿触发

编写程序
初始化变量(全局)
1 2 3 4 5 6
| uint32_t capture_left_Buf[3] = {0}; uint32_t capture_right_Buf[3] = {0}; uint8_t capture_left_Cnt = 0; uint8_t capture_right_Cnt = 0; uint32_t left_time, right_time; uint32_t left_speed, right_speed;
|
中断服务函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM2) { if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) { switch(capture_left_Cnt){ case 1: capture_left_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
capture_left_Cnt++; break; case 2: capture_left_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_1); capture_left_Cnt++; } } if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) { switch(capture_right_Cnt){ case 1: capture_right_Buf[0] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2); capture_right_Cnt++; break; case 2: capture_right_Buf[1] = HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2); HAL_TIM_IC_Stop_IT(&htim2,TIM_CHANNEL_2); capture_right_Cnt++; } } } }
|
主函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_2); HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1); HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2); __HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
while (1) {
Load_PWM(500, 500); switch (capture_left_Cnt){ case 0: capture_left_Cnt++; __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); break; case 3: left_time = capture_left_Buf[1]- capture_left_Buf[0]; capture_left_Cnt = 0; break; } switch (capture_right_Cnt){ case 0: capture_right_Cnt++; __HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING); HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); break; case 3: right_time = capture_right_Buf[1]- capture_right_Buf[0]; capture_right_Cnt = 0; break; } printf("{\"left_time\":%d,\"right_time\":%d} \r\n",left_time, right_time); HAL_Delay(1000); }
|
演示
用杜邦线连接PA6->PA0 PA7->PA1
PWM脉冲 84M/168/1000 = 500Hz 1/500Hz = 20ms = 200us
(之前的截图,配置都一样)
