当前位置: 首页>大数据>正文

蓝桥杯STM32 G431 hal库开发速成——输入捕获

蓝桥杯的输入捕获较为简单,基本不涉及溢出的问题。所以这里就不介绍溢出了。文末有源码。

核心思想:在第一次上升沿的时候计第一个数,第一次下降沿的时候计第二个数,第二次上升沿的时候计第三个数。
蓝桥杯STM32 G431 hal库开发速成——输入捕获,在这里插入图片描述,第1张

占空比 =(第二个数-第一个数) / (第三个数-第一个数)

其实这个占空比公式并没有写全,是简写了,写完了应该是:

占空比=高电平的时间/周期。即:(第二个数-第一个数) 乘 计一个数的时间 / (第三个数-第一个数) 乘 计一个数的时间,简写是因为正好约去了

周期 = (第三个数-第一个数) 乘 计一个数所需要的时间

计一个数所需要的时间 = psc / pclk

一、Cubemx配置

蓝桥杯STM32 G431 hal库开发速成——输入捕获,在这里插入图片描述,第2张

二、代码编写

1.在捕获回调函数中


void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance==TIM3)
	{
		switch(count)
		{
			case 1:
			{
				jishu1=__HAL_TIM_GET_COUNTER(&htim3);
			  __HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
				count++;
				break;
			}
			
			case 2:
			{
				jishu2=__HAL_TIM_GET_COUNTER(&htim3);
			  __HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
				count++;
				break;
			}
			case 3:
			{
				jishu3=__HAL_TIM_GET_COUNTER(&htim3);
				count++;
				HAL_TIM_IC_Stop_IT(&htim3,TIM_CHANNEL_1);
				break;
			}
		}
	}
}

2.在main函数中

 LCD_Init();
  LCD_Clear(White);
  HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  switch(count)
	  {
		  case 0:
		  {
			  __HAL_TIM_SET_COUNTER(&htim3, 0);
			  HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
			  __HAL_TIM_SET_CAPTUREPOLARITY(&htim3, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
			  count++;
			  break;
		  }
		  
		  case 4:
		  {
			  fre=1000000.0/(jishu3-jishu1);
			  zkb=(jishu2-jishu1)*100.0/(jishu3-jishu1);
//			  频率为占空比为
			  sprintf(buff,"zkb:%.2f%% fre:%.2f",zkb,fre);
			  LCD_DisplayStringLine(Line4, buff);
			  count=0;
			  break;
		  }
		  
	  }
  }
  /* USER CODE END 3 */
}

三、现象

通过调节开发版上的旋钮改变占空比跟频率
蓝桥杯STM32 G431 hal库开发速成——输入捕获,在这里插入图片描述,第3张
小编的源码输入捕获源码


https://www.xamrdz.com/bigdata/7ay1995588.html

相关文章: