在本教程中,我们将学习旋转编码器的工作原理!旋转编码器(也是轴编码器)是一种拨入位置或确定轴位置的奇妙方式。这可能是您正在转动的旋钮的位置,也可能是连接到步进电机的编码器,以便您确定它当前所在的位置。旋转编码器通常用于电子项目(因此Arduino项目).

旋转编码器概述

其最基本描述的旋转编码器是电力装置,其将轴(或轴)的角位置和/或运动转换为模拟或数字输出信号。

这确实是很多技术术语,我们将打破三个简单的概念。旋转编码器允许您的项目确定有关轴或轴的三个特定事项:

  • 它的位置,特别是它的角度位置
  • 方向是转向(即顺时针,顺时针逆时针)
  • 转向的速度(速度)(或者它是静止的)

让我们把它们一一分解,以便更好地理解它们。

角度位置

当物体围绕诸如轴或轴的轴旋转时,对象的每个点遵循圆弧。

角度位置

方向

可以捕获轴转动的方向,轴向转动,可以捕获顺时针或逆时针方向。

旅行方向

速度

最后,除了位置和方向,我们还可以确定轴转动的速度。

速度

此项目的零件清单

这是这个项目的一个方便的零件列表,让您开始:

旋转编码器的工作原理

因此,让我们继续前进并学习旋转编码器如何工作,或它们如何捕获位置,方向和速度数据。它非常简单,并同时完全迷人。

绝对与增量旋转编码器

电子项目中最常见的旋转编码器有两种一般类型的旋转编码器。他们是绝对增量的旋转编码器。

  • 完全的- 绝对旋转编码器,当施加电源时,始终已知当前位置。制造更昂贵。
  • 增加的- 最常见的是增量旋转编码器。这些编码器始终处于四个电位中的一个,因此需要校准或归位操作来确定其起始位置。或者在许多项目的情况下,当电源施加电源时,简单地假设零位置(您将在替换示例中看到此方法)。他们立即报告速度和方向,但不要跟踪绝对位置。

随着增量旋转编码器是最常见的类型,我们将坚持使用本教程中的那些,但我们希望您意识到还有另一种类型。

旋转编码器机电建筑

在旋转编码器内部是包含围绕其最外部区域的几个电焊盘的盘。这些焊盘的数量将因编码器和品牌而异,但最终确定它的准确性。在这些焊盘上方有两个触点放置特定的距离。这些联系人是时钟和数据线。

旋转编码器的构造

当旋转编码器的轴时,电带焊盘将与时钟和数据线触点进行电气连接和电连接。这将创建电子或微控制器的两个电气脉冲列表(即Arduino,或 覆盆子PI.)正在倾听。

由于时钟和数据线触点的位置,时钟或数据线将首先与其中一个电垫接触。如果轴顺时针转动,数据线将首先接触。如果轴逆时针转动,时钟线将首先接触。旋转编码器就是这样工作的貂的旅行方向!

旋转编码器的构造

同样,如果脉冲反向,相位将在相反方向上偏离90度。由此,我们可以确定轴现在的旋转方向与上次已知的位置相反。

旋转编码器旅行方向

如果将旋转编码器的时钟和数据线连接到示波器探针并转动编码器的轴,您实际上可以看到此相位差异!您需要两个频道范围(大多数)。您需要做的就是分别将旋转编码器的VCC和GND连接到+5伏特和地面。将DT连接到通道1,CLK到通道2.将范围的接地引线连接到与旋转编码器相同的地面。

有关的:振动镜如何工作

您可以在示波器上看到旋转编码器的输出:

旋转编码器的示波器视图

最后,使用上面的相同原理,您的微控制器可以花时间为时钟和/或数据线传递到下一个焊盘所需的时间。从这它可以确定旋转编码器转向的简单速度!

旋转编码器的速度和速度

使用旋转编码器计数数字

当我们继续学习旋转编码器的工作原理,让我们看一下我们可以在我们项目中使用的真实世界示例。在此示例中,我们将使用编码器递增和减少LCD屏幕上的数字!顺时针转动编码器将增加数量,同时逆时针转动它会递减数量。

接线旋转编码器和液晶显示器

按照这个Fritzing样式图将您的旋转编码器模块连接到Arduino Uno。虽然并非完全必要,但我建议在您的项目中添加两个1µF电容器。连接到CLK和DT线路。这将有助于消除一些便宜的旋转编码器。

旋转编码器接线图Firtzing 旋转编码器计数器的代码

将以下草图流入您的Arduino IDE并将其上传到您的Arduino UNO。

#包括&;书信电报;liquidcystal.h&;燃气轮机//包括默认的Arduino LCD库//编码器CLK和DT引脚int EncoderCLK=10;int EncoderDT=9;//计数器变量int先前的_输出;int编码器_计数;//设置LCD引脚常数int rs=12;常数int en=11;常数int d4=5;常数int d5=4;常数int d6=3;常数int d7=2;液晶显示器(rs、en、d4、d5、d6、d7);void setup(){lcd.begin(16,2);//初始化16*2 lcd.print(“极客酒吧”);//介绍消息行1 lcd.setCursor(0,1);lcd.print(“ROTORAY编码器”);//介绍消息行2//开始前等待2秒并清除介绍消息延迟(2000);lcd.clear();//pin模式声明pinMode(encorck,INPUT);pinMode(EncoderDT,INPUT);Previousmanbext登录页_Output=digitalRead(EncoderCLK);//读取CLK行的初始值}void loop(){if(digitalRead(EncoderCLK)!=Previous_Output{if(digitalRead(EncoderDT)!=Previous_Output{Encoder_Count++;lcd.clear();lcd.print(Encoder_Count);lcd.setCursor(0,1);lcd.print(“顺时针”)}否则{Encoder_Count--lcd.clear();lcd.print(编码器计数);lcd.setCursor(0,1);lcd.print(“逆时针”);}}上一次的输出=数字读取(编码器计数);}

使用LCD屏幕完成旋转编码器

项目完成后,您现在可以在LCD显示屏上数数了!顺时针和逆时针转动旋转编码器应向上或向下计数!现在你知道旋转编码器是如何工作的了!

已完成的旋转编码器项目

Debouncing Rotary编码器

有时,特别是用更便宜的旋转编码器,此代码和布线样式将导致编码器“反弹”。这是与瞬间按钮开关找到的相同类型的弹跳问题。如果您体验到跳过数量的柜台,例如跳过5直到8,例如,你有一个反弹问题。

如果您遇到过,尝试的第一件事就是使用连接到CLK和DT线(以及接地)的1μF电容。这对我有大约90%的时间为我工作。如果这不起作用,您将希望在代码中调查脱离,这是缺乏本教程的范围。我们希望将来能够做一个脱节的教程,并将从这里联系起来。

另一种选择可能是只需购买更高质量的编码器。