旋转编码器模块研究(1)

1.和正常的编码器原理是类似的,不过用着更方便了。
2.不需要搭建外围电路,已经做完上拉,估计精度比较垃圾。

淘宝网址如下:
https://detail.tmall.com/item.htm?spm=a230r.1.14.13.1183b85fR10LMA&id=530477227931&cm_id=140105335569ed55e27b&abbucket=13
https://detail.tmall.com/item.htm?id=41254563868&ali_refid=a3_430583_1006:1109983619:N:%E7%BC%96%E7%A0%81%E5%99%A8%E6%A8%A1%E5%9D%97%20%E6%97%8B%E8%BD%AC:04c59bc25aa4434ecd1581c5182789f6&ali_trackid=1_04c59bc25aa4434ecd1581c5182789f6&spm=a230r.1.14.1
这里重点说一下接口:
CLK不是什么时钟,应该是发出的一路脉冲,只要你扭转就行。理解为A路信号
DT也不是什么数据,应该也是一路脉冲。理解为B路信号
关于编码器的原理,我想主要是两种方案,一种是定时器中断处理,一种是外部中断处理,后续的函数,我会写出来。
配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。这怎么理解?
个人认为:应该是多了一个触发,其他倒是无所谓。
读数系统通常采用差分方式,即将两个波形一样但相位差为180deg;的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。
增量编码器给出两相方波,它们的相位差90deg;,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比。

电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要知道多少机械角度相当于电气上的360度。
可以用下列公式来计算:电气360 =机械360deg;/ndeg;脉冲/转

int redPin=2;
int yellowPin=3;
int greenPin=4;
int aPin = 6;
int bPin = 7;
int buttonPin=5;
int state = 0;
int longPeriod = 5000;
int shortPeriod=700;
int targetCount=shortPeriod;
int count = 0;
 void setup()
 {
      pinMode(aPin, INPUT);
      pinMode(bPin, INPUT);
      pinMode(buttonPin, INPUT);
      pinMode(redPin, OUTPUT);
      pinMode(yellowPin, OUTPUT);
      pinMode(greenPin, OUTPUT);
 }
 void loop()
 {
     count++;
     if(digitalRead(buttonPin)) //相当于清零
     {
         setLight(HIGH,HIGH,HIGH)
     }
     else
     {
         int change = getEncoderTurn();//change 只有三个数 0 1 -1
         int newPeriod=longPeriod+(change*1000)//6000+1000 0 -1000
         if(newPeriod>=1000&&newPeriod<=10000)
         {
             longPeriod = newPeriod;//
         }
         if(count>targetCount)
         {
             setState();
             count=0;
         }
     }
     delay(1)
 }
 int getEncoderTurn() 
 {
    //return -1 0 or +1 
    //就最初是LOW,后来无所谓了
    static int oldA = LOW;
    static int oldB = LOW;
    int result = 0;.//如果下面没有发生跳变就result = 0 
    //这个函数挺有意思。
    int newA = digitalRead(aPin);
    int newB = digitalRead(bPin);
    if(newA!=oldA||newB!=oldB)
    {
        //something has changed
        if(oldA==Low&&newA==High)//判断一个上升沿
        {
            result = -(oldB*2-1);//把01变成 +1 和 -1
            //如果oldB=0 result = 1
            //如果oldB=1 result = -1
        }
    }
    oldA=newA;
    oldB=newB;
    return result;
 }
 int setState()
 {
     if(state == 0)
     {
         setLight(HIGH,LOW,LOW); //100
         targetCount = longPeriod;
         state = 1;
     }
     else if (state==1)
     {
         setLight(HIGH,HIGH,LOW); //110
         targetCount = shortPeriod;
         state = 2;
     }
     else if (state == 2)
    {
      setLights(LOW, LOW, HIGH); //001
      targetCount = longPeriod;
      state = 3;
    }
     else if (state == 3)        //010
    {
      setLights(LOW, HIGH, LOW);
      targetCount = shortPeriod;
      state = 0;
    }
    return 0;
 }
void setLights(int red, int yellow, int green)
{
  digitalWrite(redPin, red);
  digitalWrite(yellowPin, yellow);
  digitalWrite(greenPin, green);
}  
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值