带Arduino的旋转编码器设计 旋转编码器的工作原理和特点

描述

一、旋转编码器概述

旋转编码器(Rotary Encoder),也称为轴编码器,是一种将旋转的机械位移量转换为电气信号的传感器。这些电气信号经过处理后,可以用于检测位置、速度等参数。旋转编码器广泛应用于工业控制、机器人技术、精密测量、自动化设备以及计算机输入设备等领域。作为一种集光机电技术于一体的速度位移传感器,旋转编码器具有高精度、高分辨率、长寿命和稳定可靠等优点。

二、旋转编码器的工作原理

旋转编码器的工作原理主要基于光电转换或磁电转换技术。以光电式旋转编码器为例,其工作原理简述如下:

  1. 光电转换过程
    • 旋转编码器的核心部件包括一个光栅盘(或称为码盘)、发光元件(如LED)和接收元件(如光敏二极管或光敏三极管)。
    • 当旋转编码器的轴带动光栅盘旋转时,发光元件发出的光被光栅盘上的狭缝切割成断续光线。这些断续光线随后被接收元件接收,并转换为初始的电信号。
  2. 信号处理
    • 接收到的初始电信号经过后续电路的处理,如放大、整形等,最终输出为脉冲信号或代码信号。这些信号可以直接被控制系统读取和处理。
  3. 方向判断与计数
    • 对于增量式旋转编码器,通常会有A、B两相输出信号,且两相信号之间存在90度的相位差。通过检测A、B两相信号的相位关系,可以判断旋转编码器的旋转方向。
    • 同时,通过计数A相或B相信号的脉冲数量,可以计算出旋转编码器的旋转角度或位移量。
  4. 零位脉冲
    • 部分旋转编码器还会提供一个Z相信号作为零位脉冲。每当旋转编码器旋转一圈时,Z相信号会输出一个脉冲,用于校准或作为参考零位。 # 三、旋转编码器的特点

旋转编码器作为一种高精度、高可靠性的传感器,具有以下显著特点:

  1. 高精度与高分辨率
    • 旋转编码器能够精确地将旋转的机械位移量转换为电气信号,具有较高的测量精度和分辨率。例如,光学式增量型编码器可以有较高的单圈脉冲数,如2500到10000个脉冲,从而实现对旋转角度或位移量的精细测量。
  2. 长寿命与稳定性
    • 旋转编码器采用无触点的光电或磁电转换技术,避免了传统机械接触式传感器因磨损而导致的性能下降问题。因此,旋转编码器具有较长的使用寿命和稳定的性能表现。
  3. 多功能性
    • 旋转编码器不仅可以测量旋转角度或位移量,还可以根据输出信号的频率计算出旋转速度。此外,通过配合其他传感器或控制系统,还可以实现更复杂的功能和自动化控制。
  4. 适应性强
    • 旋转编码器具有多种类型和规格可供选择,如增量式、绝对值式、单路输出、双路输出等。这些不同类型的旋转编码器可以适应不同的应用场景和测量需求。
  5. 易于安装与维护
    • 旋转编码器体积小、重量轻、结构紧凑,易于安装在各种机械设备上。同时,由于其无触点的设计特点,使得旋转编码器的维护成本相对较低。
  6. 抗干扰能力强
    • 旋转编码器采用光电或磁电转换技术,信号传输过程中不易受到外界电磁干扰的影响。因此,旋转编码器在恶劣的工业环境中也能保持稳定的性能表现。

四、旋转编码器的应用领域

旋转编码器因其高精度、高分辨率和稳定可靠的性能特点,在多个领域得到了广泛应用:

  1. 工业自动化
    • 在工业自动化生产线中,旋转编码器常被用于测量和控制机械部件的旋转角度、位移量和速度等参数。通过与PLC、伺服电机等设备的配合使用,可以实现自动化控制和精确测量。
  2. 机器人技术
    • 在机器人技术中,旋转编码器被广泛应用于关节角度的测量和控制。通过精确测量机器人关节的旋转角度和速度,可以实现对机器人姿态和运动轨迹的精确控制。
  3. 精密测量
    • 在精密测量领域,如光学仪器、精密机床等场合中,旋转编码器常被用于测量微小的旋转角度或位移量。其高精度和高分辨率的特点使得测量结果更加准确可靠。
  4. 计算机输入设备
    • 在计算机输入设备中,如鼠标和轨迹球等装置中,也常采用旋转编码器来检测用户的旋转操作。通过测量旋转编码器的旋转角度和速度等参数,可以实现对光标位置的精确控制。

