stm32g431-蓝桥杯嵌入式-输入捕获

首先看看配置

首先是在程序的开头写上启动中断

	HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);

定义的变量

uint count = 0;        //用于表示第几次上升沿
uint t_count = 0;      //存储上升沿的计数值
uint d_count = 0;      //存储第一次上升沿和下降沿的时间
uint duty = 0;         //占空比
uint freq = 0;         //频率    

lcd的初始化

  LCD_Init();
  LCD_SetTextColor(Black);
  LCD_SetBackColor(White);
  LCD_Clear(White);

输入捕获的代码

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if( htim ->Instance == TIM2)
	{
		if( htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_1)/*第一次上升沿*/
		{
			 if( count == 0)
			 {
				 TIM2 ->CNT = 0;                         /*先把计数值给清0*/
				 
				 count = 1;
			 }
			 else if( count == 1)                      /*第二次上升沿*/
			 {
					t_count = TIM2 ->CCR1 + 1;             /*第一次上升沿和第二次上升沿的时间间隔*/
					freq = 1000000/t_count;                /*计算频率*/
					duty = (float)d_count/t_count*100;     /*计算占空比*/
				 
				 count = 0;
			 }
		}
		else if( htim ->Channel == HAL_TIM_ACTIVE_CHANNEL_2 && count == 1 )/*跟在第一次上升沿之后的下降沿*/
		{
			d_count = TIM2 ->CCR2 + 1;                 /*第一次上升沿和第二次下降沿的时间间隔*/
		}

	}

}

最后写个程序验证

void lcd_display()
{
	char temp[30];
	
	sprintf(temp,"%d",freq);
	LCD_DisplayStringLine(Line1,(uint8_t *)temp);

	sprintf(temp,"%d",duty);
	LCD_DisplayStringLine(Line2,(uint8_t *)temp);
}


  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		lcd_display();

  }

观察现象

验证成功,还是有点准的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值