gpt4 book ai didi

c - 如何读取旋转编码器输入

转载 作者:行者123 更新时间:2023-11-30 14:36:33 25 4
gpt4 key购买 nike

我有一个关于如何读取旋转编码器输入的简单问题。如果我明白this如果图像正确,则每次旋转都会触发引脚 A 上升。然后,您必须检查引脚 B,如果编码器顺时针旋转,则引脚 B 为高电平;如果编码器逆时针旋转,则引脚 B 为低电平。 diagram

我尝试编写自己的代码而不使用任何库,因为我认为这非常简单,但事实证明并非如此。

这是我编写的代码:

#define rotary_A 2
#define rotary_B 3

void setup()
{
pinMode(rotary_A, INPUT);
pinMode(rotary_B, INPUT);

attachInterrupt(digitalPinToInterrupt(rotary_A), rotary_spin, RISING);

Serial.begin(9600);
}

void rotary_spin()
{
if (digitalRead(rotary_B) == HIGH)
Serial.println("+");
else
Serial.println("-");
}

当我顺时针转动它时,我期望得到+,当我逆时针转动它时,我期望得到-。但是,我每回合都会得到多个输出,就像快速连续触发了多个中断一样。例如,当我顺时针旋转编码器时:

-
-
+
+

逆时针:

+
+
-
-
-
-

每次输出都不同,但最后一个字符总是正确的。
我错了什么?是不是这么简单或者有不同类型的编码器?

最佳答案

这个问题意味着每转只能有一次中断。但编码器每转通常会生成多个周期,有些甚至数千个。这可能就是中断似乎比预期发生得更快的原因。

在零延迟中断环境中,代码应该可以工作。但如果在A相引脚变高后对B相引脚采样时间过长,则会失败。如果下一个阶段 A 上升沿发生,而 Serial.println 仍在上一个中断中执行,则可能会发生这种情况。

要查看是否属于这种情况,一个简单的测试是非常非常缓慢地转动编码器。如果这会产生正确的数据,则问题可能是中断延迟。然后可以将 Serial.println 替换为更快的东西,例如发光 LED,以查看是否可以解决延迟问题。

对于实际使用,您需要确保 A 相变高和 B 相采样之间的最坏情况延迟足以满足编码器旋转的最大速率。

最后一点:代码应该能够充分检测方向,但不能用于递增/递减计数器来跟踪位置。这需要每个周期多个中断。

关于c - 如何读取旋转编码器输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988939/

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