北上くんの指導の下、マイクロマウスの開発に挑戦中のえみちゃん。スイッチを制御して、4つのLEDで2進数を表示させるプログラムを開発しましたが、考えていた通りに動かなかった様子です。今回は、マイコンプログラム初心者が一度はハマるチャタリングの防止と、「SH7125」マイコンに組み込まれているタイマーについて解説します。
組み込み技術者に要求される要素が“ギュッ”と詰まった「マイクロマウス」。北上くんと新入社員のえみちゃんは、スキルアップを兼ねてマイクロマウスの開発を始めることにしました。北上くんの指導の下、「階層構造」を意識したオリジナルプログラムを開発することになったえみちゃんは、スイッチに応じてLEDを2進数表示させるプログラムを作成しました。しかし、どうも動きがおかしいようです……(前回の記事へ)。
――北上くんがコンビニで買ってきたスイーツを食べながら……。
最近のコンビニのスイーツは、本当にオイシイですね〜(モグモグ)。
そうだねぇ〜。
まっ、これはボクのおごりだから遠慮なく食べてね!
(ハイハイ)で、センパイ!
さっき作ったLEDで2進数を表示させるプログラムは、どうしてちゃんと動いたり、動かなかったりしたんでしょう? ひょっとして、バグですかぁ〜?
あぁ、それはバグじゃないんだよ。
あれはね。スイッチが「チャタリング」を起こしているんだ!
チャタリング……。何ソレ、オイシイ?
チャタリングっていうのはだね……。
前回、えみちゃんが考えた仕様に合わせてスイッチを制御し、4つのLEDで2進数を表示させるプログラムを開発しました。動作を確認してみると、一見、ちゃんと動いているようですが、時々、スイッチを一度押しただけで“数字が飛んでしまう現象”が発生しました(動画1)。
これは、スイッチを扱う際に必ず考慮しなければならない「チャタリング防止」の仕組みを組み込んでいなかったために発生したエラーです。
チャタリングは、スイッチやリレー機構のオン/オフ切り替え時に起きる現象で、切り替え時の機械的な振動によるわずかな接触の繰り返し(オン/オフの繰り返し)をマイコンが瞬時に感知してしまうことで発生するものです。何も対策していないと、チャタリングにより、マイコンが複数回プログラムを実行してしまい、誤動作(意図しない結果)を招きます。
試しに、オシロスコープで、チャタリングが発生しているときの波形を見てみましょう。400μsという非常に短い時間の中で、スイッチがオン/オフを不安定に繰り返している様子が見て取れます(画像1、2)。
画像1、2のように、スイッチ入力によって、マイコンが受け取る電気信号を視覚化すると、(人間が)スイッチを1回押すという動作を、マイコンは全く違う時間感覚で処理していることがよく分かります。
私たち人間が“1回の動作”として認識しているスイッチを押すという行為を、マイコンは、床に落とされたボールが、ポーーーン・ポーーン・ポーン・ポンポン・ポン……と何度か跳ねてから停止するように認識します。そのため、ボールが大きく跳ねている間は、微細な電気信号が発生し、オン/オフを不規則に繰り返します。
繰り返しになりますが、私たちがマイコンを制御する際、常に意識しなければならないのは、人間が持っている時間感覚とマイコンの時間感覚は大きく違うということです。ちなみに、Pi:Co Classicに搭載されているマイコン「SH7125」の動作クロックは48MHzに設定されており、1秒間に4800万回という周期で動作しています。
はぁ〜。
マイコンって、すっごいスピードで動いているんですね!!
そうなんだよ。ボクたちとマイコンは、全く違う時間軸で生きているんだ。
だから、マイコンの気持ちになってプログラムを書く必要があるんだよ!
マ、マイコンの気持ち……ですか?
うん! マイコンがいつどんな信号を受け取ったかなーとか、どんな順番でプログラムを処理しているかなーとか。それが分かっていないと、正しく動くプログラムが書けないんだよ。
な、なるほど。
じゃあ、チャタリングを防止するためには、どんなプログラムを書けばいいんでしょうか……。マイコンの気持ちねぇ〜。
要するに、スイッチの動作が安定するまで、マイコンが信号を受け取らないようにしてあげればいいんだよ!!
前述の通り、マイコンの内部処理は非常に早いスピードで実行されます。そのため、周辺機器のインタフェースと連携するためにタイミングを計ったり、ユーザーに動作状態を知らせるためにマイコンを待機させたりする必要があります。
チャタリングが発生するのは、数100μs〜数msのごくわずかな時間です。つまり、その間、プログラムが動作しないように「待機処理(ウェイト)」を入れてあげればいいのです。
待機させる方法として一番手軽なのは、“for文”により、あえて無駄なループを繰り返させることでしょう。連載6回の「ソースコード8 LED点灯のアプリケーション」でも、このやり方を採用しています。このときは、LEDの点滅がユーザーに感知できるようfor文でウェイトさせました。
ただし、for文では、“正確に時間を計ってマイコンを待機させる”ことはできません。そこで、今回はマイコンに内蔵されている「タイマー」で割り込み処理を実装します。タイマーでウェイト関数を作っておけば、マイクロマウス競技の「2秒停止ルール」にも使えて便利です。
Pi:Co Classicに搭載されているSH7125には、「CMT(コンペアマッチタイマー)」「MTU(マルチファンクションタイマーパルスユニット)」「WDT(ウォッチドッグタイマー)」の3つのタイマーが用意されています。
今回は、カンタンに使えるCMTを使います。CMTは、「1」「2」「3」とカウントして、ユーザーが指定した値とカウンタの値を比較し、一致したときにフラグを立てます。この処理を“コンペアマッチ(比較一致)割り込み”といいます。
CMTがカウントするスピードは、周辺クロックPφに依存しています。「8分のPφ」「32分のPφ」「128分のPφ」「512分のPφ」の4種類から選べます。
ちなみにMTUは、CMTよりも高度なタイマーであり複雑な処理が可能です。次回以降で紹介する、ブザーを鳴らしたり、モーターを制御したりするのに使用します。なお、WDTは、プログラムの暴走を監視するタイマーですので、本連載では扱いません。
関連記事: | |
---|---|
⇒ | 【問題8】 「ウォッチドッグタイマ」の役割とは? |
Copyright © ITmedia, Inc. All Rights Reserved.