[AVR] ロータリーエンコーダを使う

| コメント(0) | トラックバック(0) |

AVRで、ロータリーエンコーダを使ってみます。環境は、ATmega88P、AVR Studio + WinAVR(C言語)です。

ロータリーエンコーダとは

ロータリーエンコーダとは、回転を検出するためのセンサーです。軸を回転させ、それがどれくらいの角度で回ったかをセンシングできます。回転角度の分解能は、さまざまです。

電子レンジなどで時間を設定するダイヤルとかにロータリーエンコーダが使用されています。

可変抵抗を使用しても、回転角度をアナログ的に見ることができますが、ロータリーエンコーダは、デジタル的に見ることができます。また可変抵抗とは異なり、回転角度が制限されておらず、一定方向に何度も回転させることができます。

ロータリーエンコーダの信号について

ロータリーエンコーダは、2つの出力端子を持っています。それぞれ、A相、B相となっていて、回転回数と回転方向を検出します。

ロータリーエンコーダには、インクリメンタル方式とアブソリュート方式の2種類があります。ここでは、インクリメント方式のロータリーエンコーダで説明します。

ロータリーエンコーダのA相とB相の出力される信号の方式には、様々な仕組みあります。今回は一番単純な機械スイッチが入った物を使用します。この方式は、ロータリーエンコーダ内部にスイッチが入っており、片方がGND、もう片方がそれぞれの相に接続され、スイッチのON/OFFで出力します。マイコンなどで使用するときは、単純なスイッチなので、プルアップ抵抗もしくはプルダウン抵抗が必要になります。ですがAVRには、内部にプルアップ抵抗があるので、抵抗を必ずしも用意する必要はありません。

ロータリーエンコーダは、A相・B相で回転したかどうかがわかります。信号の意味の詳細は、ロータリーエンコーダの仕様書を見ると書いていますが、案外単純なプログラムで検出できます。

A相もしくはB相をトリガーとして、もう一方のHiかLoを見るだけで回転したかを確認できます。手順は、

  1. A相を立ち下がりを見る。
  2. B相がLoの時、時計回り(もしくは反時計回り)。Hiの時、反時計回り(もしくは時計回り)。
  3. 1-2を繰り返す。

となります。これで、回転したかを検知することができます。トリガーをうまく使うと、細かな回転を検知できますが、ステップ付きのロータリーエンコーダでは、この手順で十分です。

プログラム

プログラムを2種類書いてみました。1つは、スイッチの状態が変わるまで待つポーリング型。もう一つは、スイッチの状態が変化したときに動作する割り込み型です。

プログラムリスト

ポーリング型 re_poll.c

割り込み型 re_intr.c

割り込み型 チャタリング対策版 re_intr2.c

概要

プログラムは、ロータリーエンコーダを回転させたら、PORTDの出力を回転方向に合わせてビットシフトするものです。割り込み型の方には、参考の機能として、PB2を1秒間に5回ON/OFFさせています。

実験するときは、PORTDにLEDなどを付けてください。ロータリーエンコーダの入力は、PB0、PB1を繋いでください。A相・B相を区別する必要は、それほどありません。

ロータリーエンコーダの入力は、プルアップもしくはプルダウンする必要がありますが、このプログラムはAVRの内部プルアップ抵抗を使用しているため、不要です。

特徴

ポーリング型は、入力が変化するまで無限ループで待つため、プログラムが待ち状態になります。他の処理をする必要がある場合は、不向きです。

一方割り込み型は、入力の変化を検知し、それをトリガーとしてロータリーエンコーダの処理が行われます。入力が変化していない時は、他の処理を行うことができます。ただし、割り込みが発生すると、他の処理が途中で止まります。割り込み処理の中でグローバル変数など共有している物を使っている時は注意が必要です。

ロータリーエンコーダのチャタリングについて

今回使ったロータリーエンコーダの使用によると、チャタリングが発生し、プルアップ・ダウン抵抗によりますが最大5ms続くようです。

チャタリングを回避するために、5msのディレイを設けています。

ポーリング型の方は、安定して動作し、チャタリングを回避できましたが、割り込み型では、どうもうまくいきません。

割り込み型では、入力を確認する前にディレイを入れると、マシになりました。まだ少しチャタリングを起こしていますが、まだ許容できそうです。完全になくすには、コンデンサと抵抗でLPFを組む必要がありそうです。それでも安定しないときは、シュミットトリガーのNOT回路を通すと安定するかもしれません。

割り込み型で、チャタリング対策を改良しました。詳細は、次の記事にて説明しています。

動作している様子(動画)

動作しているところを動画にしてみました。

ポーリング型

チャタリングを起こさず、安定して動作しています。

割り込み型

若干チャタリングが発生しています。

この前買ったテスターで、周波数がカウントできたので、LEDの点滅回数を測って見ました。やはり、ロータリーエンコーダが回転しているときは、点滅回数が落ちており、処理が止まっていることがわかります。

こういった時間を扱う処理は、ディレイではなく、タイマーを使うとうまくいくかもしれません。

P.S 動画は、Xperia Arcで撮影しました。一応最高画質のはずです。再エンコードはしていないので、そのままの画質です。

トラックバック(0)

トラックバックURL: https://www.letstryit.net/mt/mt-tb.cgi/221

チャタリング対策ができたので、その方法を書いておきます。 なぜ、割り込み処理でディレイを入れても、チャタリングが発生するのか? AVRは、割り込みが発生... 続きを読む

コメントする

アーカイブ

カウンタ

Total
Today
Yesterday

IPv6 Ready

Powered by Movable Type 7.0

このブログ記事について

このページは、enjoypcが2011年6月 3日 11:32に書いたブログ記事です。

ひとつ前のブログ記事は「適当に電子部品を調達」です。

次のブログ記事は「[AVR] 割り込み処理でのチャタリング対策」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