Using a rotary encoder with AVR Micro controller我无法让旋转编码器与 AVR 微控制器一起正常工作。编码器是机械式 ALPS 编码器,我使用的是 Atmega168. 澄清 我曾尝试使用外部中断来监听引脚,但它似乎太慢了。当引脚 A 变为高电平时,中断程序开始,然后检查引脚 B 是否为高电平。这个想法是,如果引脚 B 在引脚 A 变高的那一刻变高,那么它就会逆时针旋转。如果引脚 B 为低电平,则它顺时针旋转。但似乎 AVR 需要很长时间来检查 Pin B,所以它总是读为高。 我还尝试创建一个程序,该程序可以在 Pin B 或 Pin A 更改之前简单地阻塞。但也可能是编码器旋转时噪音太大,因为这也不起作用。我的最后一次尝试是让一个计时器将最后 8 个值存储在缓冲区中并检查它是否从低到高。这也不起作用。 我曾尝试确定编码器的范围,从第一个 Pin 更改到另一个 Pin 更改,它似乎使用了 2 到 4 毫秒的时间。 我有一个关于旋转编码器及其使用方法的网页,您可能会觉得有用。 不幸的是,如果没有更多信息,我无法解决您的特定问题。 哪些微控制器引脚连接到编码器,您目前用于解码脉冲的代码是什么? 好的,您正在处理几个不同的问题,第一个问题是这是一个机械编码器,因此您必须处理开关噪声(弹跳、颤动)。数据表表明,部件可能需要长达 3 毫秒才能停止弹跳和产生错误输出。 您需要创建一个去抖动例程。其中最简单的是不断检查 A 是否变高。如果是,请启动计时器并在 3 毫秒内再次检查。如果它仍然很高,那么你可以检查 B - 如果它不高,那么你忽略虚假脉冲并继续寻找 A 高。当你检查B时,你看它,启动一个3ms的计时器,然后再看B。如果两次都相同,那么您可以使用该值 - 如果它在 3 毫秒内发生变化,那么您必须再次执行(读取 B,等待 3 毫秒,然后再次读取并查看是否匹配)。 atmega 足够快,您不必担心这些检查进行得很慢,除非您的时钟速度也很慢。 一旦您处理了机械噪声,您就会想看看一个合适的格雷码例程 - 您遵循的算法将无法工作,除非您在 B 变低时 A 变高时也递减。通常人们存储两个输入的最后一个值,然后将其与两个输入的新值进行比较,并在此基础上使用一个小函数进行递增或递减。 (查看我上面提到的表格网站上的"高分辨率阅读"标题)。我将两个读数组合成一个四位数字,并使用一个简单的数组来告诉我是递增还是递减计数器,但还有更高级的解决方案,并针对代码大小、速度或代码维护的简易性进行了优化。 添加模拟低通滤波器大大改善了信号。使用低通滤波器,AVR 上的代码非常简单。
啊,ASCII 艺术的奇迹 :p 这是 AVR 上的程序。将 A 和 B 连接到 avr 上的输入 PORTB:
除非您非常快速地旋转编码器,否则此代码有效。然后它可能会错过一两步,但这并不重要,因为使用编码器的人不会知道他们已经转动了多少步。 速度应该不是问题。大多数情况下,所有机械开关都需要去抖动程序。如果你想用中断来做到这一点,请在它触发时关闭中断,启动一个计时器,它会在几毫秒后重新打开。将使您的程序免轮询 >:)
你到底有什么问题?我假设您已经能够按照您提供的 Farnell 页面上链接的技术规格将编码器的引脚连接到您的 PIC,那么读取数据有问题吗?你没有从编码器得到任何数据吗?您不知道如何解释您返回的数据吗? |