本帖最后由 逍遥李 于 2013-11-15 23:54 编辑
Avoid_run.rar
(35.72 KB)
最近在做一个小车,做到超声波测距这块的时候总是出现定时器溢出中断丢失,因为要靠溢出中断次数进行计算距离,所以一旦丢失一次就会造成距离数据错误。部分程序如下:
#pragma vector =TIMER0_A0_VECTOR /* TAR计数值由TACCR0-1跳到TACCR0时进入此中断,TACCR0设置值为100*/
__interrupt void period_in (){
over_sign++; //溢出标志位//
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void pwm_and_echo(){ //TACCR2溢出中断和捕获发生中断
switch(TAIV){
case 2:
if(echo_sign==0){ //判断:如果第一次进入中断则说明是Echo上升沿信号,
echo_t1 =TACCR1; //记录此时TAR计数值,存入echo_t1
over_t0=over_sign; //溢出次数计入over_t0保存
echo_sign=1; //中断进入标志位置1
}
else if(echo_sign==1){ ////第二次进入中断,即下降沿Echo信号
echo_t2 =TACCR1; ////读取TAR值
over_times=over_sign-over_t0; //计算出溢出次数,保存到over_times中,用于距离计算
echo_sign=0; //恢复捕获信号辨识标志
TACCTL1 &=~CCIE; //关闭捕获中断允许,屏蔽干扰,在超声波触发程序段中再打开
}
break;
case 4: ; break;
}
}
void for_a_distance(){
TACCTL1 |=CCIE;
Send_echo; //此处宏定义 #define Send_echo P1OUT |=BIT7 //超声波发送
__delay_cycles(25);
Send_echo_end; // #define Send_echo_end P1OUT &=~BIT7
over_sign =0; // 每次进行测距之前清零溢出次数计数,防止此变量自身溢出
}
/*******系统初始化********/
void Init_sys(){
P2DIR |=BIT0;
TACTL = TASSEL_1 + MC_1+ID_0; //定时器时钟选择为ACLK, up mode
TACCR0 =100;
TACCTL0 |=CCIE; //打开TAR溢出中断
/******超声波测距功能初始化******/
P1SEL |=BIT2; //超声波测距捕获引脚P1.2第二功能打开
P1DIR |=BIT7; //超声波信号发送引脚P1.7设置为输出
TACCTL1 |=CM_3+SCS+CAP+CCIE; //上升、下降沿捕获;同步捕获;
_EINT();
}
定时器时钟选择的是ACLK,32.768Khz,
使用的是launchpad小板,通过在线监控发现溢出中断丢失基本都是发生在“TAR值为98、99即接近溢出值100时候丢失over_sign计数”,就是当TAR计数到接近100时候,此时恰好超声波脉冲也过来了,那么这次溢出将不能被记录,也就是over_sign++不执行,这是为什么呢?
哪位大侠看出来问题所在了,请指点,不胜感激!另外,我在另一个论坛也看到有人遇到这个问题,但是坛友后来说他解决了是时钟设置问题,我一直没明白,也没联系上这位坛友。
|