初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

旋转编码器的引脚

  1. CLK(A相)
  2. DATA(B相)
  3. SWITCH
  4. VCC
  5. GND
    在这里插入图片描述

工作原理

旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thread-1001-1-1.html

为了更加清楚的理解这个辨别方向的过程我把我的理解用波形图画出来

在这里插入图片描述
判断AB两相的相位差就可以判断出正反转
斜体样式核心的思想就是在A产生下降沿的时候判断B的电平状态,如果为高电平状态则说明顺时针反之逆时针

代码实现

const int clkPin = 2;/*A相接口*/
const int dtPin  = 3;/*B相接口*/
const int swPin  = 4;/*按键接口*/
int encoderVal = 0;  /*记录当前的编码器值,为正顺时针方向,为负逆时针方向*/

int getEncoderTurn(void)
{
  static int oldA = HIGH;/*初始化A波形*/
  static int oldB = HIGH;/*初始化B波形*/
  int result = 0;        /*定义一个结果变量记录顺时针还是逆时针*/
 
  int newB = digitalRead(dtPin);
  int newA = digitalRead(clkPin);
  if(newA != oldB || newB != oldB)/*判断AB波形是否发生变化,有任意一个变化则满足条件,确认旋转*/
  {
    if(oldA == HIGH && newA == LOW)/*两个条件同时为真,A波形图产生一个下降沿11发生变化10*/
    {
      result = (oldB*2-1); /*顺时针返回1*2-1=1,逆时针返回0*2-1=-1*/
    }
  }
  oldA = newA;/*更新A波形值*/
  oldB = newB;/*更新B波形值*/
  return result;
}

void setup() 
{
  pinMode(clkPin,INPUT); /*信号输入单片机*/
  pinMode(dtPin,INPUT);  /*信号输入单片机*/
  pinMode(swPin,INPUT);  /*信号输入单片机*/
  digitalWrite(swPin,HIGH);   /*默认按键不触发*/
  Serial.begin(9600);         /*串口监视器波特率9600*/
}

void loop() 
{
  int change = getEncoderTurn();/*反馈信号子函数*/
  encoderVal = encoderVal + change;
  if(digitalRead(swPin) == LOW)
  {
    encoderVal = 0; /*按键被按下*/
  }
  Serial.println(encoderVal);/*打印编码器的值*/
}
这里loop循环里不能添加延时函数,否则会发生不可预测的错误(有点儿坑)
这种写法可以验证编码器的工作原理,但是不适合和其他函数整合到一块儿使用
应该是加入了延时会影响波形的判断,程序需要进一步改进和优

实验现象

顺时针旋转串口监视器输出正数逐渐增大
逆时针旋转串口监视器输出数逐渐减小会出现负数

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值