【STM32】HAL库 STM32G474定时器输入捕获获取频率和占空比 IDE(STM32CubeIDE)

一.输入捕获概念

输入捕获模式可以用来测量脉冲宽度或者测量频率。

二.基于NUCLEO-G474RE开发板新建工程

2.1 打开 STM32CubeMX 软件,新建工程.

我这里选择的是我的开发板
我手里有开发板所以选择基于开发板。

2.2 选择开发板(芯片)

我这里选择的是我的开发板NUCLEO-G474RE,少去一些步骤。
在这里插入图片描述

2.3 配置TIM1

配置TIM1产生100kHz的PWM,对应管脚PC0。
F= Tclk/[(psc+1) * (cnt+1)] = 170MHz/[1*1700] = 100kHz。

在这里插入图片描述

2.4 配置TIM2

参考自数据手册 PWM input mode

在这里插入图片描述
输入捕获的配置
在这里插入图片描述

2.5配置一下时钟树.

在这里插入图片描述

2.6生成代码.

在这里插入图片描述
在这里插入图片描述

三.编写代码

  1. 定义变量
/* USER CODE BEGIN PV */

uint16_t PRE1=1700;
uint16_t CMP1=500;
uint32_t capture_Buf[4] = {0};   //存放计数
uint32_t capture_Buf1[4] = {0};   //存放计数
uint8_t capture_Cnt = 0;    //状标志位
float duty_cycle;  //占空
uint32_t frequency;  //频率

/* USER CODE END PV */
  1. 开启定时器TIM1和TIM2
  /* USER CODE BEGIN 2 */
  
  HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
  HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动频率捕获(上升沿捕获)
  HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2); //启动频率捕获(下降沿捕获)
  
  /* USER CODE END 2 */
  1. while 循环中调节TIM1 PWM的频率和占空比
/* USER CODE BEGIN 3 */

  	//TIM1->PSC=0;
	TIM1->ARR=PRE1-1;
	TIM1->CCR1=CMP1-1;
  1. 核心代码(中断回调函数)
/* USER CODE BEGIN 4 */

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{

	// 获取频率
				if(TIM2==htim->Instance)
				{
				 if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1 )
				  {
				    if(capture_Cnt == 0)
				    {
				      /* Get the 1st Input Capture value */
				    	 //capture_Buf[0] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);

				    	 assert_param(IS_TIM_CC1_INSTANCE(htim2->Instance));
				    	 capture_Buf[0] =  htim->Instance->CCR1;
				    	 capture_Buf1[0] =  htim->Instance->CCR2;
				    	 capture_Cnt = 1;
				    }
				    else if(capture_Cnt == 1)
				    {
				      /* Get the 2nd Input Capture value */
				    	// capture_Buf[2] = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
				    	 assert_param(IS_TIM_CC1_INSTANCE(htim2->Instance));
				    	 capture_Buf[2] =  htim->Instance->CCR1;
				    	 capture_Buf1[2] =  htim->Instance->CCR2;
				    	 HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1); //启动频率捕获
				      /* Capture computation */
				      if (capture_Buf[2] > capture_Buf[0])
				      {
				        capture_Buf[3] = (capture_Buf[2] - capture_Buf[0]);
				        capture_Buf1[3] = (capture_Buf1[2] - capture_Buf[0]);
				      }
				      else if (capture_Buf[2] < capture_Buf[0])
				      {
				        /* 0xFFFF is max TIM1_CCRx value */
				        capture_Buf[3] = ((0xFFFF - capture_Buf[0]) + capture_Buf[1]) + 1;
				        capture_Buf1[3] = ((0xFFFF - capture_Buf[0]) + capture_Buf1[1]) + 1;
				      }
				      else
				      {
				        /* If capture values are equal, we have reached the limit of frequency
				           measures */
				        Error_Handler();
				      }

				      /* Frequency computation: for this example TIMx (TIM1) is clocked by
				         APB2Clk */
				      frequency = HAL_RCC_GetPCLK2Freq() / capture_Buf[3];
				      duty_cycle=capture_Buf1[3]*100/capture_Buf[3];
				      capture_Cnt = 0;
				    }
				  }

				}
}

/* USER CODE END 4 */

四.调试结果

这里就没有使用串口打印出来了,如果想打印出来请参考串口printf。
在这里插入图片描述
思考🤔:在没有信号输入到时候咋个处理???