#freeze
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
*LEDの明るさを変える(PWM)(16F1827 XC8) [#lf796826]

PWM機能の使い方を確認する目的で、PWM信号のdutyを変更し、LEDの明るさを
変えるプログラムを作成した。
新型の16F1XXXシリーズは、旧16Fシリーズと比較してPWM機能がとても高機能に
なっているが、その分操作法が風雑になっている。
今回はCCP(RA3)からPWM信号を発振する。Timer2を使用する。
【ポイント】
・16F1827のPWM機能に関する解説は↓こちらのページに詳しい
http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/16F1827/memo.htm
PICの動かせ方入門「16F1827覚書」

|&attachref(TS3V0008.JPG,zoom,200x300,button){新しい写真添付};|&attachref(16F1827ピン配置.JPG,zoom,200x250,button){新しい写真添付};|

 /* PWM機能の確認(LEDの明るさを徐々に変える)
  * PIC16F1827
  * XC8 v1.20
  * LED:RA2,RA3
  */
 #include <xc.h>
 
 #pragma config FOSC = INTOSC, WDTE = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
 #pragma config PLLEN = OFF, STVREN = OFF, LVP = OFF
 
 //__delay_us(), __delay_ms()へのクロック情報の設定
 #define _XTAL_FREQ 8000000 //PICのクロックをHzで設定(8MHz)
 
 int main(void) {
     //使用変数の定義
     unsigned int dutycycle; //0〜65535
 
     //PICの初期設定
     OSCCON = 0b01110000; //PLL:OFF, 内部クロック8MHzで駆動
     ANSELA = 0b00000000; //RA4(AN4)-RA0(AN0)は全て0:デジタルI/Oとする
     TRISA = 0b00000000; //PORTA全てを0:出力に設定
     PORTA = 0b00000000; //PORTAの中身をきれいにする
 
     //CCP3(RA3)へPWM信号を出力(Timer2使用)
     //PWM各種設定値の計算
     //クロック8MHz Tosc = 0.125μsの時
     //3000HzのPWM信号を発信する場合
     //
     //周期 = 3000Hz = 1/3000 = 333μs
     //(PR2の範囲は0〜255)
     //Timer2のプリスケール 4
     //周期 = (PR2 + 1) * 4 * Tosc * (Timer2のプリスケール値)であるから
     //PR2 = (周期 / (4 * Tosc * (Timer2のプリスケール値)) - 1
     //PR2 = (333 / (4 * 0.125 * 4)) - 1
     //PR2 = 165
     //
     //PWM分解能 DC1(Max)は
     //duty = DC1 * Tosc * (Timer2のプリスケール値)であるから
     //DC1 = duty / (Tosc * (Timer2のプリスケール値))
     //DC1(Max) = 333 / (0.125 * 4)
     //DC1(Max) = 666
 
     //PWM各種条件設定
     //CCP3(RA3)へPWM信号を出力
     CCPTMRS = 0b00000000; //CCP3はTimer2使用に設定
     CCP3CON = 0b00001100; //PWMモードを使用する
     T2CON = 0b00000001; ////プリスケール 4に設定
     PR2 = 165; //PWM周波数3000Hzに設定
     TMR2 = 0; //Timer2カウンターをクリアー
     T2CONbits.TMR2ON = 1; //Timer2 ON
 
     //メイン処理
     LATAbits.LATA2 = 1; //RA2:パワーオンを示すLED点灯,照度比較用LED
     while(1) {
         for(dutycycle = 0; dutycycle < 666; dutycycle++) { //3000Hz時の分解能は666
             //LEDの明るさを徐々に変える
             //dutycycleの変更
             //解像度10ビットのうち上位8ビットをCCPR3Lレジスタに格納
             CCPR3L = dutycycle >> 2;
             //解像度10ビットのうち下位2ビットをCCP3CONレジスタの4,5ビットへ格納
             CCP3CON |= (dutycycle & 0x0003) << 4;
             __delay_ms(10); //0.01秒(=10ミリ秒)待つ
         }
     }
 }
 
★この情報は役に立ちましたか?
#vote(はい[2],普通[0],いいえ[0])

#comment_nospam