SH7085のA/D変換器(その1)
ここでは、SH7085 に搭載されているA/D 変換器の概要とA/D変換器の特徴、扱い方について説明する。
SH7085のA/D変換器の特徴
SH7085には、図1のように2つのA/D変換器(変換モジュール)が搭載されており、それぞれをAD0、AD1と呼ぶ。各変換モジュールには4チャネルの入力チャネルがあり、合計で8チャネルのA/D変換が可能となっている。
図1:SH7085のA/D変換器の概略図
8つのチャネルは、AN0~AN7という名前の端子としてPF0~PF7の入力端子と共有されている。通常は、PFCで各端子の機能を選択するのだが、ANnとPFnの機能はPFCで機能を選択する必要はない。
A/D変換器が動作中に、PFn から入力があれば、それはアナログ信号として扱われA/D変換される。逆に、A/D変換器が停止していればPFn からの入力はディジタル信号として扱われる。
A/D変換の結果は、各チャネルに対応してADDR0~ADDR7に格納される。分解能は、10ビットであり、図2のように16ビットレジスタの上位から順に格納される。
図2:A/D変換結果の格納
SH7085のA/D変換には、下記の3つのモードの変換モードがある。
- シングルモード:1つのチャネルを1回だけ変換する
- 1サイクルスキャンモード:複数のチャネルを1回だけ変換する
- 連続スキャンモード:複数のチャネルを変換し続ける
どのモードを使うかはプログラムによりレジスタに適切な値を与える必要がある。設定の方法などについては、それぞれのモードを使うときに説明する。
実際にA/D変換器を動かすためには、回路を正しく接続して、プログラムを記述しレジスタを正しく設定する必要がある。それらが完了したら、最後にA/D変換器を動作させるわけであるがA/D変換器を動かす方法もいくつかある。
一般的にはソフトウェアスタートと呼ばれる方法で、ユーザのプログラムでA/D変換のスタートビットを操作する方法である。次は、SH7085に搭載されている別のモジュールからスタートさせる方法である。例えば、コンペアマッチしたときにスタートさせるなど、別の機能からスタートさせる方法である。最後に、回路的に外部に接続された信号でスタートさせる方法である。これは、外部に別のタイミングクロックを設けておき、そのタイミングでA/D変換器を動かす方法である。
以上をまとめるとSH7085のA/D変換器には下記のような特徴がある。
- A/D変換モジュール:2つ搭載(AD0とAD1)
- A/D変換チャネル:8チャネル(各モジュールに4つ)
- A/D変換入力端子:AN0~AN7(PF0~PF7と共有)
- 変換結果:ADDR0~ADDR7に格納(各チャネルに対応)
- 分解能:10ビット
- 動作モード:シングルモード、1サイクルスキャンモード、連続スキャンモード
- A/D変換の開始:ソフトウェアスタート、別のモジュールからのスタート、外部トリガ
上記の他に、A/D変換が終了したときの割込みやモジュールスタンバイモードがある。
シングルモード
シングルモードは、1つのチャネルを1回だけA/D変換するモードである。MEMEsボードには、図3のようなアナログのジョイスティックが装備されており、上下左右に動かすと接続されている端子の電圧値が変化する。
その電圧値の変化をA/D変換器によりディジタル変換して取り込み、ジョイスティックがどの程度倒されたのか?どの方向に倒された?などの情報を受けることを可能とする。
図3:アナログジョイスティックの接続
アナログジョイスティックの上下方向の操作は、AN0/PF0 端子に接続されている。左右方向の操作は、AN1/PF1端子に接続されている。シングルモードでは、両方のチャネルを変換することはできないので、上下方向の変換から行う。
使用レジスタについて
まず、使用するレジスタについて説明する。
AN0とAN1は、A/D変換器のAD0モジュールのチャネルである。A/D変換器をスタートするには、ADCR(AD Control Register)と呼ばれるレジスタのADST(AD StarT)ビットを操作する必要がある(図4)。
図4:ADCRレジスタ
ADCRは下記のように定義されている。
struct st_ad0 { ~中略~ union { unsigned short WORD; struct { unsigned short :2; unsigned short ADST:1; } BIT; } ADCR; ~中略~ };
このレジスタのADSTビットにアクセスするためには、下記のようにする。ただし、チャネル4~7については、AD1である。
AD0.ADCR.BIT.ADST = 0 or 1; /* 0 で停止、1 で開始 */
A/D 変換が終了すると、ADST ビットが自動的に0 になる。また、ADCSR(AD Control Status Register) レジスタのADF(AD Flag) も1 に変化するので、これらのビットの変化を受けてプログラムを考える必要がある。
ADCSRには、ADFのほかに、モードを切り替えるビットやA/D変換するチャネルを指定するビットも含まれており、非常に重要なレジスタである。図5にADCSRレジスタを示す。
図5:ADCSRレジスタ
ADCSRは下記のように定義されている。
struct st_ad0 { ~中略~ union { unsigned short WORD; struct { unsigned short ADF :1; unsigned short ADIE :1; unsigned short :2; unsigned short TRGE :1; unsigned short :1; unsigned short CONADF:1; unsigned short STC :1; unsigned short CKSL :2; unsigned short ADM :2; unsigned short ADCS :1; unsigned short CH :3; } BIT; } ADCSR; ~中略~ };
A/D 変換が終了すると、図6のようにADDRn レジスタに結果が格納される。このままレジスタを表示しても意味がないので、結果を6ビット右にシフトさせて表示させる必要がある。
図6:ADDRnレジスタ
ADDRnは下記のように定義されている。
struct st_ad0 { ~中略~ unsigned short ADDR0; unsigned short ADDR1; unsigned short ADDR2; unsigned short ADDR3; ~中略~ };
以上のことを踏まえて、AN0をシングルモードでA/D変換させて結果をhterm に表示するプログラムを下記に示す。
プログラム1:シングルモードのサンプルプログラム
1: #include "iodefine.h" 2: #define printf ((int (*)(const char *,...))0x00007c7c) 3: 4: void main(void) { 5: STB.CR4.BIT._AD0 = 0; 6: AD0.ADCR.BIT.ADST = 1; 7: while(AD0.ADCR.BIT.ADST); 8: AD0.ADCSR.BIT.ADF = 0; 9: printf("ADDR0 = %04d n", AD0.ADDR0 >> 6); 10: while(1); 11: }
5行目は、AD0モジュールのスタンバイを解除しており、解除しなければA/D変換は行われない。6行目でA/D変換をスタートさせている。7行目でA/D変換の終了を待っている。ADSTは、A/D変換が終了すると自動的に0に変化するので、その変化を待っている。また、ADFもA/D変換の終了で変化するので、その変化を検出しても同じようにA/D変換の終了を検出できる。8行目は、変化したADFビットを戻している。
動画1:プログラム1の動作
シングルモードでA/D変換するチャネルは、ADCSR のCH ビットで下記のように決められている。
なお,A/D 変換のチャネルを変更するときは,ADST が 0 の状態で行うこと.つまり,A/D 変換器が停止しているときに変更すること.
では、下記からシングルモードの演習用ワークスペースをダウンロードして演習を行うこと。
プログラムリストの ex1 は,サンプルプログラムである.
adc_single.zip
演習問題
下記は,A/D変換のシングルモードを使った演習問題である.特に断りが無い限り,A/D変換のモードはシングルモードに設定すること.また,A/D変換の終了待ちについても特に指定が無い限り,ADSTとADFのどちらを使っても良いこととする.
1.サンプルプログラム(ex1)をビルドし、アナログジョイスティックの上下方向の変化をA/D変換して、結果がhtermに表示されることを確認せよ.
2.ADCSRのCHビットを操作し,アナログジョイスティックの左右方向の変化をA/D変換し、結果を10進数4桁で hterm に表示させるプログラムを作成せよ.ただし、A/D変換の終了待ちは、ADSTビットで行うこととする.(ex2)
動画2:演習問題2の動作
3.上記の演習問題1のプログラムのA/D変換の終了待ちをADCSRのADFビットで行うように変更せよ.動作の見た目は演習問題1と同じである.(ex3)
動画3:演習問題3の動作
4.SW6 を押して離したときに,アナログジョイスティックの上下方向の変化をA/D変換し,結果を10進数4桁で hterm に表示させるプログラムを作成せよ.(ex4)
動画4:演習問題4の動作
5.SW6 押して離したときに,アナログジョイスティックの上下方向,SW4 を押して離したときに,アナログジョイスティックの左右方向の変化をA/D変換し,結果を10進数4桁で hterm に表示させるプログラムを作成せよ.(ex5)
動画5:演習問題5の動作
6.上記の 4 のプログラムでA/D変換結果の上位8ビットを使い、10進数3桁として7セグメントLEDに表示させるプログラムを作成せよ。(ex6)
動画6:演習問題6の動作
7.上記の 5 のプログラムで7セグメントLEDへ表示させている内容をLCDの上段と下段に表示させるプログラムを作成せよ。(ex7)
動作7:演習問題7の動作