当サイトのコンテンツはご自身の判断と責任においてご利用ください。営利目的の利用は固くお断りします

更新2022/05/05

スイッチ入力とチャタリング除去

HMI(人間が操作するようなインターフェース)を持つ装置では、必ずスイッチなどの操作が発生します。
オンオフを読み取るために、マイコンのデジタルポートを使用するような場合も多くあります。
各種インターフェースを持つマイコン(MCU)の得意分野です。

スイッチ操作とチャタリング

しかし、スイッチ全般に言えますが、そのまま読み取ってしまうと正しいスイッチの状態を読み取ることはできません
例えば、バット構造の金属接点スイッチは、押したり離したりした瞬間にチャタリング(バウンス)という現象が発生します。
スイッチ内部の接点部品が接触(オン)したり跳ねたり(オフ)することを短時間のうちに何回か繰り返すことを指します。
ボールを高いところから落とすと、何回か跳ねますが、それと良く似た現象です。
その他、クリップタイプ接点構造のスイッチ(スライドスイッチなど)は、跳ねるチャタリングとは異なるオンオフ現象を起こします。
微妙に異なる現象がいろいろあって紛らわしいのですが、電気的にみればオン・オフ・オープンを短時間に繰り返す現象としてとらえることができます。
この短時間オンオフの継続時間はまちまちで、新品と古いもの温度や湿度などで異なるのはもちろんのこと、操作する力加減・速さにも影響されます。
一般的には、チャタリング継続時間は、数百μSから数十mSのものが多いようです。

チャタリングの影響

では、これらのチャタリングがあるスイッチの信号を、マイコンで読み取った場合どうなるでしょうか?
マイコンは猛烈なスピード(通常マイクロ秒単位)で作動しているので、ポートにつながったスイッチの信号も一瞬で読み取ってしまいます。
例えば、スイッチが一回オンオフするたびに、カウントアップするプログラムを作ったとします。
しかし、チャタリングのせいで、一回スイッチを操作するたびに、何十回もカウントが進んでしまうことになってしまいます。
これは、非常に困ります。
何十回も余計にカウントしてしまうということになるわけですから、読み取った結果で処理するマイコンは誤動作ばかりおこしてしまうでしょう。
つまり、マイコンでスイッチを読み取るには、チャタリングを除去する処理が必ず必要です。

チャタリング除去する方法

PIC16F690で作る汎用モジュールで、以下のようなスイッチを含む場合のチャタリング除去手法の一つを説明します。

通常、スイッチのチャタリング除去はソフトウエアで行います。
ハードウエア的にCR積分回路やデジタル回路のフリップフロップを使うなどもありますが、コスト的に安いのでソフトウエアで除去する方法が用いられます。

一般的なチャタリング除去手法としては、時間差で数回読み取り、スイッチのオンオフを比較して確定する手法が主流です。
 手法1:スイッチ信号の変化を検出したら、一定時間をおいて再度読み取り、一致したら確定
 手法2:一定期間毎に常時読み取り、例えば3回連続でオンオフの状態が一致したら確定
上記の手法1と2は、いずれもチャタリングが短時間継続すること、その最中は信号がパタパタと確定していないという現象を利用した方法です。

プログラム例

手法1で状態を確定させ、状態がオン確定でLEDを点灯、オフ確定でLEDが消灯するプログラムの一例です。
記載されていない部分は、PIC16F690汎用Cソースコードを使用します。

unsigned char temp=0; //テンポラリー変数
unsigned char qportc=0; //過去値記憶用

//メインルーチン開始------------------------------------------
while(1){
  while(temp==qportc){ //スイッチ信号の変化待ち
    temp=PORTC & 0x01;
  }

  wait(30); //30mS待機
  if((PORTC & 0x01) != temp){
    break; //一致しない場合は、最初に戻る
  }

  qportc=temp; //過去値更新
  if(temp==0x01){
    pwmsetduty(0xff); //LED点灯
  }
  else{
    pwmsetduty(0); //LED消灯
  }
}

スイッチ信号はPIC16F690のRC0で読み取られ、スイッチの確定情報は’temp’に入ります。
スイッチの情報が変化すると、30mS待機後に再度読み取りを行い、一致した時のみLEDの点消灯プロセスを実行します。
確定に30mS必要ですが、人間の感覚としてはほぼリアルタイムなので、実用上は問題ありません。

ロータリースイッチなどは、ぐるぐる勢いよく回すとスイッチの切り替え速度が速いため、1つ1つの切り替えを確定させるには待機時間30mSでは長すぎることがあります。
その場合は、実際にチャタリングの時間を実験しながら待機時間を決めることになります。
逆に待機時間を長くして、ぐるぐるのスイッチ操作が一段落するまで、いちいち確定させないという方法もあります。

(最新)

(中の人)


電子回路とファームウェア専門の元エンジニアが、初心者の頃の疑問や勉強・経験で知った「そうだったのか」を2009年から書いています。 ⇒続き

ページの先頭へ戻る
シェア
Tweet このエントリーをはてなブックマークに追加