ノブコンの改良

画像


ノブコンが5台あるのですがロータリーエンコーダが次々と劣化。右に回しても頻繁に左に回ったような誤ったパルスが出、もちろん逆も同じように起こります。AFMのアプローチに使っている時にたまにリトラクトするならまだしも、緊急にリトラクトするつもりがアプローチされたのではたまりません。以前からたまにバックファイヤーしていたのでしたが、アルゴリズムが悪いのか、あるいはポーリングが遅すぎて速く回したときには2パルス先あたりを読んでしまうのか、と思いつつ、面倒くさくて今まで見直しをしなかったのです。それがここに来て使い物にならないくらいに悪化してきました。

ロータリーエンコーダにはふたつの相がありますね。安物なので機械スイッチです。スイッチだからチャタリングが起こるのは当然織り込み済みなんですが、なんともう一方の相が遷移するときにまでパルスが出るようになってきました。

画像


実は何年も前に日米商事に沢山出ていた新古品のアルプスのロータリーエンコーダを使っていたのです。不良ロットだったのかも知れません。秋月で売っているのは何年も使っていて実績があるのですが、サイズが違います。いっそのこと設計変更しようか、それにしても6月1日に5台間に合わすのは面倒だなーなどと思いながら、昨日また日米をのぞいたら、こんどは松下の同じようなサイズのが沢山出ていましたので、これで当面解決すれば儲けもの、と思って買って来ました。

冒頭の写真が買ってきたロータリーエンコーダです。日米らしいチラシの紙で手作りした袋に入れてくれました。連休開けたら載せ替えてみたいです。軸がローレットなのがちょっと困りますが、イモネジでぎゅうぎゅう締めてなんとかならんでしょうかね。

ところで、話の流れとは関係なく冒頭に写真を置くようにしたのは、最初の画像が自動で見出しになるようなので、図よりも写真の方が人目を引くだろうということです(2番目以下の画像を見出しにするような明示的な指定ができたりするのかも知れませんが)。

さて、写真のせいで話の流れがおかしくなっていますが、なんとかアルゴリズムで解決できないかと1日努力しました。チャタリング防止の考え方としてよくあるのが次のようなもの。

画像


ハードウェアでやるならRCで簡単にローパスフィルタをかけてシュミットトリガで受けるというのが定石ですね。マイコンだけでやろうとすると、チャタリングが持続するであろう時間よりも遅いレートでポーリングするというのがあります。丁寧にやるには、というかポーリングの間隔が別の都合からもっと速いときは、所定回数連続して同じ状態になるまで待つというのもあります。また、電圧変化があったら割り込みが掛かるようにしておき、割り込みルーチンでタイマー割り込みを仕掛け、タイムアップしたら見に行くというのがあります。

以上説明したマイコンだけでやるアルゴリズムは孤立パルス状のノイズに弱いようです。遅くポーリングするのは、パルスに当たってもその後は必ずエッジが来るという仮定のもとに成り立っていますから、たまたま孤立パルスをサンプルしてしまえばダメです。所定回数連続して同じ状態、というやつは良さそうなのですが、回転が速くなってくると所定回数のサンプリングが終了しないうちに孤立パルスが一発入るとエッジではなかったと判断しまいます。つまり孤立パルスをエッジと錯覚することはないのですが、孤立パルスのせいでエッジを見落とします。割り込み方式の欠点は遅くポーリングするのに似ています。タイマーが作動中は電圧を観察していません。孤立パルスが来てもいちいち所定時間待ってから確認に行くため、回転が速くなると手遅れになります。

そこで、ハードウェアによるフィルタに似た方法を試してみました。積分用の1バイトの変数を用意しておきます。十分に速くポーリングし、入力が1なら変数をインクリメントし、0ならデクリメントします。変数は下は0、上は255で飽和するようにしておきます。これはRCフィルタを通った電圧に似たものです。この変数をソフト的にヒステリシスコンパレータに通してやればいいではありませんか。実際には変数が127を超えたら強制的に255に飽和させ、127を割り込んだら強制的に0に飽和させるというプログラムにしました。

その結果、孤立パルスにはだいぶ強くなりました。ところが、おぉ強くなったな、と思ってロータリーエンコーダをがりがり回していたため、どんどん劣化が進んでしまいました。こんなヘボい部品、もうやだ!

さて、上記のアルゴリズム変更の副作用が出ました。ポーリングが速すぎて他のタスクがお留守になります。使っているのがPIC16F84Aなので、電圧変化で割り込みが掛かるピンが4本しかありませんが、基板の配置などからNE555のパルスが終わったことを知るためのピンは割り込みがかからないピンになっています。もともとそっちを頻繁にポーリングしていたのですが、それが間に合わなくなったため、連続モードで周波数がスムーズに変化できなくなりました。

そこで、NE555のリトリガを自動でやらせるため、出力をRCで遅延してトリガ入力に入れるようにしました。なんで遅延する必要があるかというと、NE555のトリガピンは電源電圧の下から1/3まで電圧が下がると動作してしまうため、出力をそのまま接続するとノコギリ波がグランドレベルまで下がらないで次のランプが始まってしまうのです。連続モードではこのようにして自動でリトリガがかかるように、マイコンのピンは入力(ハイインピーダンス)に設定しておきます。ワンショットモードではマイコンのピンを出力に設定して、トリガをかけたいときは0かけたくないときは1を出力します。

画像

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 1

なるほど(納得、参考になった、ヘー)

この記事へのコメント

この記事へのトラックバック