A/D
データレジスタはA/D
変換結果を格納するための16
ビットのリード専用レジスタです。ADDRA
〜ADDRDの
4
本あります。各アナログ入力チャネルの変換結果が格納されるA/D
データレジスタは表12.3
のとおりです。表
12.3
アナログ入力チャネルとA/D
データレジスタの対応 アナログ入力チャンネル 変換結果が格納されるグループ
0
グループ1 A/D
データレジスタAN0 AN4 ADDRA
AN1 AN5 ADDRB
AN2 AN6 ADDRC
AN3 AN7 ADDRD
10
ビットの変換データはA/D
データレジスタのビット15
からビット6
に格納されます(図 12.1)。下
位6
ビットの読み出し値は常に0
です。ビット 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
ADDR AD9 AD8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0 - - -
-初期値 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
R/W R R R R R R R R R R R R R R R R
図
12.1 A/D
データレジスタA〜D(ADDRA〜D)
A/D
コントロール/ステータスレジスタ(ADCSR)ADCSR
はA/D
変換器の終了フラグ、割込み許可、スキャンモード、チャンネルセレクトビットなどで構成されています。
表
12.4 A/D
コントロール/ステータスレジスタ(ADCSR)ビット ビット名 初期値
R/W
説 明7 ADF 0 R/W A/D
エンドフラグ[
セット条件]
・単一モードで
A/D
変換が終了したとき・スキャンモードで選択されたすべてのチャネルの変換が
1
回終了したとき[
クリア条件]
・
1
の状態をリードした後、0
をライトしたとき6 ADIE 0 R/W A/D
インタラプトイネーブルこのビットを1にセットすると
ADF
によるA/D
変換終了割り込み要求(ADI
)が イネーブル(
有効)
になります。5 ADST 0 R/W A/D
スタートこのビットを
1
にセットするとA/D
変換を開始します。単一モードでは
A/D
変換を終了すると自動的にクリアされます。スキャンモードではソフトウェア、リセット、
またはスタンバイモードによってクリアされるまで 選択されたチャネルを順次連続変換します。
4 SCAN 0 R/W
スキャンモード(P.316
の12.1.4
参照) A/D
変換のモードを選択します。0
:単一モード1
:スキャンモード3 CKS 0 R/W
クロックセレクトA/D
変換時間の設定を行います。0
:変換時間=134
ステート(max
)1
:変換時間=70
ステート(max
)変換時間の切換えは、
ADST
=0
の状態で行ってください。2 CH2 0 R/W
チャネルセレクト2
〜0
1 CH1 0 R/W
アナログ入力チャネルを選択します。0 CH0 0 R/W SCAN
=0
のとき000
:AN0 001
:AN1 010
:AN2 011
:AN3 100
:AN4 101
:AN5 110
:AN6 111
:AN7 SCAN
=1
のとき000
:AN0 001
:AN0
〜AN1 010
:AN0
〜AN2 011
:AN0
〜AN3 100
:AN4 101
:AN4
〜AN5 110
:AN4
〜AN6 111
:AN4
〜AN7
12.1.4 単一モードとスキャンモード
A/D
変換器の動作モードには単一モードとスキャンモードがあります。動作モードやアナログ入力チャネルの切換えは、ADCSRの
ADST
ビットが0
の状態で行ってくださ い。動作モードモードやアナログ入力チャネルの変更とADST
ビットのセットは同時に行うことができ単一モードは指定された
1
チャネルのアナログ入力を1
回A/D
変換します(P.316
表12.4
参照)。スキャンモードは指定された最大
4
チャネルのアナログ入力を順次連続してA/D
変換します(P.316
表12.4
参照)。SCI3
のレジスタ定義(iodefine.h
の一部を抜粋)HEW
のレジスタ定義ファイルのうち、関連する部分を載せておきます。AD
変換のレジスタ定義(iodefine.h
の一部を抜粋)struct st_ad { /* struct A/D */
unsigned int ADDRA; /* ADDRA */
unsigned int ADDRB; /* ADDRB */
unsigned int ADDRC; /* ADDRC */
unsigned int ADDRD; /* ADDRD */
union { /* ADCSR */
unsigned char BYTE; /* Byte Access */
struct { /* Bit Access */
unsigned char ADF :1; /* ADF */
unsigned char ADIE:1; /* ADIE */
unsigned char ADST:1; /* ADST */
unsigned char SCAN:1; /* SCAN */
unsigned char CKS :1; /* CKS */
unsigned char CH :3; /* CH */
} BIT; /* */
} ADCSR; /* */
union { /* ADCR */
unsigned char BYTE; /* Byte Access */
struct { /* Bit Access */
unsigned char TRGE:1; /* TRGE */
} BIT; /* */
} ADCR; /* */
}; /* */
……
#define AD (*(volatile struct st_ad *)0xFFB0) /* A/D Address*/
今回の関数の仕様は以下の通りです。
■ファイル(ad.c)、ヘッダファイル(ad.h)■
---void AdIinit(---void)
形式:
#include "ad.h"
void AdIinit(void);
機能:A/D変換の端子の初期化を行う関数。
シングルモード、AN0に限定
A/D変換を用いる場合には、必ず実行すること。
デフォルトではA/D変換は停止状態。
引数: 無し 返却値:無し
---void AdStart(---void)
形式:
#include "ad.h"
void AdStart(void);
機能:A/D変換を開始する関数。
引数:無し 返却値:無し
---void AdStop(---void)
形式:
#include "ad.h"
void AdStop(void);
機能:A/D変換を停止する関数。
引数:無し 返却値:無し
---unsigned short AdRead(void)
形式:
#include "ad.h"
unsigned short AdRead(void);
機能:A/D変換の結果を取得する関数。
AN0の値のみ。
引数:無し
返却値:unsigned short(A/D変換の結果10ビット)
12.1.5 A/D 変換の結果をシリアルで表示
まずは可変抵抗を
AN0
に接続して、単一モードで値をA/D
変換し、その結果をシリアル通信を用い てターミナルソフトに表示してみましょう。今プログラムは、AN0につなぐものが可変抵抗でなくてもそのまま使えることに注意してください。
5V
以下の出力でしたら、どのようなセンサをつないでもかまいません。可変抵抗
半固定抵抗は、3本の足があり、両端の足をプラス側と
GND
に繋ぎます。上部の可変部分をドライバ で回すことによって、真中の足の抵抗が変えられます。回路図
今回は
AN0
に可変抵抗の出力をつなぎます。図
12.2 A/D
変換の回路図今回は
A/D
変換以外に、シリアル通信と数値を10
進数に変換する関数を使いますので、sci.h、sci.c、str.h、str.c
などが必要になります。これらのファイルを利用する方法は、第
6
章(P.151)
を参考にしてください。以下に手順をまとめておきます。
•
新しいプロジェクトを作る。•
プロジェクトの中のiodefine.h
は削る。•
フォルダlib
の下のsci.c、str.c、ad.c
をプロジェクトに追加。•
インクルードファイルディレクトリを設定する。なお、受信割込みを使うために、intprg.cの
INT SCI3
をコメントアウトしておいてください。ここで 宣言されている関数は、sci.cに記述しました。intprg.c
のINT SCI3
をコメントアウト// vector 23 SCI3
//__interrupt(vect=23) void INT_SCI3(void) {/* sleep(); */}
// vector 24 IIC2
__interrupt(vect=24) void INT_IIC2(void) {/* sleep(); */}
今回のプログラムでは、A/D変換の結果は、4回測定して平均をとるようにしました。このようにする と、値のばらつきが少なくなります。
では、以下にサンプルプログラムを示します。