例程中使用TIM3更新中断来记录溢出次数,在中断服务中只有一句
[mw_shl_code=c,true]hEncoder_Timer_Overflow++;[/mw_shl_code]
紧接着就是连续两次取出 溢出次数 和 CNT的值:
[mw_shl_code=c,true] // 1st reading of overflow counter
hEnc_Timer_Overflow_sample_one = hEncoder_Timer_Overflow;
// 1st reading of encoder timer counter
hCurrent_angle_sample_one = ENCODER_TIMER->CNT;
// 2nd reading of overflow counter
hEnc_Timer_Overflow_sample_two = hEncoder_Timer_Overflow;
// 2nd reading of encoder timer counter
hCurrent_angle_sample_two = ENCODER_TIMER->CNT; [/mw_shl_code]
再接着就是:
[mw_shl_code=c,true]hEncoder_Timer_Overflow = 0;
haux = ENCODER_TIMER->CNT;
if (hEncoder_Timer_Overflow != 0)
{
haux = ENCODER_TIMER->CNT;
hEncoder_Timer_Overflow = 0;
}[/mw_shl_code]
这是不是说在运行
[mw_shl_code=c,true]hEncoder_Timer_Overflow = 0;有可能在下一句就发生溢出中断,所以需要再次判断,并将其清0.[/mw_shl_code]
[mw_shl_code=c,true]然后就是判断刚刚两次取出的值:[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true] if (hEnc_Timer_Overflow_sample_one != hEnc_Timer_Overflow_sample_two)
{ //Compare sample 1 & 2 and check if an overflow has been generated right
//after the reading of encoder timer. If yes, copy sample 2 result in
//sample 1 for next process
hCurrent_angle_sample_one = hCurrent_angle_sample_two;
hEnc_Timer_Overflow_sample_one = hEnc_Timer_Overflow_sample_two;
}[/mw_shl_code]
如果取出第一次的值之后发生了溢出中断,就会进入上述if语句,将第一次的值舍弃。[/mw_shl_code]
[mw_shl_code=c,true]下面这个处理就不明白了:[/mw_shl_code]
[mw_shl_code=c,true]
[mw_shl_code=c,true] if ( (ENCODER_TIMER->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)
{// encoder timer down-counting
wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle -
(hEnc_Timer_Overflow_sample_one) * (4*ENCODER_PPR));
}
else
{//encoder timer up-counting
wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle +
(hEnc_Timer_Overflow_sample_one) * (4*ENCODER_PPR));
}[/mw_shl_code]
// speed computation as delta angle * 1/(speed sempling time)
temp = (signed long long)(wDelta_angle * SPEED_SAMPLING_FREQ);
temp *= 10; // 0.1 Hz resolution
temp /= (4*ENCODER_PPR);
[/mw_shl_code]
[mw_shl_code=c,true]
[/mw_shl_code] |