STM32 定时器输入捕获2——捕获高电平时长

        由上图我们可以知道,高电平时间=t2-t1。在代码中,可以记录此时t1的时间然后再记录t2的时间,t2-t1,就是我们所想要的答案。

        但是,还有更简单一点点的,当到达t1的时候,我们把定时器清零,然后直接读出t2,就是这个高电平的时间。

  • 1.当TIM3的TIM_FLAG_CC1==1时,清除TIM3
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET)
	{
		TIM_SetCounter(TIM3,0);
	}
	TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1);
}
  • 2.从波形图可以看出,刚开始检测的是上升沿,所以检测TIM_FLAG_CC1的时候是SET,到了第二步,波形开始下降,变为下降沿,此时我们就要更改一下检测的方式了,我们可以用到下面这个函数。

TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
//更改下次检测的极性为low(低电平)
void TIM3_IRQHandler(void)
{
	static unsigned char high_flag = 0;
	if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET)
	{
		
		if(high_flag == 0)//上升沿
		{
			high_flag = 1;
			TIM_SetCounter(TIM3,0);
			TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
		}
		else//下降沿
		{
			high_value = TIM_GetCounter(TIM3);
			TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_High);
			high_flag = 0;
		}
	}
	TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1);
}
  • 3.每次到下一个波形的时候,都重新初始化一下high_value.
if(high_flag == 0)//上升沿
{
    high_flag = 1;
	high_value = 0;
	TIM_SetCounter(TIM3,0);
	TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
}
  • 4.如果在main中,去使用了high_value,此时高电平还在不断输出,定时器也在运行,high_value仍会该改变,对于high_value的使用就不方便。所以我们需要限制一个条件,当我们使用high_value的时候,不要去重新写high_value了。
void TIM3_IRQHandler(void)
{
	static unsigned char high_flag = 0;
	
	if(high_complete_flag == 0)
	{
		if(TIM_GetITStatus(TIM3,TIM_FLAG_CC1)==SET)
		{
			if(high_flag == 0)//上升沿
			{
				high_flag = 1;
				high_value = 0;
				TIM_SetCounter(TIM3,0);
				TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_Low);
			}
			else//下降沿
			{
				high_value = TIM_GetCounter(TIM3);
				TIM_OC1PolarityConfig(TIM3,TIM_OCPolarity_High);
				high_flag = 0;
				high_complete_flag = 1;
			}
		}
	}
	TIM_ClearITPendingBit(TIM3,TIM_FLAG_CC1);
}

在使用high_value之前,让high_complete_flag = 0;这样之后时,high_value就不会变了

main

int main(void)
{
	TIM2_PWM_Configuration();//PWM周期为20ms
	
	TIM3_InputCaputure_Configuration();//PA1:发出《————》PA6:接收
	
	Uart1_Configuration();
	
	TIM_SetCompare2(TIM2,10000);//占空比为50%,即10ms高电平
	
	while(1)
	{
		if(high_complete_flag == 1)
		{
			printf("%d us",high_value);
			high_complete_flag = 0;
		}
		Delay_s(10);
	}
	
}

相关推荐

  1. STM32 定时器输入捕获3——捕获超长

    2024-01-17 13:34:06       32 阅读
  2. C语言-STM32-定时器定时器输入捕获

    2024-01-17 13:34:06       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-17 13:34:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-17 13:34:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-17 13:34:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-17 13:34:06       20 阅读

热门阅读

  1. 快速了解STM32的ADC功能,从入门到精通

    2024-01-17 13:34:06       31 阅读
  2. Github Copilot 的使用方法和快捷键*

    2024-01-17 13:34:06       45 阅读
  3. Nue.js 是什么?

    2024-01-17 13:34:06       28 阅读
  4. What is `HttpServletRequestWrapper` does?

    2024-01-17 13:34:06       35 阅读
  5. ConcurrentHashMap源码解析

    2024-01-17 13:34:06       43 阅读
  6. route和router的区别

    2024-01-17 13:34:06       30 阅读
  7. C++中的符号->

    2024-01-17 13:34:06       25 阅读
  8. messages,CentOS 7不收集日志或不存在 /var/log/messages

    2024-01-17 13:34:06       26 阅读
  9. 【软件设计模式之单例模式】

    2024-01-17 13:34:06       34 阅读
  10. 蓝桥杯 第三场 小白入门赛

    2024-01-17 13:34:06       37 阅读