リバイブ・システム株式会社
外来ノイズ、外乱によるマイコンの停止と原因
マイコンの異常停止を引き起こすのは、外来ノイズ、外乱です。
外来ノイズが、どの様に「暴走」を起こすのか?暴走への途を紹介します。
暴走対策
マイコンの正常な動作が外乱ノイズで停止しないためには、外乱ノイズが電子基板に入ってこない様にするために、金属ケース、シールド、フィルタ、ノイズ吸収素子、接地の強化といったハードウェア上のノイズ対策が、先ず、必要です。
しかし高電圧の外乱はいくらシールドやノイズ対策をしても電子基板に入り込みマイコンの動作を阻害して正常な動作を妨げる事は有ります。
外乱の原因は、雷、誘導雷、電動機からのサージ・パルス、高出力レーダーからのレーダー波、ピエゾ素子からの高電圧パルス、衣料品などからの静電気放電、核爆発時の電磁波、ガソリン・エンジンのイグニッション、高周波ウェルダ、他、多くのものがありますが、共通点は、高電圧(100V以上)の時間幅の短いパルスである事です。
全ての外乱に対してハードウェアで完璧な対先をするのは困難な事です。この理由は幾つかありますが、先ず、電源は外部から得ますので完全な遮断ができない事、周辺回路の入出力も配線が外部に出ますので完全な遮断が難しい事があります。これら外乱の対策は必須であり、少なくともラッチアップを防止出来る必要はあります。
それでもマイコンが正常な動作をしない事があり、それが許容できない場合に、異常動作から速やかに復帰させる為のソフトウェアの対策が、それも不確実なウォッチドッグの様なパッシブな対策でない、有効な対策が必要です。
ここで紹介している対策技術は以下の種々ノイズ源に対するものです。ソフトウェアのバグ、デバッグ不足によるデータ・エラーからの停止に対応しようとするものでは有りません。
これらの外乱がマイコンICというハードウェアにどの様な影響を与え、その結果として、マイコンICに何を引き起こすのか?そして、その対策として何ができ、何処まで回復出来るのか?を説明します。
外乱が影響するマイコンの部分の説明:
● 上図にてマイコンICの各部分に外乱が入るとどうなるか?を解説します。
1)クロックへのノイズ:CPUのタイミングエラー
クロック入力にノイズが入ると、CPUへ与えられるクロックが時間幅の短い方へと変化して、CPUの許容幅以下の短いパルスとなり、CPUは内部でタイミング・エラーを起こします。
この結果、命令の実行に必要な時間が取れずに演算結果を間違ったり、CPUバスのタイミングがずれて、RAMやROMからのデータを正常にアクセスできなくなったりします。
この問題を起こすのは、クロック入力をそのままCPUのクロックとして使っている様な古いタイプのマイコンで起ります。
外部からのクロックを分周してPLLで内部でクロックを作っているタイプであれば(現在はほぼ全てのマイコンがそうですが)入力された基準となるクロックは多段にわたり分周されますので、この問題は起りません。
それでも、基準クロックの入力へ内部でフィルタが設置されているタイプであれば、より安全です。
2)割込み:幽霊割込み
外乱ノイズは、それ自体でマイコンの割込み機能を開始させる事が有ります。設定にて割込みを禁止していても外乱ノイズ起因の割込みは発生します。割込みをCPUが受け付けると、CPU内の情報の幾つかをスタックに保存してから、該当する割込み様のベクターを取得して割込み処理を開始します。
ここで割込み発生原因が連続したパルスの場合が問題です。スタックへの退避、割込みベクターの取得、この間に次の割込み要求があると、又、スタックへの退避、割込みベクターの取得を行います。連続した外乱ノイズを想定した場合(安全策としては、どの場合でも)スタックがオーバーフローしても他のデータに影響しない様なスタックの配置が必要です。
因みに、パチンコ台では、使っていたマイコンは、モトローラのM6802でした。M6802ではRAMは、0x00~0xFF、でしたが、スタックは、0x2Fとしてデータのエリアを0x30からとしました。これでスタックがオーバーフローしても、データ・エリアに影響する事は避けられました。
32ビットといった高性能のマイコンでは、もう一つ別の問題が有ります。割込みを受け付ける際に、その割込みのベクターを要求します。ベクターが無いか、妥当なベクターの範囲でないと、スプリアス割込み(幽霊割込み、Spurious Interrupt)となり、エラー処理が起ります。このエラーが単発であれば無視できますが、連続している場合は元のコンカレントに復帰する際にスタックの値に注意が必要です。
3)RAMのデータ異常
RAMに保持されているのは、データ、か、フラグです。RAMの内容が外乱ノイズで書き換わるのは、或るRAMのアドレスにCPUが書込みのアクセスをしている時がほとんどです。外乱ノイズが来たとしてもRAMが変化するのは稀な事です。しかし、無い訳では無いので適切な対処が必要です。
現場での実験では、データの異常は発見不能であり、対処が難しいのですが、データの異常はほとんどの場合、他のエラーを起こします。それでも、データが妥当な範囲にあるか?は確認した方が復旧率が上がります。
所が、フラグは大きな問題を引き起こす可能性が有ります。実は、これは、復旧を行う際の、再開始アドレスに関係します。
C言語では、フラグのセットを、Flag++、フラグのクリアをFlag−−、とする事は普通です。所が、もし、或るフラグを、2階、クリアしたらどうなるでしょうか?そのFlagの値は、ー1、つまり、0xFFFFFFFF、となります。これは、フラグをクリアしようとしても、相当の回数、このクリアを行わないとクリアできません。つまり誤動作になります。
クリアがされないと次の動作に移れない場合、システムは何もしなくなります。暴走したと思えるでしょう。
これが外乱ノイズにより、引き起こされると、他のシステムが全て正常で有っても、この暴走から抜けられません。
この問題は、ソフトウェアの記述方法で解消できます。以下の様にすれば問題有りません。
sample source code
int Flag-Word;
|
|
// Set Flag-Word
Flag-Word = 0x5555;
// Clear Flag-Word
Flag-Word = 0xAAAA;
|
|
if Flag-Word == 0x5555; // フラグ セット
then goto-1; // フラグがセットされている場合の分岐
if Flag-Word == 0xAAAA; check Clear
then goto-0; // フラグがクリアされている場合の分岐
else goto-error; // フラグが壊れている場合の分岐
上記の様に、セットとクリアに特定の値を設定し、この値によりフラグ制御をすれば、フラグの値が壊れた際には、エラー処理へと分岐できます。
これが、外来ノイズを考えたソフトウェアというものです。
4)ROMの読出しエラー:データの読出しエラー、システム停止の原因
ROMやRAMの内容はデータ・バスによりCPUが読出し、RAMなら書込みます。このバスに外乱ノイズが入るとバスのデータ転送が阻害されます。
これがROMの場合は、多くは、命令語の読取りであり、読もうとしていないデータを読む事となります。高級なCPUでは(後述しますが)命令語ではないコードを読んだ場合、例外処理を起こします。しかし、命令語として解釈できればCPUは。その命令語を実行します。本来の命令語では無い命令語を実行しますから、何が起きるか分かりません。一旦、異常な命令語を実行すると本来の命令語の連続、コンカレント、がまったく違ったものとなります。それでも、CPUは本来なら意味の無い事を延々と実行します。この状態が、CPUの暴走です。
5)周辺回路への外乱:設定の変更
周辺回路はマイコンの信号の入出力です。そして外部と配線で物理的に接続しています。この外部との配線、電子基板上と電子基板上の部品と接続、さらにコネクタを通じて外部のセンサーやモーター、ランプ、スイッチ、他と接続されていますが、これらの配線は、基板上、もしくは、基板外も含み、外乱ノイズのアンテナです。
配線が外乱ノイズへのアンテナとなって外乱ノイズはマイコンICの周辺回路のピンに入ってきます。そして様々な異常を引き起こします。
(番外、ラッチアップ)
このピンでのノイズがマイナスの電位であり、大きな電力を持っているとマイコンICは仮想SCRとない、電源とGNDの間をショート(短絡)したのと同じ事になります。一度、この状態になると解除するには電源を切るしか有りません。そのまま放置すると、この短絡電流によりマイコンICは過熱されて焼損、永久破壊に至ります。ですのでサージ吸収素子、フィルタは重要です。この現象はハードウェアで起ります。ソフトウェアでは対策できません。
6)設定変更から:通信エラー、割込みエラー、システム停止の原因
ラッチアップに至らない場合、周辺回路のピンに入ったノイズは何をするのでしょうか?外乱ノイズは周辺回路の設定を書換ます。筆者の体験では、初期化した状態になる事が多い様ですが、外乱ノイズの電圧、タイミング、など固定的な症状は有りません。以下に代表的な症状を紹介しますが、異常はこれらに限りません。何が起きるか分からない、のが実際です。
GPIOに外乱ノイズが入ると ― 出力が入力に変化します
ADC、DACの設定ピンに外乱ノイズが入ると、GPIOの入力や出力に変化します
PWMにノイズが入ると、パルスを出さなくなります
UARTにノイズが入ると、ボーレートが変わり全ての通信がエラーになります
これらの異常はソフトウェアで行っている設定が外乱ノイズにより書き換えられているのですから、ソフトウェアで対策が可能です。
それとマイコンICの周辺回路の設計時には、周辺回路が異常により初期化される事を考慮する事が必要です。モータードライブ回路でよく使われる、Hブリッジという回路がありますが、このHブリッジを周辺回路(GPIO)からドライブする場合、初期化しても電源からGNDへ電流が流れない様にしておく必要が有ります。
GPIOでのエラーで多いのは、リミット・スイッチやスタート、ストップといった押しボタン・スイッチからの信号が来なくなる事です。各種のスイッチからは来る信号によりシステムの動作が変わります。マイコンICのピンまで信号が来ていても、設定が変化していれば、この所用の信号はソフトウェアの実行に反映されません。その信号が割込み信号なる場合には割込みは発生しません。結果、スイッチ信号待ちで停止している事となり、システムが停止している様に見えてしまい、マイコンのシステムが停止したと誤認されます。
この問題が有りますので、リミット・スイッチに使う場合には、必ず、ハードウェアでオーバーラン停止機能を付けて下さい。
通信も同様です。UART、SPI、他の通信機能を使う際には、その通信用の設定が変化した場合を想定して、タイムアウト機能などでエラーを検出して対策を行う必要性が有ります。
7)CPU自体の異常検出機能の利用: 例外の検出と処理
高級マイコンには、マイコンのCPU自体にエラー検出機能が有ります。命令コードとして読み込んだワードに該当する命令が無い場合(不法命令)、数値演算で、分母がゼロの場合、MMUやMPUからのエラー信号、ベクターエリアへの書込み、等、マイコンによって異なりますが、CPUにより検出されるエラーが有ります。
これらのエラーに対応する処理を起動できる様に、リセット、割込み、と同じ、ベクターを設定するベクターテーブルがあり、検出された異常により特定のアドレス(ベクター)からエラー処理が実行できます。
ところが多くのシステムは、これらのベクターに、リセットと同じベクターを指定している場合が多く、有効に利用されていません。
この理由は、実際には、これらのシステム異常、として検出されるのは、外乱ノイズによりRAMの内容が変化していたり、バスに入ったノイズで異常なデータを受け入れた場合がほとんどです。これらのベクターには、内蔵させる自己検査(ダイアグ)により正常に戻せる様にするべきです。