? ? ? ? 第一章: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怎么办?
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);
}
}