閲覧総計: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ミリ秒)待つ
        }
    }
}

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

選択肢 投票
はい 5557  
普通 47  
いいえ 57  

اذاعة القران الكريم
اذاعة القران الكريم بث مباشر
اذاعة القران الكريم من القاهره
اذاعة القران الكريم مصر
اذاعة القران الكريم يوتيوب
اذاعة القران الكريم
اذاعة القران الكريم بث مباشر
اذاعة القران الكريم من القاهره
اذاعة القران الكريم مصر
اذاعة القران الكريم يوتيوب
اذاعة القران الكريم
اذاعة القران الكريم بث مباشر
اذاعة القران الكريم من القاهره
اذاعة القران الكريم مصر
اذاعة القران الكريم يوتيوب
اذاعة القران الكريم
اذاعة القران الكريم بث مباشر
اذاعة القران الكريم من القاهره
اذاعة القران الكريم مصر
اذاعة القران الكريم يوتيوب
اذاعة القران الكريم
اذاعة القران الكريم بث مباشر
اذاعة القران الكريم من القاهره
اذاعة القران الكريم مصر
اذاعة القران الكريم يوتيوب

اذاعة القران الكريم اذاعة القران الكريم بث مباشر اذاعة القران الكريم من القاهره اذاعة القران الكريم مصر اذاعة القران الكريم يوتيوب -- be1ch? 2019-03-16 (土) 08:38:09