自作デジポット(デジタルポテンショメーター)---(3)

ーーーグレイコード(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
 のようにすることができます。この配列を使えば,
 回転方向の検出ができることになります。