可変抵抗のツマミを回してLEDの明るさを可変します
〔PICの動かせ方入門に戻る〕
半固定抵抗とLEDを配線し、半固定抵抗の値からLEDの明るさを可変させます。
LEDはPICのCCP1機能(PWM)を利用して明るさを可変させます。
こちらのHPサイト「合同会社パレットソフト」さんのページにLEDとPWM制御について
解りやすく書いて有ります、”LEDの輝度調整”の項を参考にして下さい。
今回使用するピン番号は14番(VDD)と5番(VSS)と9番(CCP1)と17番(AN0)です。
17番ピンがアナログ入力で9番ピンがアナログ出力(PWM)です。
@まずは、下記図画面の様に配線しましょう。
PICの14番ピンに電源+5V、5番ピンに電源GND(-)側、9番ピンにLEDの足が長い方を接続します。
また、17番ピンに半固定抵抗の中央の足を接続します。

AMPLAB IDEを起動させます。
B下記がプログラムソースです、
プロジェクトを作成して新規ファイルにコピーペーストして貼り付けて下さい。
プログラムソースをダウンロードしてプロジェクトに取込む事も出来ます。
---------------------------------------------------------------------
#include <pic.h>
#include <htc.h> // delay用に必要
#define _XTAL_FREQ 8000000 // delay用に必要(クロック8MHzを指定)
// アナログ出力CCP1はRB3の9番ピンから行う
// デバッグしない(DEBUGDIS):低電圧プログラミング機能使用しない(LVPDIS)
// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し(WDTDIS):内部クロックを使用する(INTIO)
__CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;
// アナログ値の入力処理
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 ;
OSCCON = 0b01110100 ; // 内部クロックは8MHzとする
ADCON1 = 0b10000000 ; // AN0-AN4をアナログI/Oに割当
TRISA = 0b00011111 ; // 1で入力 0で出力 AN0-AN4のみ入力に設定(RA5は入力専用)
TRISB = 0b00000000 ; // RB0-RB7全て出力
ADCON0 = 0b01000001 ; // アナログ変換情報設定(AN0から読取る)
__delay_us(20) ; // アナログ変換情報が設定されるまでとりあえず待つ
CCP1CON = 0b00001100 ; // PWM機能を使用する
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
CCPR1L = 0 ; // デューティ値は0で初期化
CCPR1H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 124 ; // PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
while(1) {
num = adconv() ; // 17番ピン(AN0)から半固定抵抗の値を読み込む
CCPR1L = num/4 ; // アナログ値からのデータでデューティ値を設定
}
}
---------------------------------------------------------------------
CコンパイルとPIC書き込みを実行して下さい。
DPICをブレッドボードに取付けて、抵抗のツマミを回して下さいLEDの明るさが変わると思います。
《やさしく解説》
LEDについて
LEDには極性が有ります、
足の長いアノード側を9番ピンの方に、足の短いカソード側を電流制限抵抗の方に接続します。
また、LEDには流せる電圧と電流が決まっています、必ず電流制限抵抗を付けましょう。
電流制限抵抗
LEDの順方向電流(IF)と順方向電圧(VF)がデータシート等に書いてあると思います、
例えばIFが10mAで、VFが2.5Vで、arduinoのアナログ出力が5Vとすると、
(arduino出力−順方向電圧)÷ 順方向電流 = 電流制限抵抗値
よって、(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の明るさは暗くなり、左に回せば明るくなります。
また、半固定抵抗の配線を5V(赤線)とGND(黒線)で入れ替えると、
右に回しでLEDの明るさは明るくなり逆になります。
プログラムについて
プログラムソースのコメントを読んでもらえば大体何をしているのか分かると思います。
while(1)
main()の中の処理は1回実行すると終了します、
だからwhile(1)の、{ }の中に処理を書き込めば無限に繰り返します。
もしwhile(1)を記述しないとプログラムはすぐ終了し、ツマミを回してもLEDは点滅しません。
__delay_us(value)
プログラムを指定した時間だけ一時停止します。
value:停止したい時間を指定します、単位はマイクロ秒です。
クロック8MHz動作では98560usまでしか指定できません。
__delay_msなら98msまでです。
adconv()
アナログの値を読み取ります、値は0〜1023の範囲です。
アナログI/O
アナログピンの設定は下記のレジスターにて設定します。
ADCON1 = 0b10000000 ; この設定はAN0-AN4を全てアナログI/Oに割当る場合です。
その他の設定は赤数字文字部分を変えて設定しますが、方法はこちらを参照して下さい。
また、赤数字文字部分以外は今回そのまま使用して下さい。
TRISA = 0b00011111 ; この設定はAN0-AN4のみ入力に設定するです(RA5は入力専用)
1で入力、0で出力、右からAN0,AN1,AN2,AN3,AN4、残りはデジタルです。
アナログ変換情報設定
ADCON0 = 0b01000001 ; この設定でAN0から読込めと指示しています
他のAN0以外から読込みたい場合は、赤数字の部分を変更します。
AN0=000,AN1=001,AN2=010,AN3=011,AN4=100 と変更して下さい。
赤数字の部分以外の設定は今回このまま使用して下さい。
また、ADCON0の設定には20usほどかかります、delayを入れておきましょう。
アナログ変換を行う速度のクロック設定方法 (*1)
ADCON0とADCON1レジスターの組み合わせで行います。
ADCON1 = 0b00000000 ;
ADCON0 = 0b00000000 ;
赤文字部分を下記表に合わせて変更します、今回のプログラム設定ではFosc/8を採用しています。
クロック |
ADCON1 |
ADCON0 |
Fosc/2 |
0 |
00 |
Fosc/8 |
0 |
01 |
Fosc/32 |
0 |
10 |
Fosc/4 |
1 |
00 |
Fosc/16 |
1 |
01 |
Fosc/64 |
1 |
10 |
PWM機能設定
PWMを使用する為には以下の設定が必要です、
この設定は1KHzの周波数で、PWM制御する設定です。
LEDならこの位で良かろうと、適当なんですが、
少し詳しい説明はこちらを参照して下さい。
CCP1CON = 0b00001100 ; // PWM機能を使用する
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
CCPR1L = 0 ; // デューティ値は0で初期化
CCPR1H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 124 ; // PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
《その他》
今回は9番・17番ピンを使用しましたが他のピンを使用する場合は下記の表を参照して下さい。
また、4番ピンRA5は入力しか出来ません、出力不可です。
ポートA
ピン番号 |
16 |
15 |
4 |
3 |
2 |
1 |
18 |
17 |
デジタル入出力ビット名 |
RA7 |
RA6 |
RA5 |
RA4 |
RA3 |
RA2 |
RA1 |
RA0 |
アナログ入力ピン名 |
|
|
|
AN4 |
AN3 |
AN2 |
AN1 |
AN0 |
ポートB
ピン番号 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
デジタル入出力ビット名 |
RB7 |
RB6 |
RB5 |
RB4 |
RB3 |
RB2 |
RB1 |
RB0 |
アナログ出力ピン名 |
|
|
|
|
CCP1 |
CCP1 |
|
|
注)CCP1はアナログ出力(PWM)出来ますが、8番か9番ピンのどちらか一方のみです。
8番ピンを使用する場合は、__CONFIG(CCPRB2)とコンフィグを書き直して下さい。
追記(*1) 2011/12/10
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.