閲覧総計:11324  (本日:1  昨日:1)

LEDの明るさを変える(PWM)(16F1827 XC8)

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覚書」

TS3V0008.JPG16F1827ピン配置.JPG
/* 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ミリ秒)待つ
        }
    }
}

 
★この情報は役に立ちましたか?

選択肢 投票
はい 2  
普通 0  
いいえ 0