STM3216位编码器溢出问题

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当前值  就是逆时针转动的步数

也可以按照自己的实际情况修改算法来记录转动步数

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值