ねころこの備忘録

僕の開発の手順とか実験結果とか感想とかをつらつら書き込んでいくお墓.僕の魂を成仏させるためのお墓です.お経(コメント)待ってます

エンコーダについて

PPR(plus per rotation)が100のエンコーダがあるのですが,
ppr100だと,400パルスだお.と言われ「へっ!?」ってなったことがあって調べてみたのですが,
A相,B相は回転の方向を調べるためのものだと思っていたら,それ以外にも分解能が上がるっていう特徴があるみたいで.

sm_201204avago_encoder-6.jpg


A,B相の信号を1と0で表すとその表し方が

enc1-240x300.jpg
この図より4通りあることがわかります.
そうすると,A相B相の1パルスで4パルス分と言えるので,
PPRをKとすると4Kになるわけです.


そのことを考慮してmbedで書いてみました.

まず,ヘッダーファイルが

#ifdef __encoder_h__
#define __encoder_h__
 
#include "mbed.h"
 
class encoder{
public:
    encoder(PinName A1, PinName B1, int ppr);
    void getSetEncoder();//** mainのループで必ず毎回呼び出す!!!! **
    int getPpr();
    int getRotation();
    int getResolution();
private:
    int _ppr;
    int _resolution;
    int _rotation;
    };
 
#endif



cppファイルが

#include "encoder.h"
 
void encoder::encoder(PinName A1, PinName B1, int ppr){
    DigitalIn A(A1);
    DigitalIn B(B1);
    _ppr = ppr;
    _resolution = 0;
    _rotation = 0;
    A.mode(PullUp);
    B.mode(PullUp);
    i = 0;
    }
    
void encoder::getSetEncoder(){
    if(A == 1 && B == 1){ a = 0; }
    else if(A == 0 && B == 1){ a = 1; }
    else if(A == 0 && B == 0){ a = 3; }
    else if(A == 1 && B == 0){ a = 2; }
 
    if(b == 0 && a == 0){}
    else if(b == 0 && a == 1){ k++; }
    else if(b == 0 && a == 2){ l++; }
    else if(b == 0 && a == 3){ }
    else if(b == 1 && a == 0){ l++; }
    else if(b == 1 && a == 1){ }
    else if(b == 1 && a == 2){ }
    else if(b == 1 && a == 3){ k++; }
    else if(b == 2 && a == 0){ k++; }
    else if(b == 2 && a == 1){ }
    else if(b == 2 && a == 2){ }
    else if(b == 2 && a == 3){ l++; }
    else if(b == 3 && a == 0){ }
    else if(b == 3 && a == 1){ l++; }
    else if(b == 3 && a == 2){ k++; }
    else if(b == 3 && a == 3){ }
    b = a;
    _resolution++;
    i++;
    if(_resolution % _ppr == 0){ rotation++; }
    }
int getRotation(){
    return rotation;
    }
int getResolution(){
    return resolution;
    }

というようになっています.
パルスを4Kとした時,パルスの合計を返す関数と,
回転数を返す関数を書いてみましたが,
正直使うというよりエンコーダのことを深く知るのに書いてみただけなので,効率の良し悪しについてはまあ知らん.
もっといい書き方があるのは知ってるけど,まあいいかって感じで.