标题:
定时器溢出问题
[打印本页]
作者:
Lily0526
时间:
2009-10-12 16:27
标题:
定时器溢出问题
本人利用9S12单片机进行电机调速。将定时器设置为输入捕捉功能,有跳变沿时进入中断,把计数器的当前值保存起来,利用两个跳变沿计数器之间的差值以计算转速。现在的问题是当转速很低时,定时器会出现溢出,从而计算转速时出现错误。现在想对定时器溢出进行计数,但又不影响其他功能,请问各路前辈如何实现?谢谢您的无私帮助!非常感谢!
作者:
hejianqian
时间:
2009-10-15 15:28
你定义一个时钟溢出中断,在中断中数溢出的次数不可以了。溢出一次加65536,二次就*2,同理的可以得到计数器的时钟个数,就可以了。
作者:
yanghu20
时间:
2009-11-5 22:13
看看这个
//--------------------------转速计算------------------------------*
#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++;
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0