エンコーダについて
PPR(plus per rotation)が100のエンコーダがあるのですが,
ppr100だと,400パルスだお.と言われ「へっ!?」ってなったことがあって調べてみたのですが,
A相,B相は回転の方向を調べるためのものだと思っていたら,それ以外にも分解能が上がるっていう特徴があるみたいで.
A,B相の信号を1と0で表すとその表し方が
この図より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とした時,パルスの合計を返す関数と,
回転数を返す関数を書いてみましたが,
正直使うというよりエンコーダのことを深く知るのに書いてみただけなので,効率の良し悪しについてはまあ知らん.
というようになっています.
パルスを4Kとした時,パルスの合計を返す関数と,
回転数を返す関数を書いてみましたが,
正直使うというよりエンコーダのことを深く知るのに書いてみただけなので,効率の良し悪しについてはまあ知らん.
もっといい書き方があるのは知ってるけど,まあいいかって感じで.