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当前值 就是逆时针转动的步数
也可以按照自己的实际情况修改算法来记录转动步数
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当前值 就是逆时针转动的步数
也可以按照自己的实际情况修改算法来记录转动步数
相关文章推荐
- 零基础学python-2.1 输出 print()
- Makefile基础
- hdu 2087剪花布条 (KMP入门 子串出现的次数和子串个数)
- 零基础学python-2.1 输出 print()
- 素数问题
- TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能
- python连接mongodb并操作
- oracle存储过程
- Hdu oj 1005 Number Sequence
- iOS - 正则表达式判断邮箱、身份证..是否正确
- 阻止元素的默认行为
- 【转载】移动web开发经验总结
- jQuery中animate动画第二次点击事件没反应
- 常去的一些外国网站
- UITableView 实现汽车品牌(demo)
- zabbix监控H3C交换机端口流量
- leetcode 116 —— Populating Next Right Pointers in Each Node
- 我的高效编程的秘诀--开发环境的重要性(IOS)
- iOS项目开发实战——Swift实现多个TableView的侧滑与切换
- iOS8 状态栏 动态隐藏和显示