0°

(十五)arduino入门:旋转编码器

一、本节介绍

在该实验中,您将学习如何使用旋转编码器。旋转编码器是电-机械装置,其将角位置或运动的一个轴或车轴的模拟或数字代码。旋转编码器是通常放置在侧垂直的轴。旋转编码器用作用于检测角度传感器、速度、长度、位置和加速度。

二、材料准备

1*-arduinoUNO板

-USB数据线

旋转编码器模块-1*

-杜邦线

三、原理讲解

有两种主要类型的旋转编码器:绝对和相对(增量)。绝对编码器的输出指示了当前位置的轴,是角度传感器。增量式编码器输出的信息提供关于所述轴的运动,通常进一步加工成其它信息,例如速度、距离和位置。

在该实验中,使用增量式编码器。

增量式旋转编码器的传感器是用于将旋转位移转换成一系列数字脉冲信号,这些信号随后被用来控制角位移。它生成两个相位方波的相位差是90°。通常的双相位方波被称为信道A和信道B,如下所示:

image https://bbs.qutaojiao.com/assets/images/1-axf3s4qzDjuESunc.png

已经很难区分左转和右转过程中单片机编程。然而,当使用示波器观察左、右转向开关,你会发现,存在相位差的两个信号之间的输出引脚。的相位差表示如下:

image https://bbs.qutaojiao.com/assets/images/1-ylIbyMu8EK1Q30To.png

如果信道A和信道B为高,开关顺时针旋转;如果信道A和信道B是高是低,将开关逆时针旋转。因此,如果信道是高的,你也可以判断旋转编码器是否左或右,只要你知道信道B。

四、实验步骤

步骤1:构建电路

image https://bbs.qutaojiao.com/assets/images/1-8TfJQx5r7XfHht0L.jpeg

原理图

image https://bbs.qutaojiao.com/assets/images/1-HmSbUxmAUgdfpM8M.png

为方便接线,旋转编码器模块使用。+引脚与GND连接的旋转编码器模块引脚5V和GNDsunfounderUNO板、和CLK和引脚DT至数字模块的引脚2和3的板

步骤2:编写程序

步骤3:编译代码

步骤4:上载程序到arduinoUNO板

你会看到的角度位移旋转编码器串行打印在计算机的监视器。当把轴的顺时针的旋转编码器,把角位移增大;逆时针,减小。如果你按下轴,它被复位,并恢复到初始状态。

image https://bbs.qutaojiao.com/assets/images/1-4IQOa9OjZzbw1Eo6.jpeg

本节程序

/*******************************************/
//旋转编码器
/*将你看到的角度位移旋转编码器串行打印在监视器上。
  当旋转编码器顺时针转动时,角位移被增加;
  当逆时针旋转,位移下降。
  如果按下此开关的旋转编码器,其读数归零。*/
//2017.11.11
/*******************************************/

const int clkPin = 2//连接到CLK引脚2
const int dtPin = 3//在DT引脚连接到引脚3
const int swPin = 4 ; //SW引脚连接到引脚4
int encoderVal = 0;

void setup()
{
  //设置clkpin,depin,swpin作为输入
  pinMode(clkPin, INPUT);
  pinMode(dtPin, INPUT);
  pinMode(swPin, INPUT);
  digitalWrite(swPin, HIGH);
  Serial.begin(9600); // 初始化串行通信在9600bps
}

void loop()
{
  int change = getEncoderTurn();//
  encoderVal = encoderVal + change;
  if (digitalRead(swPin) == LOW) ////如果转动 按钮
  {
    encoderVal = 0;
  }
  Serial.println(encoderVal);
}
int getEncoderTurn(void)
{
  static int oldA = HIGH; //标志为高
  static int oldB = HIGH;
  int result = 0;
  int newA = digitalRead(clkPin);//读取旋转编码器的值
  int newB = digitalRead(dtPin);//读取旋转编码器的值
  if (newA != oldA || newB != oldB) //如果发生改变
  {

    if (oldA == HIGH && newA == LOW)
    {
      result = (oldB * 2 - 1);
    }
  }
  oldA = newA;
  oldB = newB;
  return result;
}

本节程序下载:点击下载

下载密码:

当前内容已被隐藏,您需要登录才能查看
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论