7.A/Dコンバーターを使ってみよう


ここでは、A/Dコンバーターの使い方を学びます。


CdSセンサー入力とLED点灯

CdSセンサー入力とLED点灯

CdSセンサーとは光センサーの一種です。光制御の可変抵抗で、明るさに応じて抵抗の値が変化します。明るいときは抵抗は小さくなり、暗いときは抵抗の値が高くなります。この値を利用して次ののCdSLEDプログラムはセンサーが暗くなった(抵抗値が高い)ときの値をA/D変換させ、その値を用いてカラーLEDの色を変化させています。

 CdSの部分の回路を考えてみましょう。通常の生活空間の明るさでは数キロオームになります。ここで、もしその抵抗が1kΩだとします。すると、以下の回路の中点の電圧は電源電圧の割合で、470/(1000+470)=0.32となります。
次に、暗くして20kΩになったとしましょう。その時の割合は、470/(20000+470)=0.023となります。ここで電源電圧を255としてみます。するとそれぞれ81.53、5.86となりますが、コンピュータの中では小数点はこの場合ありませんので81、5となります。
ADコンバーターは実際には電源電圧の1024分割(10bit精度)で計測できますが、8bit精度(0~255)での81と5でも十分に明るさを判別することができることがわかります。ですから、全ての計測できるbit数(10bit)を利用する必要がなく、8bit程度の精度で判別できることになります。
と言うよりは、そうできるように設計します。何故ならば、10bit精度にするとレジスタに2回アクセスし、且つ整数型に変換する時間がかかります。PICのような非力なCPUでは無駄な精度の高い計算は避けたいものです。従って、この場合は計測データを左詰めにし、上位8bitを利用するのが賢い選択になります。
 このように、非力なCPUでは無駄な高精度を使うのはやめましょう。

次のプログラムを実行して確認してみましょう。
CdSの上に手を翳すと、その具合でLEDの色が変わります。

「CdSLED」プログラム
// ファイル名 CdSLED.c
// CdSの値でLEDを光らす
#include <htc.h> 
__CONFIG(PWRTEN&HS&WDTDIS&UNPROTECT&MCLRDIS&BORDIS&IESODIS&FCMDIS);

#define _XTAL_FREQ 20000000
#define ANS4 0x10
main()
{
  unsigned int LED;
  unsigned int value;
  PORTA = 0;                // PORTAを0にする
  TRISA = 0;                // PORTAを出力に設定する
  ANSEL  = ANS4;            // アナログ入力をAN4をON  左前のCdS
  ADCON0 = 0x11;            // ADFM=0(左詰)  AN4 adOn
  OPTION = 0xd3;            // FOSC/4 プリスケーラ1/16

  while(1) {
    GODONE = 1;             // A/D 変換開始
    while(GODONE);          // 変換完了
    value = ADRESH;
    LED = value / 8 + 1;
    PORTA =  LED++ % 7 + 1; // カラーLED
  }
}

 

ANSEL = ANS4;
ANSELレジスタのAN4をアナログ入力をON、その他をデジタルIOに指定します。

ANSELについては「6.LEDを光らせてみる」で簡単に説明しましたが、AN4を使うことを意識的に書いています。また、同時にPORTAのLED出力のためにAN0~AN2はデジタルIOに設定しています。間違える人が多いのですが、AN0~AN2まではPORTAのbit0~bit2に対応していますが、それ以外はPORTAではありません。下図を参照してください。AN4はPORTCのbit0に対応しています。


ADCON0 = 0x11;
ADFM=0, VCFG=0, CHS=0100(AN4), ADON=1
のように設定しています。下図参照。

OPTION = 0xd3;
RABPU=1, INTEDG=1, T0SE=0, PSA=0, PS=011(1/16)
タイマーに送られるクロックは20/4/16=312.5kHz と設定しています。他の設定はこの場合関係ありません。下図参照。

GODONE = 1;
ADON=1の状態でGODONE=1にするとADコンバータが変換開始します。変換結果はADFMの値に従って右詰か左詰めにされ、ADRESHとADRESLに入ります。 下図参照。

目次へ戻る