新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2018-9-20
- 在线时间
- 13 小时
|
void TIM5_IRQHandler(void)
{
if((TIM5_CH1_CAPTURE_STA&0x80)==0) //还未成功捕获
{
if(TIM_GetITStatus(TIM5,TIM_IT_Update)) //发生更新中断
{
if(TIM5_CH1_CAPTURE_STA&0X40)//捕获到了高电平
{
if((TIM5_CH1_CAPTURE_STA&0x3f)==0x3f) //高电平时间太长
{
TIM5_CH1_CAPTURE_STA|=0x80; //标志一次捕获成功
TIM5_CH1_CAPTURE_VAL=0xffff;
}
else
{
TIM5_CH1_CAPTURE_STA++;
}
}
}
if(TIM_GetITStatus(TIM5,TIM_IT_CC1)) //发生捕获中断
{
if(TIM5_CH1_CAPTURE_STA&0X40)//捕获到了低电平
{
TIM5_CH1_CAPTURE_STA|=0x80; //成功捕获一次高电平
TIM5_CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置上升沿捕获
}
else
{
TIM5_CH1_CAPTURE_STA=0;
TIM5_CH1_CAPTURE_VAL=0;
TIM5_CH1_CAPTURE_STA|=0x40; //捕获到高电平 标志
TIM_Cmd(TIM5,DISABLE);
TIM_SetCounter(TIM5,0); //定时器初值为0
TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置下降沿捕获
TIM_Cmd(TIM5,ENABLE);
}
}
}
TIM_ClearITPendingBit(TIM5,TIM_IT_CC1|TIM_IT_Update);
}
u8 time=0,Distance=0;
void distance()
{
PBout(1)=1;
delay_us(15);
PBout(1)=0;
// delay_ms(10);
if(TIM5_CH1_CAPTURE_STA&0x80)
{
time=TIM5_CH1_CAPTURE_STA&0x3f;//溢出时间次数
time*=0xffff;
time+=TIM5_CH1_CAPTURE_VAL;
printf("time=%d\n", time);
Distance=time*170/1000;
//printf(" Distance=%d", Distance);
TIM5_CH1_CAPTURE_STA=0;
}
}
求大佬解答疑惑,为什么测出来距离永远是一个值。
|
|