ロータリーエンコーダーの接続
今回使用したロータリーエンコーダーはコレです、
一回転あたり24個のパルスが出てくるので、時計の分針でいうと2分30秒単位の分解能ということになります。
ブレッドボード上で簡単に接続できるようにピンヘッダーをハンダつけしました。
データシートによれば最大動作定格電流が0.5mAとあるので、DE0の場合電源が3.3Vですから、プルアップの抵抗は6.8KΩ以上を使う必要があります。
試しに10KΩでプルアップしてオシロで波形を見てみましたが、下の波形のように思いっきり正極性のヒゲが出てきて、単純なデジタルハードでは正しく処理できそうにはありません。
抵抗によるプルアップだけの波形
勢いよく廻してみると最少で1.5mS程度の間隔で2相のパルスが出てきます、
しかし、細かく見てみるとLレベルの区間に細いパルスが見えます。
通常「ヒゲ」と呼ばれる類いのものですが接点の接触具合とか、構造によって
発生するものでとても厄介な存在です、しかし回転を検出するパルスの幅は
素早く回したとしても1mSを切るほどに狭くなる事はまずないので、パルス幅が
これ以下で細ければヒゲとして処理してかまわないようです。
また、このヒゲはその殆どがL区間に発生するようで正極性に限られるようなので、
無用なパルスがなるべく生成されないように簡単なフィルター回路を構成してみます。
下のように抵抗とコンデンサーによるいちばん簡単なアナログ的前処理回路です。
(回路1)
回路1の波形
回路1ではコンデンサーの容量が0.033uFですが、手持ち部品の関係で10KΩと0.1uFで測定してみました。
赤色は抵抗だけでコンデンサーなし、黄色がGNDとの間に0.1uFを付けた波形です。
コンデンサーを端子とグランド間に入れるるだけなので非常に簡単なのですが、よく考えてみると長期的にみて
これだと問題がありそうに思います。
理由はロータリエンコーダーの接点がクローズからオープンになる時には問題ないのですが、接点がオープンからクローズになった瞬間(波形の立下りエッジ)で、それまでコンデンサーにチャージされた電荷が一気に接点でショートするように流れるため、ほんの瞬間的ではありますが定格を超えるインパルス的な電流がながれるので、早期に接点の劣化を招いて接触不良やチャッタリング/ヒゲの増加などの悪影響を生じる可能性が将来高くなりそうに思えてきました。
そこで、接点に過度的な大電流が流れないように少し工夫してみたのが下の回路2です。
(回路2)
波形の立ち上がりの時間が立ち下がりの約2倍になってしまいますが、回路1にあった瞬間的なショート電流は流れなくなるのに加えて
発生する波形のヒゲの殆どが正極性パルスだったので、これを消すためにはかえって好都合です。
予備実験として手持ちの3.3KΩと0.1μFでRaise/Fall Timeを0.3mS程度まで遅くしてみます。
スルーレートを抑えた回路2の波形
上の波形はCH1がCRなし、CH4がCRありの波形です、上側波形に見えるヒゲを消すのにちょうどいい位に波形が鈍っていますね。
理想的には、この信号をシュミットトリガーで受けてあげるのがベストだと思います。
最終的な定数を決めるために以下の回路で動作確認してみました。
(回路3)
上記回路3の出力波形
多少ヒゲの影響が見えますが、ロジック電圧的に閾値を超えないので問題ないレベルになったと思います、
このようにアナログ段で前処理をすればDE0で取り込んでからの判断処理が随分とラクでより確実に処理
できるようになると思います。
このヒゲは通常のプッシュSWとかスライドSWで発生するチャッタリングとは違っていて変化点だけでなく
波形の平な部分の真ん中にも発生するため、よくやるDフリップフロップで定期的にサンプリングするだけの
方法では読み飛ばすことができません、この影響によって回転方向の判断を誤ってしまうので非常にやっかいです。
今回のようなアナログ前処理なしにロジックだけでヒゲ読み飛ばしに対応するには、値が変化した後にある一定期間以上同じ状態が続いたら遷移、
一瞬だけでなら遷移せずにそのままホールドといった具合に、過去の状態を考慮して判断をするロジックにする必要がありそうです。
次のセクションでは、チャッタリングとヒゲの除去をデジタル的に処理する方法を模索することにします。