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

更新2022/05/04

A/D入力とノイズ除去

PIC16F690には、マイコン端子の電圧を測定しディジタル量に変換・取り込むA/D変換機能が搭載されています。

(Microchip Technology PIC16F690 Data Sheet より抜粋)
このアナログ・ディジタル変換(A/D変換)という機能は、大変便利で有用なのですが、うまく使うにはスイッチ入力と同じくコツが必要です。
ここでは、ハードウエアとソフトウエア両面から使い方を説明します。

アナログ信号に含まれるノイズ

スイッチ入力とチャタリング除去でチャタリング除去手法を説明しましたが、アナログ電圧の読み取りでも同様の問題があります。
それは、正規の信号に混じる微小ノイズです。
微小ノイズの原因として、多いのは電源変動ノイズ・負荷変動によるGNDレベルの変動・EMC(電磁波障害)・電灯ノイズなどです。
ボリュームなどの操作系のある場合は、ボリュームを動かした時の摺動ノイズもあります。

要は、アナログ電圧というのは、どんな状況でも必ずノイズが混じっているということです。
この微小ノイズは、回路のインピーダンスによっても違いますが、普通数mVから数百mV、場合によっては数V以上の電圧変動となって信号に混入します。
そのため、A/D変換で読み取ろうとしても、スイッチのチャタリングと同じで、読み取った値を本当に信用していいのかどうかがわかりません。
よって、ノイズが誤動作につながるほど大きい場合は、必ずノイズ除去が必要になります。

ノイズ除去の手法

ノイズ除去の代表的な手法に平均化という方法があります。
一般的に、ノイズは時間平均をするとプラスマイナスゼロになる性質があり、その性質を利用し平均化することで正しいアナログ電圧を確定しようとする方法です。
平均化には、ハードウエアである積分回路などのフィルター回路を用いて平均化する方法と、ソフトウエアでノイズを平均化する方法の2つがあります。

ノイズ除去例

PIC16F690で作る汎用モジュールPIC16F690汎用Cソースコードを使い、ノイズ除去手法の一つを説明します。

以下は、ノイズ除去のプログラム例です。
ここで記載されていない部分は、PIC16F690汎用Cソースコードをそのまま使用します。

adinit(0x00,0x14); //IO0をADポートとしての初期化
unsigned int temp=0; //テンポラリー変数
unsigned char adval=0; //テンポラリー変数

//メインルーチン開始---------------------------------------
while(1){
  temp=ad(4); //IO0(RC0)の電圧読み取り 1回目
  wait(10); //10mS待機

  temp=temp+ad(4); //2回目
  wait(10);

  temp=temp+ad(4); //3回目

  adval=temp/3; //平均値算出

  pwmsetduty(adval); //LEDのPWMデューティ設定

  wait(10); //次の処理までの待機

}

ボリュームの電圧を10mSn間隔3回連続で読み取り、それら3回のA/D変換値の平均値advalを求めます
算出した平均値は、pwmsetduty関数の引数にadvalをそのまま使用すれば、LEDがボリュームの電圧に応じて変化するようになります。

(最新)

(中の人)


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

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