A/D変換機能を使う(単一モード)

A/D変換:アナログ、デジタル変換のスキャンモードを試したので、
今度は単一モードを実行させます

 

AD変換を目的や用途に合わせて使いこなすため、A/D変換の単一モードです。


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変換

 

  1. 入力端子に電圧を入力する ( AN0~ )
  2. A/D変換しろの命令をする ( ADCSR.ADST→1 )
      変換が終わると
  3. A/D変換終了フラグが1になり 終わったことがわかる
    (ADCSR.ADF→1 と同時に レジスタにA/D変換結果が入る
     ( 結果→ADDRA~D   )
      
  4. レジスタの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変換の精度となる桁数は ビットシフト>> することで丸め、荒くできる。

設定

 

ADCSR
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

 

 

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena