ここでは、A/Dコンバーターの使い方を学びます。
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となります。 |
次のプログラムを実行して確認してみましょう。
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に指定します。 |
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に入ります。 下図参照。 |