電圧などのアナログ値をデジタル値(数値)に変換する装置(ハードウエア)をA/C変換器(Analog to
Digital Converter)という。
例えば、図の様なアナログの信号(電圧値)があった時に①の点では、5.5Vであったとすると、AD変換器(以下、ADC)を使えば、この電圧値を数値に変換する事が出来る。
ADCでアナログ電圧を数値に変換する事を、サンプリングと言う。サンプリングの周期は、アナログ電圧の周波数に対して、十分短い事が要求される。具体的には、アナログ電圧の最大の周波数成分に対して2倍以上の速度でサンプルすれば良い事が知られている。(サンプリング定理)
ただし、実用上は3倍以上、出来れば10倍程度の速度でサンプルすることが望ましい。
H8/3052のADC
H8/3052には、分解能10bitのADC(逐次比較型)が実装されている。スペックは、以下の通り。
■ADCの動作には2つのモードがある。
■2.の入力チャネルについては切り替え式で、同時に変換できるチャネルは1つである。(一つのADCに対して、8本のアナログ信号線を切り替えて使う事が出来ると言う事。ただし、変換結果を保存するレジスタADDRxは別々になる。)
AN0~AN7の各信号線に対して、ADCSR(ADCの設定レジスタ、後述)の設定により、変換結果が保存されるレジスタは、以下の通り。
単一モードでの信号線とAD変換レジスタの関係は、以下の通り。
単一モードでは、一つのチャネルに対して変換が終了すると、変換終了フラグ(ADF)を1にして、ADCは停止する。
スキャンモードでは、
①~④の順で変換が繰り返される。変換が一巡するとADFが1になる。
設定の手順
以下の内容を決めたうえで、プログラミングを行う。
実際のプログラミング
ADCの設定はADCSRを通じて行う。ADCSRの各ビットに割り当てられた機能は、以下の通り。
ADIEが1にセットされている場合、ADFが1になると、割り込みが発生する。
■ 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) int main() ADCSR = 0x30; //
スキャンモード、266ステートで変換、AN0を入力チャネルに設定 for (w=0;w<0x8FFFF;w++); |
【単一モードを用いたプログラミング例】
#include "monitor.h" #define ADCSR (*(volatile unsigned char *)0xFFFFE8) #define ADDRA (*(volatile unsigned int
*)0xFFFFE0) int main() ADCSR = 0x00; // 単一モード、266ステートで変換、AN0を入力チャネルに設定; while(1) { for (w=0;w<0x8FFFF;w++); |