電子工作3 -12F675 のADC機能を使う(明暗の入力レベルを3個のLEDsで表示)
概要
PIC12F629のように安価で、しかも、10-ビットのADC(Analog-Digital
Converter) まで付いた、何か夢をよぶこのチップを、初心者ながらいじってみたくなりました。PIC12F629とほぼ同じピン配置、違いは4−チャンネルの10-ビットのADCが備わっていることです。ハツモノのADC
をどうやって使うのかがポイントでした。お馴染みの CdS センサからの明暗レベルを電圧レベルに変換し、入力し、その電圧レベルの高さを、LED不点灯と、赤、黄、緑の3個のLEDの点滅で表示しようという実験です。
回路
電子工作2のPIC12F629 の場合との違いは、CdS センサの入力が GP0(ピン7)に、LEDの赤と黄が GP1, GP2 (ピン6、5)に変わったこと、VRが
5K に小さくなったこと等です。
実験中の様子です。CdSセンサや感度調整用のVR
(青い円形状のもの)が見えます。
プログラミング
明るい時は不点灯、暗くなるにつれて、点滅を繰返しながら赤->黄->緑 の順にLEDが点灯する。ADCが10ビットなので、入力範囲は
0-1023 (2の10乗) となる。今回設定した変換のレンジは、Vin を仮の入力値として、Vin>800、 800>=Vin>500、
500>=Vin>300、 Vin=<300 の4レンジ。 それらがそれぞれLEDの不点灯、赤、黄、緑 の点灯に対応する。また、ここではVdd を変換の電圧基準値になるように設定してあるので、例えば、Vdd=5Vの時は、0が0V、1023が5Vに対応する(5000mV/1023=4.88mV/step)。実際に、Vdd=5Vの時に、GP0(ピン7)とGNDの間の電圧と、LEDの点灯・不点灯の間に次の関係があることが分かった。
>3.9V :全LEDsが不点灯
3.9 – 2.5V :赤LED点滅
2.5 - 1.5V :黄LED点滅
1.5V> :緑LED点滅
勿論、上記4レンジの中身を色々変えることによって、点灯・不点灯のさせ方を自由に変えられます。なお、各LEDの点滅パターンは、ON - 0.1sec, OFF – 0.5 sec です。
プログラム
(Basic)
BasicコンパイラPicBasic Pro(PBP V2.45、MicroCode Studio)を使って作成しました。後で分かるようにコメント文(“‘”で始まる)がいっぱい入っていますが、プログラムの本体はADCON0=%10000011で始まり、Goto
ADCloop で終わります。今回も4MHzの内部クロックを使っています。その設定は、ライターで書込む時に行います。ライターにはAKI−PIC プログラマーv.6.2.195を使用。
'ADC675a1.bas - succeeded on 2004.2.6
'Exp. on the use of 12F675's ADC -
each of LEDs
'(R,Y,G) lights with blinking
according to the change
'in the level of input voltage from
CdS sensor, which
'is connected to GPIO.0.
'Pin 1: Vdd (+3-5V)
'Pin 8: Vss
'GPIO.0: input - connected to CdS or
5k pot (0-5V)
'between Vdd and Vss
'GPIO.1: connected to LED (R)
'GPIO.2: connected to LED (Y)
'GPIO.4: connected to LED (G)
ADCON0=%10000011 '=131 (decimal)
'bit7=1(right justified),bit6=0(volt
refer-Vdd),
'bit5-4=0(unimplemented),bit3-2=00(channel0-An0),
'bit1=1(starts right away),bit0=1(on
operation)
ANSEL=%00000001 'sets Fosc/2 and GPIO.0 as ASC
input
'bit7=0(unimplemented),bit6-4=000
(Fosc/2),
'bit3-2-1=0(Digtal I/O
pin),bit0=1(Analog input)
TRISIO=%00000001 'sets all pins except GPIO.0 as outputs
CMCON=7 'turns
off comparator function
Define ADC_BITS 10 '10-bit ADC used
Define ADC_CLOCK 3 'Internal clock used
Define ADC_SAMPLEUS 50 'Sample
timing
Vin var word 'Vin -
voltage input storage
LedR var GPIO.1 'LedR - LED Red
LedY var GPIO.2 'LedY - LED Yellow
LedG var GPIO.4 'LedG - LED Green
ADCloop:
Low LedR
Low LedY
Low LedG
ADCIN 0, Vin 'reads ADC ch-0 and save in Vin
'(range 0-1023)
Pause 500 'Necessary for blinking of LED
If Vin>800 then goto ADCloop 'No
lighting when blight
If (800>=Vin) and (Vin>500)
then goto LR '(of 0-1023)
IF (500>=Vin) and (Vin>300)
then goto LY
If Vin=<300 then goto LG
LR: High LedR
Pause 100
Goto ADCloop
LY: High LedY
Pause 100
Goto ADCloop
LG: High LedG
Pause 100
Goto ADCloop
'Note: Programmer's config. -
FOSC/INTOSC(GP4:I/O),
'MCLRE/Internal, others - default
余談
この実験で、変化する電圧を入力としてPICに取込んで、それを加工して、違った色のLEDで表示させることが出来た。何かに応用できそうです。