五、旋转编码器的分类

旋转编码器根据其工作原理和输出信号的特点,可以大致分为以下几类:

  1. 增量式旋转编码器
    • 增量式旋转编码器是最常见的一种类型。它输出的是与旋转角度增量成正比的脉冲信号。通过检测A、B两相的脉冲数量和相位差,可以确定旋转的方向和角度。增量式编码器结构简单,成本较低,但每次上电或复位后,需要借助外部设备或算法来确定起始位置。
  2. 绝对值式旋转编码器
    • 绝对值式旋转编码器在旋转过程中,每个角度位置都对应一个唯一的编码值。即使断电或重启,也能直接读取当前的角度位置,无需重新校准。这种编码器通常使用二进制、格雷码或BCD码等方式进行编码,具有较高的抗干扰能力和可靠性。
  3. 混合式旋转编码器
    • 混合式旋转编码器结合了增量式和绝对值式的特点。它既能提供增量式的脉冲信号,又能通过内部寄存器或外部接口输出当前的绝对位置值。这种编码器在需要同时满足高精度和快速定位的应用场合中非常有用。
  4. 单圈与多圈旋转编码器
    • 单圈旋转编码器只能测量一圈内的旋转角度或位移量。而多圈旋转编码器则能够记录并输出多圈旋转的累积值,适用于需要大范围旋转测量的场合。

六、旋转编码器的选型与应用注意事项

  1. 精度与分辨率
    • 根据应用需求选择合适的精度和分辨率。精度要求高的场合应选择高分辨率的编码器。
  2. 输出信号类型
    • 根据控制系统或处理电路的兼容性,选择合适的输出信号类型(如TTL、HTL、RS-422等)。
  3. 工作环境
    • 考虑工作环境中的温度、湿度、振动、电磁干扰等因素,选择适合该环境的编码器。
  4. 安装方式
    • 根据机械设备的结构和空间限制,选择合适的安装方式(如轴向安装、径向安装等)。
  5. 防护等级
    • 根据应用场合的防尘、防水需求,选择具有相应防护等级的编码器。
  6. 成本考虑
    • 在满足性能要求的前提下,综合考虑编码器的成本,选择性价比高的产品。

七、旋转编码器的发展趋势

随着工业自动化、智能制造和物联网技术的快速发展,旋转编码器作为重要的传感器元件,也在不断地发展和创新。未来,旋转编码器的发展趋势可能包括以下几个方面:

  1. 更高精度与更高分辨率
    • 随着精密制造技术的进步,旋转编码器的精度和分辨率将得到进一步提升,以满足更高精度的测量需求。
  2. 智能化与网络化
    • 将智能芯片和网络通信技术融入旋转编码器,实现数据的远程传输、实时监测和智能分析,提高系统的自动化水平和智能化程度。
  3. 小型化与集成化
    • 随着电子元器件的小型化和集成化趋势,旋转编码器也将朝着更小的体积和更高的集成度方向发展,以适应更紧凑的机械设备空间。
  4. 多功能化与定制化
    • 根据不同应用场合的特定需求,开发具有多种功能和定制化特性的旋转编码器,以满足用户的个性化需求。
  5. 环保与可持续发展
    • 注重旋转编码器的环保性能和可持续发展能力,采用环保材料和节能设计,降低产品的生命周期成本和环境影响。

总之,旋转编码器作为工业自动化和精密测量领域中的重要传感器元件,其性能和应用范围将随着技术的不断进步而不断拓展。未来,旋转编码器将在更多领域发挥重要作用,为智能制造和物联网技术的发展提供有力支持。

八、带 Arduino 的旋转编码器设计

1、带 Arduino 的旋转编码器设计(一)

