アナログ出力をマイコンにつなぐ

アナログ電圧をマイコンに伝えるには、A/Dコンバータを使用します。 この出力は、そのままマイコンに接続しても良いのでしょうか。 マイコンに接続するのに、どんな事を気をつければよいのでしょうか。

完成写真

アジェンダ

電圧レベルを合わせる

圧力センサの出力を調べたので、 この出力をMC9S08QG8マイコンのA/Dコンバータにつなぐことにします。 ところが、MC9S08QG8マイコンの電源電圧の上限は3.6Vなので、 圧力センサの出力をそのままつなぐと壊れてしまいます。 マイコンには、電圧レベルを低くして与える必要があります。

抵抗分割を使う

簡単に出力電圧を下げる方法として一番最初に考えられるのが抵抗分割による方法です。 具体的には、こんな回路で出力を取り出します。

実験回路1

先の出力特性を求める実験から、 ある程度の負荷抵抗を付けると「ローパス・フィルタ回路」の220Ω抵抗器が見えてくることがわかりました。 そのため、抵抗器で出力を分圧するのと同時に「ローパス・フィルタ回路」も構成してみました。 カットオフ周波数は、約1200Hzです。

MC9S08QG8マイコンのA/Dコンバータ入力は、 最大7kΩのインピーダンスを期待しており、入力容量も最大5.5pFなので、 この回路でも十分に使えると思われます。

オペアンプを使う

入力電圧に比例した出力電圧を得るために良く使われるのが、オペアンプです。 入力インピーダンスの高い非反転増幅回路を使って、 レベルとインピーダンスを同時に変換します。

実験回路2

ここで必要なオペアンプは、Rail-to-Railと呼ばれる、 出力電圧と入力電圧が電源電圧近くまで振れても動作するものです。 ここでは、ONセミコンダクタのMC33402という 8ピンのDIPパッケージに2回路のオペアンプが入ったチップを使用しています。

アプリケーション・プログラム

上記の二種類の回路をMC9S08QG8マイコンのA/Dコンバータ入力に接続して測定を行いました。 以下のプログラムは、"Processor Expert"を利用したプログラムの抜粋で、 1024回の測定結果から平均、分散、それに標準偏差を計算させています。

#include 

#define   N     (1024)

volatile double   avg;
volatile double   sd2;
volatile double   sd;

void main(void)
{
  /* Write your local variable definition here */
  word            i;
  word            value_word;
  double          value;
  double          sx;
  double          sxx;
  double          diff;
  double          avg_last;

  /*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/
  PE_low_level_init();
  /*** End of Processor Expert internal initialization.                    ***/

  /* Write your code here */
  /* For example: for(;;) { } */
  
  for (;;) {
    sx = 0.0;
    sxx = 0.0;
    for (i = 0; i < N; i++) {      
      (void)AD1_Measure(TRUE);
      (void)AD1_GetValue16(&value_word);
      value = (double)value_word / 64.0;
      diff = value - avg_last;
      sx = sx + diff;
      sxx = sxx + diff * diff;
    }
    avg = sx / N + avg_last;
    sd2 = (sxx - sx * sx / N) / (N - 1);
    sd = sqrt(sd2);
    avg_last = avg;
  }

  /*** Don't write any code pass this line, or it will be deleted during code generation. ***/
  /*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/
  for(;;){}
  /*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

計算結果は、デバッガで観測します。

標準偏差の計算方法

標準偏差は、個々の測定値とそれらの平均値の差の平方から計算します。 ところが、まともに計算しようとすると測定値を記憶しておく場所が必要になってきます。 マイコンでは、測定値を記憶しておく場所を確保できないので、 測定値の和と平方和を記憶しておいて、測定が終わってから計算によって求める方法をとっています。

ただ、この方法を使うと、「測定値の平方和」が大きな値になってしまい、 標準偏差に相当する部分が丸め誤差に入ってしまうため、 標準偏差を求めることができませんでした。

そこで、「測定値の平方和」の代わりに「前の測定の平均値からの偏差の平方和」を 記憶しておくいく方式にしました。 この方式では、絶対値の比較的小さい「偏差」を使用するため、標準偏差の計算が可能になったというわけです。

実験評価結果

それぞれのアナログ出力をMC9S08QG8マイコンのA/Dコンバータ入力に接続し、 標準偏差の測定を行いました。

回路方式測定値平均標準偏差
抵抗分圧6350.5
オペアンプ6320.3

その結果、測定値に対する標準偏差の割合は、 抵抗分圧を使用した場合は0.08%であり、 オペアンプを使用した場合は0.05%でした。 これは、抵抗分割を使用するとオペアンプを使用した場合に比べてノイズが約二倍になることを示しています。 しかしながら、0.08%という値でも十分に小さいと思われますので、 抵抗分圧で使用上問題ないと判断します。

Updated: $Date: 2007/01/21 14:52:34 $

Copyright (C) 2007 noritan.org ■