STM32 HAL库实现输入捕获测频率

系列文章目录

【STM32】HAL库 新建MDK工程
【STM32】HAL库 串口轮询发送
【STM32】HAL库 定时器中断
【STM32】HAL库 PWM驱动LED呼吸灯
【STM32】HAL库 定时器外部时钟

文章目录

  • 系列文章目录
  • 前言
  • 一、测周法与测频法
  • 测频法
  • 测周法
  • 两者优略
  • 二、STM32CubeMX设置——测周法
  • 三、代码——测周法
  • 四、STM32CubeMX设置——测频率法
  • 五、代码——测频法

  • 前言

    使用测频法和测周法,测出信号的频率

    一、测周法与测频法

    测频法

    在一段时间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

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 HAL库实现输入捕获测频率

    发表评论