简介

旋转编码器是可以测量机械旋转的电子设备。它们可以以两种方式使用——作为控制装置或作为测量轴旋转的装置。

当用作控制时,旋转编码器可以比电位器更通用。当你需要非常精确的控制时,它们可以使用,而且它们不受温度的影响。

作为一种测量机械旋转的装置,旋转编码器有多种用途。其中之一是测量直流齿轮马达的旋转。

今天我们将看看这两种类型的旋转编码器。我将向你们展示如何将它们连接到Arduino上,我会给你们一些演示草图,你们可以自己运行。

让我们开始吧!

旋转编码器

旋转编码器,也可称为轴编码器,是一种机电设备,可以将轴的角度位置(旋转)转换为模拟或数字输出信号。我们今天的重点是数字设备。

有两种主要类型的旋转编码器:绝对和增量。不同的是,绝对编码器给出轴的精确位置,以度为单位,而增量编码器报告轴移动了多少增量,但不报告其实际位置。

 旋转编码器被用于许多不同的应用,包括工业控制,机器人,光学机械鼠标和轨迹球,数控机床和打印机。

旋转编码器的操作

有几种不同类型的旋转编码器。我将讨论限制在更简单的“增量”编码器上。这些有时被称为正交或相对旋转编码器。

这些编码器有两个传感器,输出两组脉冲。传感器可以是磁(霍尔效应)或光(LED或激光),当编码器轴旋转时产生脉冲。

由于有两个传感器在两个不同的位置,它们都会产生相同的脉冲,然而,它们会失相,因为一个传感器会先于另一个传感器脉冲。哪个传感器先走是由旋转的方向决定的。

 在上面的例子中,编码器轴是顺时针旋转。顶部的传感器在底部的传感器之前被触发,所以顶部的脉冲组先于底部的脉冲组。

 如果编码器轴逆时针旋转,那么底部的脉冲将在顶部的脉冲之前发送。

在这两种情况下,可以通过计数脉冲来确定轴旋转了多少。通过检查哪个脉冲先来,我们可以确定旋转的方向。

控制编码器

我们将要使用的控制编码器是一个非常常见的设备,它可以很容易在网上获得。

控制编码器引出线
控制编码器引出线

编码器的安装完全像电位器,它有一个可以作为按钮的旋转轴。制编码器的引脚如下:

  • GND-接地。
  • +V—VCC或正电源电压,通常为3.3伏或5伏。
  • SW -按钮开关输出。当轴被压下时,它输出低电平。
  • DT -输出A连接。
  • CLK -输出B连接。

我将向你展示如何使用这个控制编码器,但首先,让我们看看另一个旋转编码器。

电机编码器

电机编码器安装在直流电机的轴上,可以计算电机轴的移动量。加上一个电机驱动器,这将允许你创建一个反馈机制,允许你指定转数。

你也可以使用这些编码器计来测量轴旋转的转动速度。

电机编码器引出线

我在这里展示的是一个连接齿轮电机的编码器。其他电机编码器应该有类似的连接。连线非常简单:

  • VCC - 5伏电源输入。
  • GND -接地。
  • CH A -输出A。
  • CH B -输出B。

我们很快就会看到如何使用Arduino来测量电机转速。

读取编码器

我们将开始我们的旋转编码器实验使用控制编码器。

用Arduino读取控制编码器实际上是相当直接的。我们只需要读取输入脉冲并计算它们。我们还需要确定哪组脉冲首先出现,这样我们就可以确定旋转的方向。

Arduino控制编码器测试连接

这里是我们将如何钩起我们的第一个旋转编码器实验。

你会注意到,除了旋转编码器,我还添加了一对LED。这些将表明方向,我们正在旋转编码器轴。

两个led的下降电阻是150到470欧姆,在插图中我显示220欧姆的电阻。

顺便说一句,Arduino上使用的引脚都不是关键的。你可以改变它们。

Arduino控制编码器测试草图

现在你已经把编码器和led连接好了,你需要一个代买来让它工作。

  Rotary Encoder Demo
  rot-encode-demo.ino
  Demonstrates operation of Rotary Encoder
  Displays results on Serial Monitor
  DroneBot Workshop 2019
  https://dronebotworkshop.com
*/
 
 // Rotary Encoder Inputs
 #define inputCLK 4
 #define inputDT 5
 
 // LED Outputs
 #define ledCW 8
 #define ledCCW 9
 
 int counter = 0; 
 int currentStateCLK;
 int previousStateCLK; 
 
 String encdir ="";
 
 void setup() { 
   
   // Set encoder pins as inputs  
   pinMode (inputCLK,INPUT);
   pinMode (inputDT,INPUT);
   
   // Set LED pins as outputs
   pinMode (ledCW,OUTPUT);
   pinMode (ledCCW,OUTPUT);
   
   // Setup Serial Monitor
   Serial.begin (9600);
   
   // Read the initial state of inputCLK
   // Assign to previousStateCLK variable
   previousStateCLK = digitalRead(inputCLK);
 
 } 
 
 void loop() { 
  
  // Read the current state of inputCLK
   currentStateCLK = digitalRead(inputCLK);
    
   // If the previous and the current state of the inputCLK are different then a pulse has occured
   if (currentStateCLK != previousStateCLK){ 
       
     // If the inputDT state is different than the inputCLK state then 
     // the encoder is rotating counterclockwise
     if (digitalRead(inputDT) != currentStateCLK) { 
       counter --;
       encdir ="CCW";
       digitalWrite(ledCW, LOW);
       digitalWrite(ledCCW, HIGH);
       
     } else {
       // Encoder is rotating clockwise
       counter ++;
       encdir ="CW";
       digitalWrite(ledCW, HIGH);
       digitalWrite(ledCCW, LOW);
       
     }
     Serial.print("Direction: ");
     Serial.print(encdir);
     Serial.print(" -- Value: ");
     Serial.println(counter);
   } 
   // Update previousStateCLK with the current state
   previousStateCLK = currentStateCLK; 
 }

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