【相关推荐】
相关的中断处理程序
//定时器5中断服务程序
void TIM5_IRQHandler(void)
{
if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
{
if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
{
if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
{
if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
{
TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
TIM5CH1_CAPTURE_VAL=0XFFFF;
}else TIM5CH1_CAPTURE_STA++;
}
}
if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET)//捕获1发生捕获事件
{
if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
{
TIM_SetCounter(TIM5,0);
TIM5CH1_CAPTURE_VAL=0;
TIM5CH1_CAPTURE_STA=0; //清空
TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获到一次高电平脉宽
TIM5CH1_CAPTURE_STA&=!0X40;//标记捕获到了下降沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=0 设置为上升沿捕获
}
else //还未开始,第一次捕获上升沿
{
time_l=TIM5CH1_CAPTURE_STA&0X3F;
time_l *= 65536;
time_l += (2);
TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
time_l += TIM5CH1_CAPTURE_VAL;
TIM5CH1_CAPTURE_STA|=0X40; //标记捕获到了上升沿
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC1P=1 设置为下降沿捕获
}
}
}
TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}
这个只检测频率,精度还阔以,但是理论精度大约在25HZ–250KHZ,实际测试精度在 28HZ–80KHZ,剩下的还没实现,可以通过设置计数的频率来提高精度,本实验是1us测试一次,因此1US以下的就拜拜了
优点:占空比无论咋样都可以测出来,高点的频率适合(几千几十千赫兹那种)