PIC18F46K22でPWMによりLEDの明るさを調整する(C言語)

icon 項目のみ表示/展開表示の切り替え

概要

PIC18F46K22 のTimer2でCCP3を用いLEDの明るさを1024段階に調整する。
回路はPIC18F46K22でLEDを点滅(アセンブラ)のとおりである。
PWMの設定方法は、PIC18 PWMの設定例を参照されたい。

プログラムの説明

メインプログラムでCCP3とタイマー2を関連付けてPRレジスタに周期を設定してからタイマー設定(OpenTimer2)を行う。
デューティ比はSetDCPWM3関数で設定する。 デューティ比0~100%まで1024分の1の分解能で6.25m秒ごとに明るさを連続的に変化させる。
CCP3でPWMを用いているため、IOで直接LowやHiを設定せずにデューティ比を調整できる。

タイマー設定値

FOSC/4=16MHz
プリスケーラ 1:4
PR2 255
周期 16MHz/4/(1+256)=15.625KHz

ソースファイル

以下のファイルで構成されている
pwm0c.c ・・・ メインプログラムと割り込み処理プログラム

ソースファイルのダウンロード pwm0c.zip


/*
 * timer2+CCP3(PWM)よるLEDの明るさ変更サンプル Version 1.00
 * File:        pwm0c.c
 * Target:      PIC18F46K22 64MHz
 * コンパイラ:   Microchip MPLAB XC8 C Compiler V1.20
 * 書き込み:     PICKit 3
 * リリース:     2014/02/16 22:50
 *
 * 接続
 *   RB5(CCP3) lowを出力すると点灯
 */

#include <p18f46k22.h>
#include <plib\delays.h>
#include <plib\timers.h>

#pragma config  FOSC = HSHP,PRICLKEN=ON,PLLCFG=ON,WDTEN=OFF,LVP=OFF

void SetDCPWM3(unsigned int c){
    CCPR3L = c>>2;
    CCP3CON &= 0b11001111;
    CCP3CON |= (c & 0x3)<<4;
}

void main(void) {
    CCPTMRS0=0b00000000;   //  Timer2をソースとする
    PR2=255;
    CCP3CON=0b00001100;    //  PWM
    OpenTimer2(TIMER_INT_OFF  & T2_PS_1_4 & T2_POST_1_1);
    ANSELBbits.ANSB5=0;
    TRISBbits.RB5=0;
    SetDCPWM3(0);

    for(;;){
        unsigned int n;
        for(n=0;n<1023;n++){
            SetDCPWM3(n);
            Delay10KTCYx( 10); // 64MHz/4*6.25m秒/10000
        }
    }
}