SH7085のA/D変換器(その2)

ここでは、SH7085のA/D変換器の変換モードのスキャンモードについて説明する。

スキャンモードには、2つのモードがある。1つは、1サイクルスキャンモードで、指定されたチャネルすべてを1回変換して終了するモードである。2つ目は、連続スキャンモードである。連続スキャンモードは、指定されたチャネルをA/D変換し続けるモードである。この連続スキャンモードは、自動では終了しないので、プログラムで明示的にADSTビットを0にして停止させなければならない。


1サイクルスキャンモード

シングルモードとスキャンモード(1サイクルスキャンと連続スキャンの両方をさす)の切り替えは、ADCSRレジスタのADMビットで行う。

図1:ADCSRレジスタ

 ADMは、AD Mode の略語でその名の通り、AD変換のモードを切り替えるビットである。ビットフィールドは、2ビットあり、00 ~ 11 までの4通りの設定が可能である。下記にそれぞれの設定の内容を示す。

  • 00 : シングルモード
  • 01 : 4チャネルスキャンモード
  • 10 : 8チャネルスキャンモード(SH7085 では動作しない)
  • 11 : 2チャネルスキャンモード

上記の設定のうち、00 以外の値を設定すると スキャンモードになる。SH7085 のスキャンモードでは、2チャネルスキャンモードか4チャネルスキャンモードを利用する。

2チャネルスキャンモードも4チャネルスキャンモードも必ず2チャネルや4チャネルA/D変換するのではなく、最大2チャネルまたは4チャネルをA/D変換するという意味である。どのチャネルをA/D変換するかは、ADCSRレジスタのCHビットで設定する。表1に2チャネルスキャンモードでのCH の設定、表2に4チャネルスキャンモードでのCHの設定を示す。

表1:2チャネルスキャンモードの設定

 

表2:4チャネルスキャンモードの設定

 

ADCSRレジスタのADM ビットを 00 以外のスキャンモードに設定したとしても、CH ビットの初期値が 0 なので、1チャネルしかA/D変換されないので注意が必要である。

また、ADM や CH ビットを設定するときは、必ずA/D 変換器が停止している状態で設定すること。つまり、ADST が 0 のときに設定を行うこと。

 プログラム1: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.ADCSR.BIT.ADM = 3;
 7:   AD0.ADCSR.BIT.CH = 1;
 8:   AD0.ADCR.BIT.ADST = 1;
 9:   while(AD0.ADCR.BIT.ADST);
10:   AD0.ADCSR.BIT.ADF = 0;
11:   printf("ADDR0 = %04dnADDR1 = %04d n",
                                       AD0.ADDR0 >> 6, AD0.ADDR1 >> 6);
12:   while(1);
13: }

 

6行目で2チャネルスキャンモードに設定している。ミームスのアナログジョイスティックは、上下左右方向の検出にAN0 と AN1 を使っているので、2チャネルの設定でA/D 変換が可能となる。7行目でAN0 と AN1 の2チャネルの設定を行っている。この行を忘れると AN0 しかA/D変換されないので、必ず設定すること。あとは、シングルモードと同じでA/D変換をスタートさせて、終了するのを待つだけである。

具体的な動作を下記の動画で確認すること。

YouTube Preview Image

動画1:プログラム1の動画

では、下記から1サイクルスキャンモードの演習用ワークスペースをダウンロードして演習を行うこと。

プログラムソースの ex1 は,サンプルプログラムである.

 adc_1scan.zip


演習問題

下記は、A/D 変換の1サイクルスキャンモードを使った演習問題である。特に断りが無い限り、A/D変換のモードは1サイクルスキャンモードでAN0 と AN1 をA/D変換する2チャネルスキャンモードに設定すること。また、A/D変換の終了待ちについても特に指定が無い限り、ADST と ADF のどちらを使ってもよいこととする。

 
1.サンプルプログラム(ex1)をビルドし、動作を確認せよ.
 

2.プログラム1のサンプルプログラムを参考に、A/D 変換の終了待ちを ADF ビットで行うプログラムを作成せよ。(ex2)

YouTube Preview Image

動画2:演習問題2の動作

3.SW6 でA/D 変換を開始し、結果をhterm に表示するプログラムを作成せよ。(ex3)

YouTube Preview Image

動画3:演習問題3の動作

4.SW6 でA/D 変換を開始し、結果をLCD に表示するプログラムを作成せよ。(ex4)

YouTube Preview Image

 動画4:演習問題4の動作


連続スキャンモード

連続スキャンモードに設定するには、ADCSR レジスタの ADCS ビットを 1 に設定すればよい。ADCS ビットは、0 で1サイクルスキャンモード、1 で連続スキャンモードを指定することができる。ただし、シングルモードで使う場合は、このビットは無効となり意味をなさない。

連続スキャンモードの注意点は、シングルモードや1サイクルスキャンモードのように、A/D変換が終了すると、ADST ビットが 0 にならない点である。

つまり、連続スキャンモードでは、A/D 変換の終了は、ADF ビットで確認するしかない。

 プログラム2:連続スキャンモードのサンプルプログラム

 1: #include "iodefine.h"
 2: #define printf ((int (*)(const char *,...))0x00007c7c)
 3:
 4: void main(void) {
 5: STB.CR4.BIT._AD0 = 0;
 6: AD0.ADCSR.BIT.ADM = 3;
 7: AD0.ADCSR.BIT.ADCS = 1;
 8: AD0.ADCSR.BIT.CH = 1;
 9: AD0.ADCR.BIT.ADST = 1;
10: while(1) {
11:   while(!AD0.ADCSR.BIT.ADF);
12:   AD0.ADCSR.BIT.ADF = 0;
13:   printf("ADDR0 = %04dnADDR1 = %04d n",
                                      AD0.ADDR0 >> 6, AD0.ADDR1 >> 6);
14: }

 

上記のサンプルプログラムは、1サイクルスキャンモードとほぼ同じである。異なるのは、7行目のADCS ビットの設定のみである。動作を下記の動画1に示す。

YouTube Preview Image

動画1:プログラム2の動作

では、下記から連続スキャンモードの演習用ワークスペースをダウンロードして演習を行うこと。

プログラムソースの ex1 は,サンプルプログラムである.

adc_nscan.zip


演習問題

下記は、A/D 変換の連続スキャンモードを使った演習問題である。特に断りが無い限り、A/D変換のモードは連続スキャンモードでAN0 と AN1 をA/D変換する2チャネルスキャンモードに設定すること。

 
1.サンプルプログラム(ex1)をビルドし、動作を確認せよ.
 

2.SW6 でA/D 変換をスタートさせて、SW4 でストップさせるプログラムを作成せよ。(ex2)

YouTube Preview Image

動画2:演習問題2の動作

3.SW6 でA/D 変換をスタートさせて、SW4 でストップさせ、結果をLCD へ表示させるプログラムを作成せよ。(ex3)

YouTube Preview Image

動画3:演習問題3の動作

4.SW6でA/D 変換をスタートさせて、SW4 でストップさせ、結果をLCD へ表示させるプログラムを作成せよ。ただし、CMT1 と使って10ms ごとに変換結果を取得するようにせよ。(ex4)

YouTube Preview Image

 動画4:演習問題4の動作

 

Copyright © 2012-2020 ミームス(MEMEs)のサポートページ All rights reserved.
This site is using the Desk Mess Mirrored theme, v2.5, from BuyNowShop.com.