【Arduino】编码器OMRON E6B2-CWZ6C

本文介绍了一种使用Arduino读取增量式编码器的方法,通过定义外部中断和脉冲计数,实现了顺时针和逆时针方向的角速度测量及角度计算。代码详细展示了如何设置中断、采集脉冲数并计算角速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接线方式如下

在这里插入图片描述

测试代码

在这里插入图片描述

#define PinA 2 //外部中断0
#define PinZ 3 //外部中断1
#define PinB 9 //编码器的OUT_B信号连接到数字端口8
#define T 30    //定义采集时间周期单位ms
unsigned long time1 = 0; // 时间标记
volatile long PulSum_CW = 0;   //定义长整型不可修改脉冲数
volatile long PulSum_CCW = 0;   


long PulSum_CW_t0 = 0;         //定义记录顺时针方向 t0 时刻脉冲数变量
long PulSum_CW_t0_T = 0;       //定义记录顺时针方向 t0+T 时刻脉冲数变量


float Rad_CW_Speed = 0.000;    //定义顺时针角速度
float Rad_CCW_Speed = 0.000;    //定义逆时针角速度


long PulSum_CCW_t0 = 0;        //定义记录逆时针方向 t0 时刻脉冲数变量
long PulSum_CCW_t0_T = 0;      //定义记录逆时针方向 t0+T 时刻脉冲数变量

// 记录角度
int Rad = 180;


void setup()


{
    pinMode(PinA, INPUT_PULLUP);//因为编码器信号为欧姆龙E6B2-CWZ6C,为开漏输出,因此需要上拉电阻,此处采用arduino的内部上拉输入模式,置高
    pinMode(PinB, INPUT_PULLUP);//同上
    attachInterrupt(0, Encode, FALLING);//脉冲中断函数:捕捉A相信号,并判断A、B相先后顺序
    Serial.begin (9600);
}


void loop()
{
  // 角度计算程序
  Rad = int((PulSum_CW - PulSum_CCW)/6.944) % 360; 
  if (Rad>=180) {
    Rad = Rad - 360;
  }
  
  PulSum_CW_t0   = PulSum_CW;  PulSum_CCW_t0   = PulSum_CCW;    //采集t0时刻的脉冲数
  delay(T);                                                     //等待一个T时间
  PulSum_CW_t0_T = PulSum_CW;  PulSum_CCW_t0_T = PulSum_CCW;    //采集t0+T时刻的脉冲数
  delay(T);                                                     //等待一个T时间
  
  // 如果检测到正向角速度,那么就打印角速度,以及累计的角度
  if (PulSum_CW_t0_T - PulSum_CW_t0 != 0){
    Rad_CW_Speed = (PulSum_CW_t0_T - PulSum_CW_t0);   //
    // 显示正向(CW)角速度 Rad_CW_Speed--->              //打印出来速度
    //Serial.print("AS:");                            //打印出来速度w
    Serial.print(Rad_CW_Speed);
    Serial.print(":");            
    //Serial.print("/A:");
    Serial.print(Rad);
    Serial.print("\n");
    }  
  
  // 如果检测到反向角速度,那么就打印角速度,以及累计的角度
  if (PulSum_CCW_t0_T - PulSum_CCW_t0 != 0){
    Rad_CCW_Speed = (PulSum_CCW_t0 - PulSum_CCW_t0_T);
    //Serial.print("AS:");
    Serial.print(Rad_CCW_Speed);
    Serial.print(":");            
    //Serial.print("/A:");
    Serial.print(Rad);
    Serial.print("\n");
    }



}
void Encode()
{//当编码器码盘的OUTA脉冲信号下跳沿每中断一次,
  //if ((millis() - time1) > 5)
  //{
    if ((digitalRead(PinA) == LOW) && (digitalRead(PinB) == HIGH))
    {PulSum_CW ++;}
    else
    {PulSum_CCW ++;}
  //}
    //time1 == millis();
}

更多代码参考github,fly~~~

Ref
增量式编码器工作原理超详细图解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值