STM32 HAL库实现输入捕获测频率
系列文章目录
【STM32】HAL库 新建MDK工程
【STM32】HAL库 串口轮询发送
【STM32】HAL库 定时器中断
【STM32】HAL库 PWM驱动LED呼吸灯
【STM32】HAL库 定时器外部时钟
文章目录
前言
使用测频法和测周法,测出信号的频率
一、测周法与测频法
测频法
在一段时间T内,计数上升沿的次数N
fx = N / T
测周法
在两个上升沿内,计数上升沿的次数N
fx = fc / N
两者优略
频率高时,适合用测频法
频率低时,适合用测周法
测周法只需要一个定时器,测频法需要两个
二、STM32CubeMX设置——测周法
设置PWM输出,频率为72Mhz / 720 / 100 = 1000Hz
CCR设为50
设置定时器为输入捕获模式,fc = 72MHz / 72 = 1MHz
fx = 10000000 / N
三、代码——测周法
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
HAL_TIM_IC_Start(&htim3, TIM_CHANNEL_1);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("Freq:%dHz",1000000 / (HAL_TIM_ReadCapturedValue(&htim3,TIM_CHANNEL_1) + 1));
HAL_Delay(500);
}
/* USER CODE END 3 */
四、STM32CubeMX设置——测频率法
定时器4用于开启一段时间T的中断
T=720000000 / 7200 / 1000 = 0.1s = 100ms
开启外部时钟,用于计数N
五、代码——测频法
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
__HAL_TIM_CLEAR_FLAG(&htim1, TIM_SR_UIF);
HAL_TIM_Base_Start(&htim1);
HAL_TIM_Base_Start_IT(&htim4);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint16_t HisCount,CurCount;
HisCount = CurCount;
CurCount = __HAL_TIM_GetCounter(&htim1);
Count = CurCount - HisCount;
}
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
printf("Freq:%dHz",Count *10);
HAL_Delay(500);
}
/* USER CODE END 3 */
作者:youuuuvvu