<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

ロータリーエンコーダの入力

2008年08月08日 | PIC・マイコン
昨日までの累計アクセス数=6,316。 ご訪問頂き、ありがとうございます。         日記@BlogRanking


ロータリーエンコーダには「インクリメンタル方式」と、「アブソリュート方式」の2種類があります。
インクリメンタル方式は、軸が一定量回転するごとにパルスを出力します。

1回転でいくつのパルスを出力するかを分解能と呼びますが、20パルスあたりから5000パルスあたりまであります。
軸が回転するたびにパルスが出るので、軸が何度動いたか、何回転したかといった情報は、
パルスの数を数えることによって得ることができます。

ただ単にパルスが出るだけでは、回転方向の判断が付きませんので、
以下に示すような2相のパルスを出力するように作られています。



右回転では、A相が先にハイからローに変化する。左回転では、B相が先にハイからローに変化する。
つまり、A相がハイからローに変化した時点でのB相の値を見れば回転方向がわかります。

秋月電子通商で売っているのは、インクリメンタル方式のものでした。

端子はA相、B相、GND の3ヶからなっており、見た目はボリュームのようなものです。
これは、1回転(360度)で24パルスです。また、クリック付きです。

そこで、PICとは、10kohm プルアップで、
A相 ---> RB0/INT ( H -> L で割込発生 )
B相 ---> RB7   と繋ぎ、



割込方式でプログラムを作りました。(mikroBASICで)
INT 割込発生時に、先ずB相をチェックしておき、
チャッタリングが収まるまで(1mS)待って、RB0(A相)がローだったら正しい変化時点と判定する。


割込処理ルーチン部分だけ載せます。
(段付けの為、先頭に2B空白がある)
' --------------------- mikroBASIC ソースの一部
sub procedure interrupt ' --- RB0/INT interrupt H->L
 If PORTB.7 = 1 Then
  rl_dir = "R" ' H : Right
 Else
  rl_dir = "L" ' L : Left
 End If
 Delay_ms(1) ' debounce
 If PORTB.0 = 0 Then ' true H->L
  get_data = 1
 Else ' not ( L->H ) Pass
  get_data = 0
 End If
 ClearBit(INTCON,INTF) ' clear INTF
end sub
' ---------------------
以上、お役に立ちましたら幸いです。

お手数をおかけしますが、2クリック(投票を)して頂けるとうれしいです。 ⇒ 日記@BlogRanking
お引き立て頂き、「60代~日記@BlogRanking」で上位になれています。ありがとう御座います。


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。