閲覧総計:11329 (本日:1 昨日:0)
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覚書」
/* 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ミリ秒)待つ } } }
★この情報は役に立ちましたか?