電子工作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で表示させることが出来た。何かに応用できそうです。

 

Menu Pageへ戻る    

Topへ戻る