旋转编码器可用于计数操作,它将旋转角度转换为计数数字信号,可以无限制地旋转360°并给出脉冲输出。本文将提供基本的 Arduino 旋转编码器接口细节以及传统旋转编码器的操作。

旋转编码器

旋转编码器

该旋转编码器分线板有五个引脚,

  • GND → 接地电源
    • → +5V 电源
  • SW → 按钮开关
  • DT → 编码器引脚 B
  • CLK → 编码器引脚 A

当轴顺时针旋转时,编码器引脚 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”条件循环,获取旋转编码器的当前状态并与之前的状态进行比较。如果没有变化,则计数保持不变,否则,顺时针旋转时计数值增加,逆时针旋转时计数值减少。

2、带 Arduino 的旋转编码器设计(二)

介绍

为了确定旋转轴的角位置,使用了称为旋转编码器的传感器。因此,传感器根据旋转产生电信号。该传感器在包装、纺织、印刷、机器人等不同行业有着广泛的应用。因此,在本文中,我们将连接“旋转编码器与 Arduino UNO”。旋转编码器是电位计的现代化数字等效物,但它们的适应性更强。

概述

硬件概述

该模块包括一个圆盘,该圆盘具有连接到公共引脚 C 的等距接触区域,以及另外两个接触引脚 A 和 B。

这个特殊的模块位于一个带有五个引脚的分线板上,我们将在本次 Arduino 演示中使用它。第一个是输出 A 引脚,第二个是输出 B 引脚,第三个是 Button 引脚,最后两个引脚是 VCC 和 GND 引脚。

工作准则

当圆盘开始逐步旋转时,引脚A和B将与公共引脚接触,从而产生两个方波输出信号。如果我们只计算信号的脉冲,我们就可以使用两个输出中的任何一个来确定旋转位置。然而,如果我们希望确定旋转方向,则必须同时分析两个信号。

两个输出信号始终彼此相差 90 度。如果编码器顺时针旋转,输出 A 将领先于输出 B。

旋转编码器和电位器的区别

旋转电位器和编码器之间最明显的区别是,编码器可以沿任一方向连续旋转,而电位器只能顺时针或逆时针旋转一定的量,然后必须停止。

因此,当您需要知道旋钮的确切位置时,电位器是最佳选择。另一方面,旋转编码器适用于您只需要知道位置变化而不是确切位置的情况。

电路原理图

旋转编码器

Arduino代码

// 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 处理代码并控制编码器的输出。因此,您将根据您的代码观察旋转编码器的旋转。

代码说明

  • 首先,定义编码器的引脚,连接到Arduino的不同引脚。例如,CLK引脚连接到Arduino的引脚2,DT连接到引脚3,SW连接到引脚4。然后定义将在代码中使用的不同变量。变量计数器代表旋转电位器旋钮时的计数。变量currentStateCLKlastStateCLK用于保持 CLK 输出的状态。 currentDir 变量已定义为稍后用于在监视器上打印方向。并且,lastButtonPress被定义为消除开关抖动。
  • 在 void 设置中,我们已将编码器的引脚声明为输入。此外,为了从 CLK 引脚读取值,我们提供了digitalRead (CLK ) 函数,并将该读数存储在变量lastStateCLK中。
  • 在 void 循环中,为了从 CLK 引脚读取当前状态,我们再次提供函数 digitalRead (CLK), 并将其存储在currentStateCLK中。然后我们给出if语句,将lastStateCLKcurrentStateCLK进行比较,以确定旋转的状态方向。如果不同,则说明旋钮为逆时针方向。然后我们将电流设置为 CWW。如果相等,则说明旋钮为顺时针方向。然后我们将 currentDir 设置为 CW。之后,我们用当前状态更新lastStateCLK。然后我们读取开关按钮状态并给出 if 函数。并且,根据该函数,如果按钮保持低电平超过 50 毫秒,则会打印Button Pressed在串行监视器上。 ## 应用及用途
  • 在传送带中控制速度和方向。
  • 它可用于在各种电子项目中将大量输入压缩为少量输出。
  • 挤压机、压力机、焊机和不同的自动化金属成型机械。
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分