增量式编码器计数的过零点处理问题
2017-05-19 09:41
113 查看
在增量式编码器位置计数过程中,每经过一个计数溢出,根据运转方向,在update中断里我们会对圈数加1或者减1
这样,计算当前位置时,采用
但这样会存在一个问题,由于NbofTurns与CNT没有办法同时读取,也就是拍快照保存,这样会导致一个问题,溢出发生在取两个参与计算值中间,导致一个数据是溢出前采集,一个数据是溢出触发中断,经过中断处理后采集,这样就会使最终计算得到的位置信息恰好与实际值偏离出一个圈数的脉冲值。
改进思路是读取时关闭update中断,然后读取两个值
然而这样还是存在问题,中断响应虽然暂时关闭了,但CNT的计数为了不遗漏位置信息而不能关闭,还是会造成事实溢出。最终改进代码如下
在关闭中断确保NbofTurns处于快照状态,再判断一次读取到的CNT是否溢出,如溢出则做一次修正,确保两个数据都处于快照状态。
if ((TIMx->SR & TIM_FLAG_Update) == TIM_FLAG_Update) { /* Clear the interrupt pending flag */ TIM_ClearFlag(TIMx, TIM_FLAG_Update); /*record number of turns*/ if ((TIMx->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down) {/* encoder timer down-counting*/ pDVars_str->NbofTurns--; } else {/* encoder timer up-counting*/ pDVars_str->NbofTurns++; } }
这样,计算当前位置时,采用
position = (int32_t)(pDVars_str->NbofTurns) * (int32_t)(pDParams_str->hPulseNumber) + TIMx->CNT;
但这样会存在一个问题,由于NbofTurns与CNT没有办法同时读取,也就是拍快照保存,这样会导致一个问题,溢出发生在取两个参与计算值中间,导致一个数据是溢出前采集,一个数据是溢出触发中断,经过中断处理后采集,这样就会使最终计算得到的位置信息恰好与实际值偏离出一个圈数的脉冲值。
改进思路是读取时关闭update中断,然后读取两个值
/*Disable update interrupts to have NbofTurns and CNT of the same period*/ TIMx->DIER &= (uint16_t)~TIM_IT_Update; /* NB:Std libray not used for perf issues*/ cnt = TIMx->CNT; NbofTurns = pDVars_str->NbofTurns; TIMx->DIER |= TIM_IT_Update; /* NB:Std libray not used for perf issue*/
然而这样还是存在问题,中断响应虽然暂时关闭了,但CNT的计数为了不遗漏位置信息而不能关闭,还是会造成事实溢出。最终改进代码如下
/*Disable update interrupts to have NbofTurns and CNT of the same period*/ TIMx->DIER &= (uint16_t)~TIM_IT_Update; /* NB:Std libray not used for perf issues*/ cnt = TIMx->CNT; NbofTurns = pDVars_str->NbofTurns; if((TIMx->SR & TIM_FLAG_Update) == TIM_FLAG_Update) { if((TIMx->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down) {/* encoder timer down-counting*/ if(cnt > (pDParams_str->hPulseNumber/2)) { NbofTurns--; } } else {/* encoder timer up-counting*/ if(cnt < (pDParams_str->hPulseNumber/2)) { NbofTurns++; } } } TIMx->DIER |= TIM_IT_Update; /* NB:Std libray not used for perf issue*/ position = (int32_t)(NbofTurns) * (int32_t)(pDParams_str->hPulseNumber) + cnt;
在关闭中断确保NbofTurns处于快照状态,再判断一次读取到的CNT是否溢出,如溢出则做一次修正,确保两个数据都处于快照状态。
相关文章推荐
- POI设置Excel表格的单元格格式及处理大数的科学计数问题
- 处理区间计数问题
- 问题处理
- 在JAVA开发中的中文处理问题及解决办法
- 使用system.web.mail.SMTPmail发送邮件,处理smtp验证问题
- C# 处理XML + XSLT转换中HTML元素的输出问题及解决
- 用正则表达式处理含中文字符串的问题
- 如何处理Oracle数据库中的坏块问题
- 关于webcontrols的TreeView中转义符的处理问题
- JAVA笔记3--如何Request,如何处理中文获取乱码问题
- TrayIcon和几个消息处理函数的问题
- 关于对话框界面上按回车和ESC键退出问题的处理
- PHP中处理截取汉字,出现乱码问题的2个类
- Asp.net中如何处理一个站点不同Web应用通用Session的问题
- 处理VS.NET资源文件过程中产生的问题
- 关于数据库长度限制和.NET中处理正确长度等问题
- BS开发技巧之三: 处理中文文件名附件存到本地时缺省出现乱码问题
- 在winform中处理IE的新开窗口事件的问题
- Asp.net开发心得点滴[动态加载的用户控件使用事件委托,交给页面处理的事件无效问题]
- [导入]如何在SQL Server2000中处理半个汉字的问题(转)