AD変換器

 電圧などのアナログ値をデジタル値(数値)に変換する装置(ハードウエア)をA/C変換器(Analog to Digital Converter)という。
例えば、図の様なアナログの信号(電圧値)があった時に①の点では、5.5Vであったとすると、AD変換器(以下、ADC)を使えば、この電圧値を数値に変換する事が出来る。
          
 ADCでアナログ電圧を数値に変換する事を、サンプリングと言う。サンプリングの周期は、アナログ電圧の周波数に対して、十分短い事が要求される。具体的には、アナログ電圧の最大の周波数成分に対して2倍以上の速度でサンプルすれば良い事が知られている。(サンプリング定理)
 ただし、実用上は3倍以上、出来れば10倍程度の速度でサンプルすることが望ましい。
 



H8/3052のADC

 H8/3052には、分解能10bitのADC(逐次比較型)が実装されている。スペックは、以下の通り。

  1. 10 ビットの分解能
  2. 入力チャネル:8 チャネル(AN0~AN7の信号線)
  3. アナログ変換電圧範囲の設定が可能
  4. 高速変換
      変換時間:1チャネル当たり最小5.4μs(25MHz動作時)
  5. 単一モード/スキャンモードの2 種類の動作モードから選択可能
      単一モード:1チャネルのA/D変換
      スキャンモード:1~4チャネルの連続A/D変換
  6. サンプル&ホールド機能
  7. 外部トリガ信号による、A/D 変換の開始が可能
  8. A/D 変換終了割り込み要求を発生

■ADCの動作には2つのモードがある。

  • 単一モード
     指定した一つのチャネルで変換が終了したら、ADCは停止。
  • スキャンモード
     指定したチャネル(複数指定可)で連続して変換を行う。

■2.の入力チャネルについては切り替え式で、同時に変換できるチャネルは1つである。(一つのADCに対して、8本のアナログ信号線を切り替えて使う事が出来ると言う事。ただし、変換結果を保存するレジスタADDRxは別々になる。)
 AN0~AN7の各信号線に対して、ADCSR(ADCの設定レジスタ、後述)の設定により、変換結果が保存されるレジスタは、以下の通り。
   単一モードでの信号線とAD変換レジスタの関係は、以下の通り。
      

  単一モードでは、一つのチャネルに対して変換が終了すると、変換終了フラグ(ADF)を1にして、ADCは停止する。
  スキャンモードでは、
      
    ①~④の順で変換が繰り返される。変換が一巡するとADFが1になる。
 



設定の手順

 以下の内容を決めたうえで、プログラミングを行う。

  1.  入力チャネルを決める。
  2.  変換モードを決める。
  3.  変換時間を決める。
  4.  割り込みを使うかどうかを決める。(AD変換終了時に発生する割り込み)
     


実際のプログラミング

 ADCの設定はADCSRを通じて行う。ADCSRの各ビットに割り当てられた機能は、以下の通り。


     

  • ADF
    AD変換の終了(単一モード。スキャンモードの場合は、CH2~CH0で設定した変換が一巡した時)に1にセットされる。1にセットされた値を0にクリアする場合は、ADCSRをリードした後に0を書き込む。初期値は0。

ADIEが1にセットされている場合、ADFが1になると、割り込みが発生する。

  • ADIE
    ADIEを1にセットすると、AD変換終了時(ADIFが1)の時に、割り込み(ADI割り込み、ベクタテーブルの60番)が発生する。0にクリアすると、割り込みは発生しない。初期値は0。
     
  • ADST
     1にセットするとAD変換を開始する。変換が終了すると、自動的に0にクリア。変換中に0を書き込むと、ADCは停止する。スキャンモードでは、0にクリアされるまで、変換を継続する。初期値は0。
     
  • SCAN
    ADCの変換モードを単一モードにするか、スキャンモードにするかを選択する。0の時は単一モード。1でスキャンモード。モードの切り替えは、ADSTが0の時におこなうこと。
    初期値は0。
     
  • CKS
    クロックセレクトを行う。CKSを0にクリアすると、1チャンネル当たり、266ステート(10.8μS~25MHz動作)、1にセットすると134ステート(5.4S~25MHz動作)で変換を終了する。初期値は0。
     
  • CH2~CH0
    チャンネルセレクト。前述の説明を参照のこと。


■ ADDRxレジスタの構成について
  AD変換の結果を保存するレジスタであるADDRA~ADDRDのビットの構成は、以下の通りになる。

  

 変換結果は10ビット長であり、図のように、左詰めとなっているため、右に6ビットシフトする必要がある。

 



変換結果とアナログ電圧の関係

 これまで説明したように、AN0~AN7に入力されるアナログ入力電圧は、ADCによって数値に変換される。この時、数値と実際の電圧との関係は、以下のようになる。

 

 ADCの分解能は10bit(0~1023の数値を表現できる)なので、入力電圧の上限を5Vとすると、この間を1024等分する事になる。つまり、

              入力電圧[V] = 5 / 1024 × 変換後の数値

  ということになる。



【 スキャンモードを用いたプログラミング例 】

#include "monitor.h"

#define ADCSR (*(volatile unsigned char *)0xFFFFE8)

#define ADDRA (*(volatile unsigned int *)0xFFFFE0)
#define ADDRB (*(volatile unsigned int *)0xFFFFE2)
#define ADDRC (*(volatile unsigned int *)0xFFFFE4)
#define ADDRD (*(volatile unsigned int *)0xFFFFE6)

int main()
{
    unsigned long w;
    unsigned int ad_result;

   ADCSR = 0x30;  // スキャンモード、266ステートで変換、AN0を入力チャネルに設定

    while(1) {
        while ((ADCSR & 0x80) == 0); // 変換終了を待つ(ADF=1)
       ADCSR &= 0x7F;// ADCSRのADFを0にクリア
        
       ad_result = ADDRA >> 6;  // 6ビット右シフトして、桁を合わせる
        printf("%d\n", ad_result);

        for (w=0;w<0x8FFFF;w++);
    }
}


【単一モードを用いたプログラミング例】

#include "monitor.h"

#define ADCSR (*(volatile unsigned char *)0xFFFFE8)

#define ADDRA (*(volatile unsigned int *)0xFFFFE0)
#define ADDRB (*(volatile unsigned int *)0xFFFFE2)
#define ADDRC (*(volatile unsigned int *)0xFFFFE4)
#define ADDRD (*(volatile unsigned int *)0xFFFFE6)

int main()
{
    unsigned long w;
    unsigned int ad_result;

   ADCSR = 0x00;  // 単一モード、266ステートで変換、AN0を入力チャネルに設定;

    while(1) {
        ADCSR |= 0x20;   // ADCスタート(ADST=1)
        while ((ADCSR & 0x80) == 0);  // 変換終了を待つ(ADF=1)
       ADCSR &= 0x7F;  // ADCSRのADFを0にクリア
        
       ad_result = ADDRA >> 6;  // 6ビット右シフトして、桁を合わせる
        printf("%d\n", ad_result);

        for (w=0;w<0x8FFFF;w++);
    }
}

 

最終更新:2014年10月07日 16:11