【技術ブログ】移動平均が効かない! ADコンバーターで「突発的な巨大ノイズ」を除去した方法
ADコンバーターを使った電圧測定において、ノイズ対策は常に重要なテーマです。 多くの場合、ソフトウェアで「移動平均法」を使い、測定値を平滑化(なめらかに)します。
しかし、「あまりにも大きな、突発的なノイズ」が入る環境では、移動平均法が機能不全に陥ることがあります。
今回は、私が20代の頃に初めて設計を担当した製品で、この「巨大ノイズ」と格闘し、解決に至った実体験をご紹介します。
【1. 一般的な対策】移動平均法とその弱点
まず、一般的な「移動平均法」についてです。 これは、測定値をリアルタイムで使うのではなく、複数回(例えば8回)の測定値を平均して「測定値」として扱う手法です。
1回目:(測定1~8の合計)/8 = 測定値A 2回目:(測定2~9の合計)/8 = 測定値B 3回目:(測定3~10の合計)/8 = 測定値C
こうすることで、細かなノイズが平均化され、測定値の暴れを抑えることができます。
しかし、この手法の弱点は、「平均」であるがゆえに「異常値」も計算に含めてしまう点です。 もし1回だけ「ありえないほど大きなノイズ」が飛び込んできたら、その異常値に引っ張られて平均値全体が大きく狂ってしまいます。
【2. 直面した課題】20kVの静電気ノイズ
私が当時設計していたのは、POSシステム端末の充電器(10台同時制御)でした。 各端末の電池電圧をADコンバーターで測定しながら充電を制御するものです。
設計自体は単純でしたが、最大の壁は「静電気試験」でした。 5Vで動いているマイコン回路に、充電ケーブルを通じて20kVもの静電気ノイズが流れ込んできます。
ハードウェア対策(物理防御) 最初はマイコンが即座に破壊されました。そこで、ケーブルにL/Cフィルターを入れ、GNDパターンの面積を増やして高周波インピーダンスを下げる対策を実施。 これで、マイコンは「破壊されずに動作し続ける」状態にはなりました。
ソフトウェアの課題(データ汚染) しかし、マイコンは生き残っても、静電気が流れた瞬間のADコンバーターの測定値は「めちゃくちゃ」な異常値を示します。 このたった1回の異常値が移動平均に含まれるだけで、充電動作は完全に破綻してしまいました。
【3. 解決策】「最大・最小」を除外する平均法
そこで、私は移動平均法をきっぱりと捨て、以下のソフトウェア処理に変更しました。
- まず、データを8回連続で測定する。
- 取得した8個のデータから、「最大値」と「最小値」を1つずつ除外する。
- 残った6個のデータの平均値を、その時点の「測定値」として採用する。
- これを「1サイクル」とし、再び次の8回測定をゼロからスタートする。
この処理を繰り返すことで、充電制御を行いました。
【なぜうまくいったのか】
この方法では、測定サイクルの更新は移動平均より少し遅くなりますが、充電器の制御では全く問題ありません。
重要なのは「ノイズの特性」です。 静電気試験の放電は、コンデンサに溜めた電荷を放電するため、「単発」で発生し、次の放電までに必ずインターバル(数十~数百mS)があります。
このインターバルの間に8回の測定を完了できれば、8個のデータ群に「複数回」の巨大ノイズが入る確率を極めて低くできます。
結果として、20kVのノイズが「単発」で入ってきたとしても、そのデータは「最大値」または「最小値」として処理され、平均値の計算から除外されます。 これにより、充電動作を狂わせる「異常値」をキャンセルし、安定した測定を実現できたのです。
【4. まとめ】
これは私が20代の時、ハードとソフトの両方を一人で設計していたからこそ、「ハードで防ぎきれないノイズは、ソフト(データの処理方法)で捨てる」という対策がすぐに思いついたのだと思います。
もし移動平均法では対応しきれない「単発の巨大ノイズ」にお悩みの場合、この「最大・最小カット平均」は有効な手段の一つです。
