ーーーグレイコード(3)ーーー
A相とB相の信号を使えば,回転方向を検出できることは,
理解できました。
これをプログラムで実現するには,いくつか方法がある
ようです。
自作のMPG関連では,B相の立ち上がりを検出し,それを
DFFのICにいれて,回転方向を検出してました。
今回は,別な方法でやってみようかなと思います。
基本的な考え方は,◯月の取説にあったように,前回と
今回の2回のサンプリングをして,その組み合わせの全部
から回転方向を決める方法です。
エンコーダーから,出力されるグレイコードをバイナリ変換
して,前回と今回の2回のサンプリングの差を取って,+1
の場合は時計方向,-1の場合は逆時計方向としてもいい
のですが,バイナリ変換するのにビット操作が必要なので,
私にはちょっと苦手かなと思います。
それで,組み合わせを全部拾い出し,それをインデックスに
して,回転方向を決めるのが私には分かり易いかなと思い
ました。
前回グレイコード(2)記事の表から,前回と今回の
サンプリングの可能性を考えて見ます。
可能性は,次のようになります。
時計回転
前回→今回
00 →00 動かない(0)
00 →01 時計回転(+1)
00 →11 一つ先に移動(エラー)
01 →01 動かない(0)
01 →11 時計回転(+1)
01 →10 一つ先に移動(エラー)
11 →11 動かない(0)
11 →10 時計回転(+1)
11 →00 一つ先に移動(エラー)
10 →10 動かない(0)
10 →00 時計回転(+1)
10 →01 一つ先に移動(エラー)
逆時計回転
前回→今回
00 →00 動かない(0)
00 →10 逆時計回転(-1)
00 →11 一つ先に移動(エラー)
10 →10 動かない(0)
10 →11 逆時計回転(-1)
10 →01 一つ先に移動(エラー)
11 →11 動かない(0)
11 →01 逆時計回転(-1)
11 →00 一つ先に移動(エラー)
01 →01 動かない(0)
01 →00 逆時計回転(-1)
01 →10 一つ先に移動(エラー)
全部で16通りありますので,前回を2ビットシフトして,
今回と合計すると,その数値がインデックスの数値として
使えることになります。エラーを100とすると,
m[(前回<<2)+今回]=数値
m[0000]=0
m[0001]=1
m[0011]=100
m[0101]=0
m[0111]=1
m[0110]=100
m[1111]=0
m[1110]=1
m[1100]=100
m[1010]=0
m[1000]=1
m[1001]=100
m[0010]=-1
m[1011]=-1
m[1101]=-1
m[0100]=-1
のようになり,[ ]内を16進数に直すと,
m[0]=0
m[1]=1
m[3]=100
m[5]=0
m[7]=1
m[6]=100
m[F]=0
m[E]=1
m[C]=100
m[A]=0
m[8]=1
m[9]=100
m[2]=-1
m[B]=-1
m[D]=-1
m[4]=-1
のようにすることができます。この配列を使えば,
回転方向の検出ができることになります。