gpt4 book ai didi

microcontroller - 使用带有 AVR 微 Controller 的旋转编码器

转载 作者:行者123 更新时间:2023-12-04 07:08:26 25 4
gpt4 key购买 nike

我在让旋转编码器与 AVR 微 Controller 一起正常工作时遇到问题。编码器为机械式 ALPS encoder ,我正在使用 Atmega168 .

澄清

我曾尝试使用外部中断来收听引脚,但它似乎太慢了。当引脚 A 变为高电平时,中断程序开始,然后检查引脚 B 是否为高电平。这个想法是,如果引脚 B 在引脚 A 变高的那一刻变高,那么它就会逆时针旋转。如果引脚 B 为低电平,则它顺时针旋转。但似乎 AVR 需要很长时间来检查引脚 B,所以它总是读为高。

我还尝试创建一个程序,该程序在 Pin B 或 Pin A 更改之前会一直阻塞。但也可能是编码器旋转时噪音太大,因为这也不起作用。我的最后一次尝试是让一个计时器将最后 8 个值存储在缓冲区中并检查它是否从低到高。这也不起作用。

我曾尝试确定编码器的范围,从第一个 Pin 更改到另一个 Pin 更改,它似乎使用了 2 到 4 毫秒。

最佳答案

我有一个关于 rotary encoders and how to use them 的网页,您可能会发现它很有用。

不幸的是,如果没有更多信息,我无法解决您的特定问题。

哪些微 Controller 引脚连接到编码器,您目前用于解码脉冲的代码是什么?

好的,您正在处理几个不同的问题,第一个问题是这是一个机械编码器,因此您必须处理开关噪声(弹跳、颤动)。 data sheet表示部件可能需要长达 3 毫秒才能停止弹跳并产生错误输出。

您需要创建一个去抖动例程。其中最简单的是不断检查 A 是否变高。如果是,请启动计时器并在 3 毫秒内再次检查。如果它仍然很高,那么你可以检查 B - 如果它不高,那么你忽略虚假脉冲并继续寻找 A 高。当你检查B时,你看看它,启动一个3ms的计时器,然后再看看B。如果两次都相同,那么您可以使用该值 - 如果它在 3 毫秒内发生变化,那么您必须再次执行(读取 B,等待 3 毫秒,然后再次读取并查看是否匹配)。

atmega 足够快,您不必担心这些检查进行得很慢,除非您的时钟速度也很慢。

一旦你处理了机械噪声,那么你就想看看一个合适的格雷码例程——你所遵循的算法将无法工作,除非当 B 变低时,如果 A 变高,你也会递减。通常人们存储两个输入的最后一个值,然后将其与两个输入的新值进行比较,并在此基础上使用一个小函数进行递增或递减。 (查看我上面提到的表格网站上的“高分辨率阅读”标题)。我将两个读数组合成一个四位数字,并使用一个简单的数组来告诉我是递增还是递减计数器,但还有更先进的解决方案,并针对代码大小、速度或代码维护的简易性进行了优化。

关于microcontroller - 使用带有 AVR 微 Controller 的旋转编码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com