可変抵抗のツマミを回してLEDの点滅速度を可変します
〔PICの動かせ方入門に戻る〕
半固定抵抗とLEDを配線し、半固定抵抗の値からLEDの点滅速度を可変させます。
今回使用するピン番号は1番(VDD)と8番(VSS)と5番(GP2)と3番(AN3)です。
3番ピンがアナログ入力で5番ピンがデジタル出力です。
@まずは、下記図画面の様に配線しましょう。
PICの1番ピンに電源+5V、8番ピンに電源GND(-)側、5番ピンにLEDの足が長い方を接続します。
また、3番ピンに半固定抵抗の中央の足を接続します。
AMPLAB IDEを起動させます。
B下記がプログラムソースです、
プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
プログラムソースをダウンロードしてプロジェクトに取込む事も出来ます。
---------------------------------------------------------------------
#include <pic.h>
#include <htc.h> // delay用に必要
#define _XTAL_FREQ 4000000 // delay用に必要(クロック4MHzを指定)
// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(GP3)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し:内部クロック4MHz使用する(INTIO)
__CONFIG(UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;
// 指定した時間(ms)だけウエイトを行う処理
void Wait(unsigned int num)
{
int i ;
// numで指定した回数だけ繰り返す
for (i=0 ; i<num ; i++) {
__delay_ms(1) ; // 1msプログラムの一時停止
}
}
// アナログ値の入力処理
unsigned int adconv()
{
unsigned int temp;
GODONE = 1 ; // PICにアナログ値読取り開始を指示
while(GODONE) ; // PICが読取り完了するまで待つ
temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする
temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です
return temp ;
}
// メインの処理
void main()
{
unsigned int num ;
CMCON = 0x07 ; // コンパレータは使用しない
ANSEL = 0b00011000 ; // アナログはAN3を使用し、残りをすべてデジタルI/Oに割当
TRISIO = 0b00010000 ; // AN3だけ入力その他のピンは出力に割当てる
GPIO = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
ADCON0 = 0b10001101 ; // アナログ変換情報設定
__delay_us(20) ; // アナログ変換情報が設定されるまでとりあえず待つ
while(1) {
num = adconv() ; // 3番ピン(AN3)から半固定抵抗の値を読み込む
GPIO2 = 1 ; // 5番ピンにHIGHを出力する(LED ON)
Wait(num) ; // 読込んだ値の数だけ処理の一時停止を行う
GPIO2 = 0 ; // 5番ピンにLOWを出力する(LED OFF)
Wait(num) ;
}
}
---------------------------------------------------------------------
CコンパイルとPIC書き込みを実行して下さい。
DPICをブレッドボードに取付けて、抵抗のツマミを回してみて下さいLEDが点滅すると思います。
《やさしく解説》
LEDについて
LEDには極性が有ります、
足の長いアノード側を5番ピンの方に、足の短いカソード側を電流制限抵抗の方に接続します。
また、LEDには流せる電圧と電流が決まっています、必ず電流制限抵抗を付けましょう。
電流制限抵抗
LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあると思います、
例えばIFが10mAで、VFが2.5Vで、picのデジタル出力が5Vとすると、
(pic出力−順方向電圧)÷ 順方向電流 = 電流制限抵抗値
よって、(5V - 2.5V) ÷ 0.010A = 250Ω(250Ωは無いので240Ωか270Ωを使います)
10mAは0.010AというふうにAに変換して計算します。
だいたい120Ω〜680Ωのあたりだと思います。
LEDは5mAくらいで使った方が目に優しいでしょう、で470Ω?
また、抵抗はLEDのアノード側とカソード側のどちら側に接続してもOKです。
注意) PICの出力は20mA程しか流せません、これ以上のLED電流を流す場合は
PICの出力をトランジスタで一旦受けてからLEDをつながないといけません。
マイコン出力をトランジスタで一旦受ける場合はこちらを参考にして下さい。
半固定抵抗について
アナログ入力は電圧の0〜5Vを0〜1023の値に変換して読み込みます。
半固定抵抗は今回10kΩを使用で、だいたい60〜530位で読み込まれます。
(だから、LEDは約60ms〜530ms程で点滅するでしょう)
ツマミを右に回せばLEDの点滅速度は速くなり、左に回せば遅くなります。
また、半固定抵抗の配線を5V(赤線)とGND(黒線)で入れ替えると、
右に回しでLEDの点滅速度は遅くなり逆になります。
プログラムについて
プログラムソースのコメントを読んでもらえば大体何をしているのか分かると思います。
while(1)
main()の中の処理は1回実行すると終了します、
だからwhile(1)の、{ }の中に処理を書き込めば無限に繰り返します。
もしwhile(1)を記述しないとプログラムはすぐ終了し、ツマミを回してもLEDは点滅しません。
__delay_ms(value)
プログラムを指定した時間だけ一時停止します。
value:停止したい時間を指定します、単位はミリ秒です。
クロック4MHz動作では197msまでしか指定できません。
Wait(num)
numにて指定した数値だけウエイト動作を行います、数値はms秒です。
半固定抵抗から読込んだ数値をそのまま使っています。
adconv()
アナログの値を読み取ります、値は0〜1023の範囲です。
アナログI/O
アナログピンの設定は下記のレジスターにて設定します。
ANSEL = 0b00011000 ; アナログ入力を行うピンの指定をします
赤数字右からAN0(7ピン),AN1(6ピン),AN2(5ピン),AN3(3ピン)の順
青文字部分でPICがA/D変換を行う速度のクロックを指定します。
000:FOSC/2 001:FOSC/8 010:FOSC/32
100:FOSC/4 101:FOSC/16 110:FOSC/64
この設定で速度Fosc/8(2.0us)、AN3をアナログピンとするです
指定したAN3のアナログピンを入力に指定するには下記のレジスターにて設定します。
TRISIO = 0b00010000 ; 1で入力、0で出力(4番2番ピンはアナログ使用できません)
赤数字右からAN0,AN1,AN2,AN3の順、この例ではAN3を入力にするです
アナログ変換情報設定
ADCON0 = 0b10001101 この設定でAN3から読込めと指示しています
他のAN3以外から読込みたい場合は、赤数字の部分を変更します。
AN0=00,AN1=01,AN2=10,AN3=11 と変更して下さい。
赤数字の部分以外の設定はこのまま使用して下さい。
また、ADCON0の設定には20usほどかかります、delayを入れておきましょう。
《その他》
今回は5番・3番ピンを使用しましたが他のピンを使用する場合は下記の表を参照して下さい。
また、4番ピンGP3は入力しか出来ません、出力不可、アナログ入力不可です。
ちなみにGPIOはジィピィアイオーです、ゼロではないです。
ピン番号 |
7 |
6 |
5 |
4 |
3 |
2 |
ピンの名前 |
GP0 |
GP1 |
GP2 |
GP3 |
GP4 |
GP5 |
入出力ビット名 |
GPIO0 |
GPIO1 |
GPIO2 |
GPIO3 |
GPIO4 |
GPIO5 |
アナログピンの名前 |
AN0 |
AN1 |
AN2 |
|
AN3 |
|
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.