您的位置:首页 > 其它

STM3216位编码器溢出问题

2015-08-10 16:32 190 查看
STM3216位编码器溢出问题
STM32定时器有编码器接口,但是它的计数器只有16位。当要记录的数过大时,会溢出。下文介绍了一种方法,能有效解决因计数器位数过少引起的溢出问题。
(在网上搜了好多,感觉不他们说的方法都不准。这个方法经过我自己验证,可以准确记录编码器的位置)

原理一:
unsigned short int j;(j的长度为16bit)
① 当j=65535 ,运行j++后,j=0;
② 当j=0 , 运行j- -后,j=65535;
定时器的16位计数器寄存器(CNT)同样符合上面的逻辑。在编码器模式时,

(一)当加计数时(up计数),加到65535后,再加1,CNT的值变为0,且溢出标志位 被置1(UIF=1),
(二)当减计数时(down计数),减到0后,再减1,CNT的值变为65535,且溢出标志位被置1(UIF=1),
当溢出中断被使能时(UIE=1),(一)、(二)两种情况都会触发中断,在中断函数中判断CNT的值,就可以判断是加溢出还是减溢出,用一个变量(update)记录溢出的次数

signed int update;
if(CNT < 32768)
{
update++;
}
else
{
update--;
}

若使用圆形编码器,update的正负表示是顺时针还是逆时针转动
假设update正为顺时针转动
当update为正
update * 65535 + CNT当前值 就是顺时针转动的步数
当update为负
(0-update*65536-CNT当前值 就是逆时针转动的步数
也可以按照自己的实际情况修改算法来记录转动步数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: