检测正交光电编码器时计数有误差
本帖最后由 lcl4518 于 2014-9-23 17:44 编辑我把400线的光电编码器直接接入单片机的两个中断口P3.2和P3.3,在计数时发现不准确,当数值为0时我左右旋转编码器一定距离后数值总是不能回到原点,不是增加就是减少,下边是我再中断里简单写的程序。请问坛子里的高手有没有成功的案例或去抖程序分享一下呢?谢谢!感激不尽!!
两个中断都是下降沿触发
void InterruptA()interrupt 0
{
if(BMQ_B==1)
{
DIR=1;
}
else
if(BMQ_B==0)
{
DIR=2;
}
}
void InterruptB()interrupt 2
{
if(DIR==1&&BMQ_A==0)
{
LCMStruct.InterruptCount++;
DIR=0;
}
if(DIR==2&&BMQ_A==1)
{
LCMStruct.InterruptCount--;
DIR=0;
}
} 有一种操作叫做搜索 编码器应该不会有明显的不准吧 STM32有码盘配置好直接可用{:lol:} xyx2012xyx 发表于 2014-9-23 18:14 编码器应该不会有明显的不准吧
stm32f1的io性能太弱,漏了呗。 用外部中断捕捉。是不是脉冲频率过高了。 oner 发表于 2014-9-23 20:29
用外部中断捕捉。是不是脉冲频率过高了。
频率不高,这方波最短间隙都毫秒级的,片机能正常捕捉到并计数,倒是像最后一张图片红框圈起来的波形现在没找到好方法识别过滤掉,按照坛子里的例子建立A.B正反转的01数组再取值比较,在最后圈起来的图中还是会出错的 江南雨絮 发表于 2014-9-23 19:08
STM32有码盘配置好直接可用
用这个应该也是可以实现的 http://www.amobbs.com/forum.php?mod=viewthread&tid=5591112&highlight=%E7%BC%96%E7%A0%81%E5%99%A8 本帖最后由 NJ8888 于 2014-9-24 13:20 编辑
运动码盘停下来期间会有过冲振荡(不叫抖动),但是计数器能自动加减补偿啊,所以最后就是1个字的偏差,合格的正交码盘产生的抖动对计数没有影响 手旋转可能会产生抖动,在IO上加个RC 滤一下。 wye11083 发表于 2014-9-23 20:02
stm32f1的io性能太弱,漏了呗。
这跟STM32有关系么。 频率过高漏了脉冲 xiaobendan 发表于 2014-9-24 13:08
http://www.amobbs.com/forum.php?mod=viewthread&tid=5591112&highlight=%E7%BC%96%E7%A0%81%E5%99%A8
谢谢发的连接!发帖前试验过这个例子,发现用这样的例子在圈起来的脉冲中还是会误计数的,圈起来的部分就是光栅盘左右晃动了几下其实并没有移动,用这个程序是不能过滤掉的 NJ8888 发表于 2014-9-24 13:17
运动码盘停下来期间会有过冲振荡(不叫抖动),但是计数器能自动加减补偿啊,所以最后就是1个字的偏差,合格的正 ...
这是我再编码器与单片机接口处捕捉到的波形,像这样的震动现象是属于编码器质量问题吗,还是完全在程序上可以过滤掉的? ericw2012 发表于 2014-9-24 13:37
频率过高漏了脉冲
不属于高频率漏记 lcl4518 发表于 2014-9-24 14:00
这是我再编码器与单片机接口处捕捉到的波形,像这样的震动现象是属于编码器质量问题吗,还是完全在程序上 ...
正常波形,你要闭环控制的话驱动机构会反向伺服补偿的 lcl4518 发表于 2014-9-24 13:58
谢谢发的连接!发帖前试验过这个例子,发现用这样的例子在圈起来的脉冲中还是会误计数的,圈起来的部分就 ...
从你波形上看,信号频率不高,但是你多久读一次数据?
那个链接里面的方法,包括我回帖说的数组的实现,理论上是不会产生误差的,除非你读数据的间隔很大,中间漏掉了一些信号的变化 参考---光电编码器输出脉冲的几种计数方法
页:
[1]