A/D変換 単一モード
スキャンモードを試したので、今度は単一モードも実験して練習しておきます。
単一モードは
設定した1つのA/D変換入力端子だけの入力を処理するモードですが、それだけでなくいくつかスキャンモードと違う点があります。
●スキャンモード
A/D変換しろの命令 ( ADCSR.ADST→1 )で、
一度スタートさせると、
* スキャンモードではA/D変換しろの命令はいったんスタートさせるとクリアさせない限り ずっとA/D変換をし続けます。
つまり、一度このプログラムを実行すると、止めない限り、自動的に入力を設定時間ごとに取り込んでA/D変換し続けます。
●単一モード
* 単一モードではA/D変換終了するとA/D変換しろの命令 ( ADCSR.ADST→1 ) は自動的にクリアされる
一度実行すれば、A/D変換しろの命令 ( ADCSR.ADST→1 )はクリアされるので、1度だけA/D変換は実行されます。
再び、A/D変換しろの命令 ( ADCSR.ADST→1 ) をしないと、A/D変換されないので、A/D変換したいときだけさせる用途に使えるでしょう。
プログラム
単一モードプログラム 1回変換
ADscanCASE
#include<3664.h>
void main()
{
int ledp=0 ;
IO.PCR8=0x00F; /* 出力に設定 0000 1111 */
AD.ADCSR.BYTE = 0x38; /* 0011 1000*/
/* A/D変換開始 */
/* スキャンモード */
/* 高速変換 */
/* AN0 */
while(1){
while(AD.ADCSR.BIT.ADF==0); /* 変換結果がでるまで待つ */
ledp=(int)(AD.ADDRA>>13); /*ビットシフト(13ずらす) 上位3桁 #15-#13 をPDR8に入れる
下位ビットの精度は必要ないので
AD.ADDRB -- #15 #14 #13 → #2 #1 #0 → PDR8 -- #2 #1 #0
*/
switch(ledp){
case 0 : IO.PDR8.BYTE=0x00; break; /* 0000 0000 */
case 1 : IO.PDR8.BYTE=0x01; break; /* 0000 0001 */
case 3 : IO.PDR8.BYTE=0x03; break; /* 0000 0011 */
case 5 : IO.PDR8.BYTE=0x07; break; /* 0000 0111 */
case 7 : IO.PDR8.BYTE=0x0F; break; /* 0000 1111 */
}
AD.ADCSR.BIT.ADF=0; /* 終了フラグを0に戻す */
}
}
レジスタの設定を単一モードにして、 A/D変換しろ ADCSR.ADST=1 をループの外に出して、一度だけ実行するようにします。
実行結果
一度だけ実行させるので、プログラム実行時の可変抵抗の量がLEDに反映されます。
しかし、ボリュームを回しても、LEDはスキャンモードのように変化しません。
1度だけしかA/D変換しないためです。
少し、ボリュームを回してマイコンをリセットし、再実行させてみると、またそのときのボリューム値がLEDに反映されます。
何度かボリュームを回して、リセット実行してやってみてください。手動でのプログラム1のようになります。
今回は簡易的にリセットでやってみましたが、
- スイッチの入力をみて、ボタンが押された時だけAD変換させたいとき、
- 必要なときだけA/D変換させたいとき、
- ADCRでの設定を使い、外部入力端子からのコントロールで 一度だけA/D変換させたいとき、
などの用途に使用できるでしょう。
まとめメモ
A/D変換
- 入力端子に電圧を入力する ( AN0~ )
- A/D変換しろの命令をする ( ADCSR.ADST→1 )
↓変換が終わると - A/D変換終了フラグが1になり 終わったことがわかる
(ADCSR.ADF→1 と同時に レジスタにA/D変換結果が入る
( 結果→ADDRA~D )
↓ - レジスタのA/D変換結果を読めばA/D変換結果がわかる (ADDRA~D)
■ 主な特長
- 分解能10Bit -- 1023段階
- 入力チャンネルがこのH8---TINY3664DIP版では4チャンネルです。
- 割り込み発生が可能 --GDL関数ではint_ad (void) になっています。
- 外部信号でA/D変換させられる-----ADCRでの設定
- 単一モード、スキャンモード→1-4CHまで連続変換の2種類
- 単一モードは 1入力だけを変換
- スキャンモードは 連続して次々変換
●スキャンモード
A/D変換しろの命令 ( ADCSR.ADST→1 )で、一度スタートさせると、
* スキャンモードではA/D変換しろの命令はいったんスタートさせるとクリアさせない限り、
ずっと A/D変換をし続けます。
つまり、一度このプログラムを実行すると、止めない限り、自動的に入力を設定時間ごとに取り込んで、A/D変換し続けます。
●単一モード
*単一モードではA/D変換終了すると自動的にクリアされる
一度実行すれば、A/D変換しろの命令 ( ADCSR.ADST→1 )はクリアされるので、
1度だけA/D変換は実行されます。
A/D変換の精度となる桁数は ビットシフト>> することで丸め、荒くできる。
設定
Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
名称 | ADF | ADIE | ADST | SCAN | CKS | CH2 | CH1 | CH0 |
1:変換終了 の合図 |
1 : 割り込みする 0 : 割り込みなし |
A/D変換しろの命令 | 0 : 単一モード 1 : スキャンモード |
1 :高速変換 0 :低速変換 |
チャンネル選択 下記 |
A/D変換結果が入るレジスタ 10Bit
各入力端子は 次のレジスタに結果が入る
- 入力端子AN0 → ADDRA
- 入力端子AN2 → ADDRB
- 入力端子AN3 → ADDRC
- 入力端子AN4 → ADDRD
- twtter
- google+
- hatena