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

        第一章:https://blog.csdn.net/m0_73671341/article/details/134773615?spm=1001.2014.3001.5501

        第二章:https://blog.csdn.net/m0_73671341/article/details/134938332?spm=1001.2014.3001.5501

        从第一章的定时器捕获我们可以知道,即使把定时器捕获时长设置到最大也只有65.536ms,而第二章就说明了,高电平小于65.536ms的时候,如何捕获高电平时间。那么如果高电平时间溢出中断时间65.536ms怎么办?

  • 原先的TIM2(高电平输出)
	TIM_TimeBaseStructure.TIM_Period = 19999;
	TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_SetCompare2(TIM2,10000);//占空比为50%,即10ms高电平

现在把TIM2改成

	TIM_TimeBaseStructure.TIM_Period = 19999;
	TIM_TimeBaseStructure.TIM_Prescaler = 719;

此时TIM2分频系数放大十倍,则频率降低十倍,周期放大十倍。

TIM_SetCompare2(TIM2,10000);//占空比为50%,即100ms高电平

        很明显已经超过最大值65.536ms了。 

这时候如果执行代码,输出高电平时间,会输出34.464ms,很明显65.536+34.464=100ms,65.536是一次周期的时间,所以我们可以得出一个结论:高电平时间=n次周期+最后捕获的时间

        所以我们在TIM3配置中,使能TIM_IT_Update(中断标志位),在TIM3中断函数中,清除TIM_IT_Update。

        代码逻辑:如果定时器在捕获,TIM_IT_Update为Set,并且此时处于高电平。peroid_times++,然后清楚TIM_IT_Update,重复此过程,每次溢出都会让peroid_times++。

void TIM3_IRQHandler(void)
{
	static unsigned char high_flag = 0;
	
	if(high_complete_flag == 0)
	{
		if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//溢出
		{
			if(high_flag == 1)
			{
				peroid_times++;
			}
		}
		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|TIM_IT_Update);
}
int main(void)
{
	TIM2_PWM_Configuration();
	
	TIM3_InputCaputure_Configuration();//PA1:发出《————》PA6:接收
	
	Uart1_Configuration();
	
	TIM_SetCompare2(TIM2,10000);//占空比为50%,即100ms高电平
	
	while(1)
	{
		if(high_complete_flag == 1)
		{
			printf("%d us",peroid_times * 65536+high_value);
			high_complete_flag = 0;
		}
		Delay_s(10);
	}
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机,c语言,c++,学习,学习方法)