| 在本篇文章中,您将了解如何使用旋转编码器。首先,您将看到有关旋转编码器的一些信息,然后您将学习如何使用旋转编码器。 
 什么是旋转编码器? 旋转编码器是一种机电设备,可将轴角度的位置转换为数字数据。旋转编码器具有带有一些孔的圆形板和两个通道A和B。通过旋转圆形板,当A和B通道通过孔时,在该通道和公共端之间建立连接。这些中断在输出通道中产生方波。通过计算这些脉冲,我们可以找到旋转量。另一方面,通道A和B具有90度的相位差,因此您还可以根据前面的通道脉冲找到旋转方向。 
  
 编码器可以直接安装在电机轴上,也可以作为模块安装。旋转编码器模块(包括5个引脚)是最常见的旋转编码器。 2个引脚提供编码器电源,SW是模块上的按钮,CLK和DT显示A和B通道。 
 该模块的一些功能包括: ●     无限旋转 ●     20脉冲分辨率 ●     5V供电电压 
  
 如何使用旋转编码器? 要使用旋转编码器,我们应该对通道A和B的脉冲进行计数。为此,我们使用Arduino UNO并制作了三个项目:定位编码器、控制LED灯以及控制直流电机的速度和方向。 
  
 确定旋转编码器轴的位置 将编码器的+连接至5V,GND连接至GND引脚,CLK连接至引脚编号6,DT连接至引脚编号7。 
 您需要知道轴的位置才能使用编码器。轴的位置根据其旋转量而变化。顺时针旋转时,它从0变为无穷大,逆时针旋转则从0变为负无穷大。 
 上传以下代码到Arduino开发板中,然后在串行监视器中查看轴编码器的位置。您可以将此代码用于使用编码器的所有项目。 复制代码/*
Rotary Encoder - get the position
*/
#define encoderOutA 6 // CLK
#define encoderOutB 7 // DT
int counter = 0;
int State;
int old_State;
void setup() {
pinMode (encoderOutA, INPUT);
pinMode (encoderOutB, INPUT);
Serial.begin (9600);
//Read First Position of Channel A
old_State = digitalRead(encoderOutA);
}
void loop() {
State = digitalRead(encoderOutA);
if (State != old_State)
{
if (digitalRead(encoderOutB) != State)
{
counter ++;
}
else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
old_State = State; // the first position was changed
}
要确定编码器位置,我们需要将通道A和B连接到Arduino的输入。 我们在开头读取并保存通道A的初始值。 然后,我们读取通道A的瞬时值,如果通道B的值超前,我们减小计数器。 否则,我们增加计数器。 
 使用轴旋转控制LED灯 电路连接 
  
 代码 复制代码/*
Rotary Encoder - LED Brightness Control
*/
#define encoderOutA 6 // CLK
#define encoderOutB 7 // DT
#define LED 9 // LED , must connect to pwm pin
int brightness = 0;
int State;
int old_State;
void setup() {
pinMode (encoderOutA, INPUT);
pinMode (encoderOutB, INPUT);
pinMode (LED, INPUT);
Serial.begin (9600);
//Read First Position of Channel A
old_State = digitalRead(encoderOutA);
}
void loop() {
State = digitalRead(encoderOutA);
if (State != old_State)
{
if (digitalRead(encoderOutB) != State)
{
brightness ++;
}
else {
brightness --;
}
if (brightness >= 255) brightness = 255;
if (brightness <= 0) brightness = 0;
Serial.print("brightness: ");
Serial.println(brightness);
}
old_State = State; // the first position was changed
analogWrite(LED , brightness);
}
首先,您需要获得轴的位置,然后您可以通过PWM减少或增加LED灯。 由于PWM的值介于0到255之间,因此我们也在代码中将轴位置设置在此范围内。 
 用中断控制直流电机的速度和方向 电路连接 
  
 代码 复制代码/*
  Rotary Encoder - Controlling a DC Motor using L293D Shield
*/
#include <AFMotor.h>
#define CLK 2
#define DT  5
#define SW  3
AF_DCMotor motor(1, MOTOR12_64KHZ);
int motor_dir = 0;
int State;
int old_State, change;
volatile int motor_speed = 0;
volatile boolean buttonState = false;
void setup() {
  Serial.begin(9600);
  pinMode(CLK, INPUT);
  pinMode(DT, INPUT);
  pinMode(SW, INPUT_PULLUP);
  old_State = digitalRead(CLK);
  attachInterrupt (digitalPinToInterrupt(CLK), encoder_detect, CHANGE);
  attachInterrupt (digitalPinToInterrupt(SW), button_detect, FALLING);
}
void loop() {
  if (!buttonState)
  {
    if (motor_speed > 0)
    {
      motor.setSpeed(motor_speed);
      motor.run(FORWARD);
      Serial.print("Move Forward: ");
      Serial.println(motor_speed);
    }
    else if (motor_speed < 0)
    {
      motor.setSpeed((motor_speed) * (-1));
      motor.run(BACKWARD);
      Serial.print("Move Backward: ");
      Serial.println(motor_speed);
    }
  }
  if (buttonState == true || motor_speed == 0)
  {
    motor.run(RELEASE);
    Serial.println("Break");
  }
}
void encoder_detect ()  {
  buttonState = false;
  State = digitalRead(CLK);
  if (State != old_State)
  {
    if (digitalRead(DT) != State)
    {
      motor_speed ++;
      if (motor_speed >= 255) motor_speed = 255;
    }
    else {
      motor_speed --;
      if (motor_speed <= -255) motor_speed = -255;
    }
  }
  old_State = State;
}
void button_detect()
{
  buttonState = true;
}
在这段代码中,我们使用了一个中断来读取轴和按键的位置。 有关中断的更多信息,您可以查看Arduino网站。 
 通过按下编码器按键或将编码器设置在位置0,电机断开。 
 以上就是本篇文章的全部内容。如有问题,请随时在本帖下面进行回复。 |