旋转编码器(Rotary Encoder),也称为轴编码器,是一种将旋转的机械位移量转换为电气信号的传感器。这些电气信号经过处理后,可以用于检测位置、速度等参数。旋转编码器广泛应用于工业控制、机器人技术、精密测量、自动化设备以及计算机输入设备等领域。作为一种集光机电技术于一体的速度位移传感器,旋转编码器具有高精度、高分辨率、长寿命和稳定可靠等优点。
旋转编码器的工作原理主要基于光电转换或磁电转换技术。以光电式旋转编码器为例,其工作原理简述如下:
旋转编码器作为一种高精度、高可靠性的传感器,具有以下显著特点:
旋转编码器因其高精度、高分辨率和稳定可靠的性能特点,在多个领域得到了广泛应用:
旋转编码器根据其工作原理和输出信号的特点,可以大致分为以下几类:
随着工业自动化、智能制造和物联网技术的快速发展,旋转编码器作为重要的传感器元件,也在不断地发展和创新。未来,旋转编码器的发展趋势可能包括以下几个方面:
总之,旋转编码器作为工业自动化和精密测量领域中的重要传感器元件,其性能和应用范围将随着技术的不断进步而不断拓展。未来,旋转编码器将在更多领域发挥重要作用,为智能制造和物联网技术的发展提供有力支持。
旋转编码器可用于计数操作,它将旋转角度转换为计数数字信号,可以无限制地旋转360°并给出脉冲输出。本文将提供基本的 Arduino 旋转编码器接口细节以及传统旋转编码器的操作。
旋转编码器
该旋转编码器分线板有五个引脚,
当轴顺时针旋转时,编码器引脚 A 处生成与编码器引脚 B 90° 异相的输出脉冲。
顺便说一句,当轴逆时针旋转时,编码器输出引脚 A 和 B 处生成的输出会反转。
旋转编码器Arduino接口
将旋转编码器的电源引脚连接到Arduino板,+连接到5V,Gnd连接到Gnd。然后将 CLK(编码器输出 A)引脚连接到 Arduino 数字引脚 D2,将 DT(编码器输出 B)引脚连接到数字引脚 D1。完成连接后,上传以下草图以获取串行监视器中旋转编码器的角度和位置。
旋转编码器的 Arduino 代码
#define encoderOutA 2 // CLK pin of Rotary Enocoder
#define encoderOutB 1 // DT pin of Rotary Enocoder
int counter = 0;
int presentState;
int previousState;
void setup() {
pinMode (encoderOutA,INPUT);
pinMode (encoderOutB,INPUT);
Serial.begin (9600);
previousState = digitalRead(encoderOutA); // Get current state of the encoderOutA
}
void loop() {
presentState = digitalRead(encoderOutA);
if (presentState != previousState)
{
if (digitalRead(encoderOutB) != presentState)
{
counter ++;
}
else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
previousState = presentState; // Replace previous state of the encoderOutA with the current state
}
在Arduino代码中,首先定义输出引脚并将计数初始化为0,然后声明当前和先前的状态变量。通过使用“IF”条件循环,获取旋转编码器的当前状态并与之前的状态进行比较。如果没有变化,则计数保持不变,否则,顺时针旋转时计数值增加,逆时针旋转时计数值减少。
为了确定旋转轴的角位置,使用了称为旋转编码器的传感器。因此,传感器根据旋转产生电信号。该传感器在包装、纺织、印刷、机器人等不同行业有着广泛的应用。因此,在本文中,我们将连接“旋转编码器与 Arduino UNO”。旋转编码器是电位计的现代化数字等效物,但它们的适应性更强。
该模块包括一个圆盘,该圆盘具有连接到公共引脚 C 的等距接触区域,以及另外两个接触引脚 A 和 B。
这个特殊的模块位于一个带有五个引脚的分线板上,我们将在本次 Arduino 演示中使用它。第一个是输出 A 引脚,第二个是输出 B 引脚,第三个是 Button 引脚,最后两个引脚是 VCC 和 GND 引脚。
当圆盘开始逐步旋转时,引脚A和B将与公共引脚接触,从而产生两个方波输出信号。如果我们只计算信号的脉冲,我们就可以使用两个输出中的任何一个来确定旋转位置。然而,如果我们希望确定旋转方向,则必须同时分析两个信号。
两个输出信号始终彼此相差 90 度。如果编码器顺时针旋转,输出 A 将领先于输出 B。
旋转电位器和编码器之间最明显的区别是,编码器可以沿任一方向连续旋转,而电位器只能顺时针或逆时针旋转一定的量,然后必须停止。
因此,当您需要知道旋钮的确切位置时,电位器是最佳选择。另一方面,旋转编码器适用于您只需要知道位置变化而不是确切位置的情况。
// Rotary Encoder Inputs
#define CLK 2
#define DT 3
#define SW 4
int counter = 0;
int currentStateCLK;
int lastStateCLK;
String currentDir ="";
unsigned long lastButtonPress = 0;
void setup() {
// Set encoder pins as inputs
pinMode(CLK,INPUT);
pinMode(DT,INPUT);
pinMode(SW, INPUT_PULLUP);
// Setup Serial Monitor
Serial.begin(9600);
// Read the initial state of CLK
lastStateCLK = digitalRead(CLK);
}
void loop() {
// Read the current state of CLK
currentStateCLK = digitalRead(CLK);
// If last and current state of CLK are different, then pulse occurred
// React to only 1 state change to avoid double count
if (currentStateCLK != lastStateCLK && currentStateCLK == 1){
// If the DT state is different than the CLK state then
// the encoder is rotating CCW so decrement
if (digitalRead(DT) != currentStateCLK) {
counter --;
currentDir ="CCW";
} else {
// Encoder is rotating CW so increment
counter ++;
currentDir ="CW";
}
Serial.print("Direction: ");
Serial.print(currentDir);
Serial.print(" | Counter: ");
Serial.println(counter);
}
// Remember last CLK state
lastStateCLK = currentStateCLK;
// Read the button state
int btnState = digitalRead(SW);
//If we detect LOW signal, button is pressed
if (btnState == LOW) {
//if 50ms have passed since last LOW pulse, it means that the
//button has been pressed, released and pressed again
if (millis() - lastButtonPress > 50) {
Serial.println("Button pressed!");
}
// Remember last button press event
lastButtonPress = millis();
}
// Put in a slight delay to help debounce the reading
delay(1);
}
要了解Arduino UNO的旋转编码器,请根据电路图连接电路或按照连接表进行连接。然后在Arduino IDE中编写上面给出的代码,并将其上传到ARDUINO UNO中。 Arduino 处理代码并控制编码器的输出。因此,您将根据您的代码观察旋转编码器的旋转。
全部0条评论
快来发表一下你的评论吧 !