周期定时的问题,定时中断出来后如何进行?和理想的不一样
iniTimer();SysTickPeriodSet(6000000UL); // 设置SysTick计数器的周期值
SysTickEnable(); // 使能SysTick计数器
ulStart=SysTickValueGet(); // 读取SysTick当前值(初值)
flag=0;
while(1){
if(flag==1)
{
DisCountL2=(StepL+1)*65535-DiCountL;//计算当前定时器读取的脉冲值
DisCountR2=(StepR+1)*65535-DiCountR;
DisCountL=DisCountL2-DisCountL1;//10ms内的码盘值
DisCountR=DisCountR2-DisCountR1;
DisCountL1=DisCountL2;//保存此次脉冲数,用于下次计算
DisCountR1=DisCountR2;
LCD_dis_chars(1, 1, DisCountL);
(systick2)
·······
}
}
中断函数
void Timer0A_ISR()
{
flag=1; //标志位置1,返回后主程序进行码盘数值处理
unsigned long ulStatus;
ulStatus = TimerIntStatus(TIMER0_BASE, true);
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); /*清除定时器0中断 */
if (ulStatus & TIMER_TIMA_TIMEOUT) // 如果是Timer超时中断
{
ulStop = SysTickValueGet( ); // 读取SysTick当前值(终值)
SysTickDisable(); // 关闭SysTick计数器
ulInterval=ulStart-ulStop; // 计算时间间隔
DiCountL=TimerValueGet(TIMER1_BASE,TIMER_A);
DiCountR=TimerValueGet(TIMER1_BASE,TIMER_B);
}
}
这是弄码盘脉冲计数的一个程序的一部分,timer1A和B用于边沿捕获脉冲,timer032位周期定时,10ms的周期,进入后置位1,这样定时出来可以执行对脉冲的处理,用于计算里程。 板子的时钟是50M,LCD用于观测本次10ms内的脉冲值。码盘是2000线的,车轮直径75mm,码盘轮径60mm,给车子的速度是26转每分,这样计算出来10ms应该获得10个脉冲。可是lcd显示时700多的脉冲。期间我用systick计数程序运行的时间,发现进入中断时500000,也就是10ms,systick到上边括号的systick2的位置却花了3000000,也就是60ms,感到很诧异。不知道什么地方出了毛病 不明白你为什么要用定时器来读取码盘的值,没有外中断么?
另外对于你后面的描述不是很明白…… 回复【1楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
timer1的A和B用来外部边沿计数。所以在周期定时到了后要读取当前计数,运算后得码盘行走的距离。后面是我的查错程序,第一次进入定时是正确的时间耗时10ms,按我的思维,在定时中断里修改了flag为1,中断出来后应该进入if中,进入if到systick2的位置只有几行代码,但是检测从程序开始到systick2花了60ms···另外,我单步运行时发现,flag为0时,程序进入了if - -b 什么芯片啊……感觉你说的定时器行为我不是很能理解…… 回复【3楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
已经解决了我定时里有lcd的程序 占用了很多时间我的粗心 读书的时候,老师就给我们说:“中断服务程序”一定要短小精悍。
看来楼主就是犯了这个原则。
一肌脑把所有代码都放到定时中断中。
正确的做法是:只把和时间非常紧密的代码(读取脉冲数)放到定时中断中,至于计算转速代码,就不能放在定时中断中而应该放到主程序中去计算。
页:
[1]