PIC18F46K22でPWMによりLEDの明るさを調整する(C言語)
概要
プログラムの説明
メインプログラムで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
}
}
}