可変抵抗のツマミを回してLEDの明るさを可変します
〔PICの動かせ方入門に戻る〕
半固定抵抗とLEDを配線し、半固定抵抗の値からLEDの明るさを可変させます。
LEDはCCP/ECCPを利用して明るさを可変させます。
こちらのHPサイト「合同会社パレットソフト」さんのページにLEDとPWM制御について
解りやすく書いて有ります、”LEDの輝度調整”の項を参考にして下さい。
《CCP機能で使用するPICピン構成》
水色が標準CCP機能で、CCP2/3/4/5の4個が有りここの実験ではCCP4から出力します。
緑色が拡張型CCP機能で、ECCP1の1個でここの実験ではECCP1のP1Dから出力します。
《CCP機能でPWM出力》
CCP機能は"PWM機能"の他に、外部イベントの継続時間を計測する"キャプチャー機能"と
あらかじめ設定した時間が経過した時点で外部イベントをトリガする"コンペア機能"が有ります。
ここでは"キャプチャー機能"と"コンペア機能"については触れていません。
(PWM制御についての少し詳しい話はこちらのページを参考にして下さい。)
ここで使用するCCPモジュールはCCP4で、RC7(18番ピン)にLEDを取り付けます。
尚、CCP4の他にCCP2/CCP3/CCP5からも出力可能です。
PICの20番ピンに電源+5V、8/19番ピンに
電源GND(-)側を配線します。
18番ピンにLEDの足が長い方(アノード)に抵抗を
介し接続します。
又、2番ピン(AN0)に半固定抵抗の中央の足を
接続します。
18F26K80は電圧レギュレータを内蔵しているので
6番ピンに10uF(16V)のセラミック(タンタル)
コンデンサーを取り付けます。
プログラムについて
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
VRtoLED21.zip
プログラムソースをダウンロードしたら解凍して下さい。
MPLAB Xにてプロジェクトを作成し、解凍ファイルをプロジェクトディレクトリにコピーして
プロジェクトに取込んで下さい。
次にコンパイルとPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.40コンパイラを使用しています。
PICをブレッドボードに取付けて、半固定抵抗のツマミを回して下さいLEDの明るさが変わると思います。
アナログ関連関数について
adconv( )
アナログ(半固定抵抗)の値をAN0(RA0)から読み取ります、値は0〜4095の範囲です。
(18F26K80のアナログは12ビットでの読み取りとなります。)
※ ADCにはエラッタが有ります。
「12-bltのA / D性能は、データシートのA/Dコンバータの仕様外です。
12-bt A/Dとして使用する場合、考えられる問題は高オフセット誤差です。
A/Dは最大225 LSBsまでの高いオフセット誤差を持つ事があります。
12ビットA/D問題はこのパートの将来の改訂(A7レビジョン以降?)で修正される予定です。」
アナログ関連レジスターについて
アナログI/O
アナログピンの設定は下記のレジスターにて設定します。
ANCON0 = 0b00000001 ; アナログ入力を行うピンの指定をします
赤数字右からAN0(2ピン),AN1(3ピン),AN2(4ピン),AN3(5ピン),AN4(7ピン)の順
1でアナログ、0でデジタル、この設定例はAN0をアナログで使用です。
ANCON1 = 0b00000000 ; アナログ入力を行うピンの指定をします
赤数字右からAN8(22ピン),AN9(25ピン),AN10(21ピン)の順
この設定例は全てデジタルで使用です。
指定したAN0のアナログピンを入力に指定するには下記のレジスターにて設定します。
TRISA = 0b00000001 ; この設定はAN0(RA0)のみ入力に設定するです。
1で入力、0で出力、右からAN0,AN1,AN2,AN3,未割付け,AN4
※ ピンのデフォルトはアナログ入力となっています。
アナログ変換情報設定
18F26K80では12ビット読み込みで、差動入力読み込みも出来る様になっています。
ADCON0 = 0b00000001 ; この設定でAN0から読込めと指示しています
他のAN0以外から読込みたい場合は、赤数字の部分を変更します。
AN0=00000,N1=00001,AN2=00010,AN3=00011,AN4=00100
AN8=01000,AN9=001001,AN10=01010 と変更して下さい。
赤数字の部分以外の設定は今回このまま使用して下さい。
又、ADCON0の設定には8us程掛かります、delayを入れて置きましょう。
ADCON1 = 0b00000000 ;
赤数字部分でA/D変換時の+側リファレンス電圧をどうするかの設定です。
00:VDDのPIC電圧を使用 01:5番ピン接続の外部VREF+を使用。
10:PIC内蔵の固定電圧(2V)を使用 11:PIC内蔵の固定電圧(4.1V)を使用
緑数字部分でA/D変換時の−側リファレンス電圧をどうするかの設定です。
0:VssのPIC電圧を使用する 1:4番ピン接続の外部VREF+を使用する。
青数字部分でアナログ入力の負のチャネル(差動A/D入力)選択ビット
000:VssのPIC電圧を使用(シングル測定モード)
001:AN0(2ピン) 010:AN1(3ピン) 011:AN2(4ピン) 100:AN3(5ピン)
101:AN4(4ピン) 110:AN5(18F26K80未実装) 111:予約
又、それ以外の数字部分の設定は今回このまま使用して下さい。
ADCON2 = 0b10010101 ;
赤数字部分で変換開始までの待ち時間(A/Dアクイジション時間)を設定する。
とり合えずぅ4TAD(010)辺りで良いでしょう。
緑数字部分でA/D変換を行う速度のクロックを設定します。
000:FOSC/2 001:FOSC/8 010:FOSC/32
100:FOSC/4 101:FOSC/16 110:FOSC/64
又、それ以外の数字部分の設定は今回このまま使用して下さい。
CCP4機能設定
CCPのPWMを使用する為には以下の設定が必要です、
この設定は1KHzの周波数で、PWMで制御する設定です。
CCP(PWM)の少し詳しい操作方法は、18F25(26)K22と同じなのでこちらを参照下さい。
CCPTMRS = 0b00000000 ; // CCP4機能はTimer2を使用する
CCP4CON = 0b00001100 ; // PWM機能(モジュール)を使用する
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
CCPR4L = 0 ; // デューティ値は0で初期化
CCPR4H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 249 ; // PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
CCPR4L = num >> 4 ; この行でPWMのデューティ値を変更しています。
CCP2/3/5を利用する場合は、レジスター"CCP1"の文字を"CCP2/3/5"に書き換えます。
又、ここではTimer2を利用していますがTimer4も利用出来ます。(下記参照)
《ECCP機能でPWM出力》
18F26K80には他に拡張型CCP機能でECCP(ECCP1)が有ります。
ECCPのPWMモードには、シングルPWM・ハーフブリッジPWM・フルブリッジPWMが有り、
ハーフブリッジやフルブリッジはモータ等を回すのに使います。
(尚、ECCP1のみなのでハーフブリッジ・フルブリッジの何方か一方のみ利用可能です。)
ここではシングルPWMを利用して、LEDの明るさを可変させてみたいと思います。
ここで使用するECCP1モジュールはP1A/P1B/P1C/P1Dの4つのピンから出力可能ですが、
今回はP1D(24番ピン)にLEDを取り付けます。
PICの20番ピンに電源+5V、8/19番ピンに
電源GND(-)側を配線します。
24番ピンにLEDの足が長い方(アノード)に抵抗を
介し接続します。
又、2番ピン(AN0)に半固定抵抗の中央の足を
接続します。
18F26K80は電圧レギュレータを内蔵しているので
6番ピンに10uF(16V)のセラミック(タンタル)
コンデンサーを取り付けます。
プログラムについて
↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
VRtoLED22.zip
プログラムソースをダウンロードしたら解凍して下さい。
MPLAB Xにてプロジェクトを作成し、解凍ファイルをプロジェクトディレクトリにコピーして
プロジェクトに取込んで下さい。
次にコンパイルとPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.40コンパイラを使用しています。
PICをブレッドボードに取付けて、半固定抵抗のツマミを回して下さいLEDの明るさが変わると思います。
ECCP1機能設定
ECCPのPWMを使用する為には以下の設定が必要ですが、基本はCCP操作と同じ感じですなので、
少し詳しい操作方法は、18F25(26)K22と同じなのでこちらや
こちらを参照下さい。
出力ピンを決める
PSTR1CON = 0b00001000 ; この設定でPWM出力はP1Dのみ出力、P1A/P1B/P1CはOFF。
1:ON 0:OFF
赤数字部分で右からそれぞれP1A/P1B/P1C/P1Dの順です。
PWMタイマーの選択設定
ここではTimer2を利用していますがTimer4も利用出来ます。
CCPTMRS = 0b000001000 ;
赤数字部分の右からCCP1/CCP2/CCP3/CCP4/CCP5の順番に設定します。
Timer2=0 , Timer4=1 この設定でCCP4はTimer4を使用です。
この設定は1KHzの周波数で、PWMで制御する設定です。
CCPTMRS = 0b00000000 ; // CCP1機能はTimer2を使用する
CCP1CON = 0b00001100 ; // PWM機能(シングル出力)を使用する
PSTR1CON = 0b00001000 ; // P1DのRB3ピンのみPWM出力する、P1A/B/CはOFF
T2CON = 0b00000010 ; // TMR2プリスケーラ値を16倍に設定
CCPR1L = 0 ; // デューティ値は0で初期化
CCPR1H = 0 ;
TMR2 = 0 ; // タイマー2カウンターを初期化
PR2 = 249 ; // PWMの周期を設定(1000Hzで設定)
TMR2ON = 1 ; // TMR2(PWM)スタート
CCPR1L = num >> 4 ; この行でPWMのデューティ値を変更しています。
相補PWM出力制御
左図の様にP1CピンがHIGH時はP1DピンはLOWを
出力する様に反転させます(差動出力)、これを
相補PWM出力制御と言います。
下がP1DからPWMを出力する場合でしたが、
CCP1CON = 0b00001100 ; // PWM機能(シングル出力)を使用する
PSTR1CON = 0b00001000 ; // P1DのRB4ピンのみPWM出力する、P1A/B/CはOFF
P1C(アクティブHIGH)とP1D(アクティブLOW)から相補PWMを出力する場合は、
CCP1CON = 0b00001101 ; // PWM機能(シングル出力:相補を行う)を使用する
PSTR1CON = 0b00001100 ; // P1CをPWM出力する、P1Dは反転出力、P1A/BはOFF
CCP1CON = 0b00001101;
赤色部分でPWMの出力パターンを設定します。
1100:P1A、P1C をアクティブHigh、P1B、P1D をアクティブHigh
1101:P1A、P1C をアクティブHigh、P1B、P1D をアクティブLow
1110:P1A、P1C をアクティブLow、P1B、P1D をアクティブHigh
1111:P1A、P1C をアクティブLow、P1B、P1D をアクティブLow
※ 但し、ECCP1の拡張型CCP機能のみ相補PWMを出力可能です。
後ぉ、相補出力PWMも18F25(26)K22と同じなのですが少し操作が追加されています。
PSTR1CON = 0b00000000 ; 相補モード出力割り当てステアリング同期ビット
00:STR[D:A]を参照(上記の様に従来通りの操作)
01:PAとPBが相補出力ペアとして選択されます
10:PAとPCが相補出力ペアとして選択されます
11:PAとPDが相補出力ペアとして選択されます
デッドバンドが出来る様です、ECCP1DEL[7-0]レジスタに値を設定します。
《その他》
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.