首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

定时器溢出问题

定时器溢出问题

本人利用9S12单片机进行电机调速。将定时器设置为输入捕捉功能,有跳变沿时进入中断,把计数器的当前值保存起来,利用两个跳变沿计数器之间的差值以计算转速。现在的问题是当转速很低时,定时器会出现溢出,从而计算转速时出现错误。现在想对定时器溢出进行计数,但又不影响其他功能,请问各路前辈如何实现?谢谢您的无私帮助!非常感谢!
你定义一个时钟溢出中断,在中断中数溢出的次数不可以了。溢出一次加65536,二次就*2,同理的可以得到计数器的时钟个数,就可以了。
看看这个
//--------------------------转速计算------------------------------*
#pragma CODE_SEG NON_BANKED              
void interrupt 8 Timer0_ISR(void)
{
  
  TFLG1_C0F=1;       //清中断标志位
  if(Pulse_Num==0)   //捕捉到第一个脉冲上升沿
  {
    Pulse_Num=1;
    PulseEnable=1;
    Last_Period=TC0;
    TSCR2_TOI = 1;   //定时器溢出中断使能
  }
  else
  {
    if(PulseEnable==1)
    {
      Pulse_Num++;
      Now_Period=TC0;
      Period=65535*Overflowtime+Now_Period - Last_Period;
      SpeedV=2812500/Period;
      if(Pulse_Num<10)
      {
        Speed0[i]=SpeedV;
        i++;
        Speed=SpeedV;
        Last_Period=Now_Period;
      }
      else{   
      }
      if(Pulse_Num==9)
      {
        PulseEnable=0;
      }
      else{   
      }     
    }
    else
    {
      Now_Period=TC0;
      if(Overflowtime<3)
      {
        Period=65535*Overflowtime+Now_Period - Last_Period;
        SpeedV=2812500/Period;
      
        SpeedSum = SpeedSum-Speed0[0]+SpeedV;
        Speed=SpeedSum/8;
        Speed0[0]=Speed0[1];
        Speed0[1]=Speed0[2];
        Speed0[2]=Speed0[3];
        Speed0[3]=Speed0[4];
        Speed0[4]=Speed0[5];
        Speed0[5]=Speed0[6];
        Speed0[6]=Speed0[7];
        Speed0[7]=SpeedV;
   
        Overflowtime=0;         
        Last_Period=Now_Period;  
      }
      else
      {
        Speed=0;        //停机
        TSCR2_TOI = 0;  //定时器溢出中断禁止
        Overflowtime=0;
        Pulse_Num=0;
      }  
    }  
  }         
}

#pragma CODE_SEG NON_BANKED  //定时器溢出中断        
void interrupt 16 TimerOverFlow(void)
{
  TFLG2_TOF = 1; //清楚定时器溢出中断标志位
  Overflowtime++;  
}
返回列表