- 追加された行はこの色です。
- 削除された行はこの色です。
#freeze
閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);)~
*LEDの明るさを変える(PWM)(16F1827 XC8) [#lf796826]
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覚書」
|&attachref(TS3V0008.JPG,zoom,200x300,button){新しい写真添付};|&attachref(16F1827ピン配置.JPG,zoom,200x250,button){新しい写真添付};|
/* 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ミリ秒)待つ
}
}
}
★この情報は役に立ちましたか?
#vote(はい[2],普通[0],いいえ[0])
#vote(はい[2],普通[0],いいえ[1])
#comment_nospam