ここでは、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に入ります。 下図参照。 |
