我无法让旋转编码器与 AVR 微控制器正常工作。编码器是机械式的ALPS编码器 http://no.farnell.com/1520815/passives/product.us0?sku=alps-ec12d1524401,我正在使用亚特米加168 http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf.
澄清
我尝试过使用外部中断来监听引脚,但似乎太慢了。当引脚 A 变高时,中断程序启动,然后检查引脚 B 是否为高电平。这个想法是,如果引脚 B 在引脚 A 变高时也处于高电平,那么它会逆时针旋转。如果引脚 B 为低电平,则它顺时针旋转。但似乎 AVR 检查引脚 B 的时间太长,所以它总是读为高。
我还尝试创建一个程序,该程序会一直阻塞,直到引脚 B 或引脚 A 发生变化。但可能是编码器旋转时噪音太大,因为这也不起作用。我的最后一次尝试是使用一个计时器,将最后 8 个值存储在缓冲区中,并检查它是否从低到高。这也不起作用。
我尝试过确定编码器的范围,从第一个 Pin 更改到其他 Pin 更改似乎需要 2 到 4 毫秒。
我有一个关于旋转编码器及其使用方法 http://www.ubasics.com/adam/electronics/doc/rotryenc.shtml,您可能会发现这很有用。
不幸的是,如果没有更多信息,我无法解决您的特定问题。
哪些微控制器引脚连接到编码器,您当前用于解码脉冲的代码是什么?
好吧,您正在处理一些不同的问题,第一个问题是这是一个机械编码器,因此您必须处理开关噪音(弹跳、颤动)。这数据表 http://www.farnell.com/datasheets/103465.pdf表示部件最多可能需要 3 毫秒才能停止弹跳并创建错误输出。
您需要创建一个去抖例程。其中最简单的是不断检查 A 是否变高。如果是,则启动计时器并在 3 毫秒后再次检查。如果它仍然很高,那么您可以检查 B - 如果它不高,那么您忽略杂散脉冲并继续寻找 A 高点。当您检查 B 时,您会查看它,启动 3 毫秒的计时器,然后再次查看 B。如果两次都相同,那么您可以使用该值 - 如果它在 3 毫秒内发生变化,那么您必须再次执行此操作(读取 B,等待 3 毫秒,然后再次读取它并查看是否匹配)。
atmega 的速度足够快,您不必担心这些检查速度缓慢,除非您的时钟速度也很慢。
一旦你处理了机械噪音,那么你想要查看一个正确的格雷码例程 - 你所遵循的算法将不起作用,除非你在 B 变低时 A 为高时也递减。通常,人们存储两个输入的最后一个值,然后将其与两个输入的新值进行比较,并使用一个小函数基于此进行递增或递减。 (查看我上面提到的表格网站上的“高分辨率阅读”标题)。我将两个读数组合成一个四位数字,并使用一个简单的数组来告诉我是递增还是递减计数器,但也有更先进的解决方案,并且针对代码大小、速度或代码维护的简易性进行了优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)