STM32F4XX定时器16位,采集编码器时候会在0xFFFF溢出(假设配置period = 0xFFFF)
假设不溢出的情况下1ms之内编码器变化的最大范围小于0x7FFF,则关于溢出则可以进行如下处理,此时EncCnt 便是累计的编码器取值
配置定时器时屏蔽定时器的溢出中断。
反转的变化规律为0溢出突变到65535,然后平缓向0
正转的变化规律为0平缓到65535,然后突变到0
int volatile EncCnt = 0;// 编码器取值
void SysTick_Handler(void){// systick中断,1ms一次
static int encoder[2] = {0 , 0};// 两次编码器读值,用以计算溢出方向
static int N = 0;// 圈数
encoder[1] = TIM3->CNT;
if( (encoder[1] - encoder[0] ) > 0x7FFF)
{
N--;
}
else if( (encoder[0] - encoder[1] ) > 0x7FFF)
{
N++;
}
EncCnt = N * 0xFFFF + encoder[1];
encoder[0] = encoder[1];
}