|
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用于边沿捕获脉冲,timer0 32位周期定时,10ms的周期,进入后置位1,这样定时出来可以执行对脉冲的处理,用于计算里程。 板子的时钟是50M,LCD用于观测本次10ms内的脉冲值。码盘是2000线的,车轮直径75mm,码盘轮径60mm,给车子的速度是26转每分,这样计算出来10ms应该获得10个脉冲。可是lcd显示时700多的脉冲。期间我用systick计数程序运行的时间,发现进入中断时500000,也就是10ms,systick到上边括号的systick2的位置却花了3000000,也就是60ms,感到很诧异。不知道什么地方出了毛病 |
|