#freeze 閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);) 【目次】(項目をクリックすると飛べます) #contents ~ *発光ダイオード(LED)の明るさを変える(PWM) [#cf5faf89] PIC内蔵の「PWM(Pulse Width Modulation)機能」を利用した簡単なプログラムを作成し、 18F2320が持つ2つのCCPの「PWM制御」機能の利用法、稼働を確認した。 07/09/29 注)18F2320の場合、PWM信号はCCP1がRC2から発振され、CCP2の発振は、RC1かRB3かの 便利な方を選べる。 注)CCP = Compare/Capture/PWM ・内蔵発振器(8MHz)を利用する。 ・MCLRはPIC内部プルアップで利用する。 【結果】PWMで2つの発光ダイオード(LED)の明るさを独立して制御出来る事が確認 出来た。 ※C18のプログラムを追記 07/10/04 関連MikroC関数 void Pwm1_Init(unsigned long freq); void Pwm2_Init(unsigned long freq); void Pwm1_Change_Duty(unsigned short duty_ratio); void Pwm2_Change_Duty(unsigned short duty_ratio); void Pwm1_Start(void); void Pwm2_Start(void); void Pwm1_Stop(void); void Pwm2_Stop(void); &attachref(P1010549.JPG,zoom,150x150,button){新しい写真添付}; **MikroCのプログラム [#q6cbfaca] /** * 18F2320の稼働テスト * PWM機能で2つの発光ダイオードの明るさを徐々に変える * * RC1: LED (CCP2出力) * RC2: LED (CCP1出力) * RC3: LED (照度比較用) * *Clock: 8.0MHz 内蔵発振器使用 *Device Flags: * _INTIO2_OSC_1H _WDT_OFF_2H _MCLRE_OFF_3H _LVP_OFF_4L * (その他はデフォルト設定でOK) * * MikroC v7.0.0.3 */ void main() { unsigned short int i; //使用変数の定義 //PICの初期化 PORTC = 0b00000000; //PortCの中身をきれいにする //内蔵発信機 8MHz使用に設定 OSCCON = 0b01110000; TRISC = 0b00000000; //PortC 8個全て0:出力設定 PWM1_Init(5000); //PWM1の初期化 (5KHz周期指定) PWM2_Init(5000); //PWM2の初期化 (5KHz周期指定) PORTC.F3 = 1; //照度比較用LED ON PWM1_Start(); //PWM1機能スタート PWM2_Start(); //PWM2機能スタート do //doとwhileの間を繰り返す { //2つのLEDの明るさを徐々に変える for (i = 0; i < 256; i++) { PWM1_Change_Duty(i); //PWM1のDuty変更 PWM2_Change_Duty(255 - i); //PWM2のDuty変更 Delay_ms(30); //30msec待つ } } while(1); //doとwhileの間を繰り返す } **C18のプログラム [#e86730a2] /** * 18F2320の稼働テスト * PWM機能で2つの発光ダイオードの明るさを徐々に変える * * RC1: LED (CCP2出力) * RC2: LED (CCP1出力) * RC3: LED (照度比較用) * Clock: 8.0MHz 内蔵発振器使用 * * C18 StudentEdition v3.12 */ #include <p18f2320.h> #include <pwm.h> #include <delays.h> //config設定 #pragma config OSC = INTIO2 //内部発振器を利用 #pragma config WDT = OFF //ウォッチドッグタイマOFF #pragma config MCLRE = OFF //MCLRを内部プルアップ #pragma config LVP = OFF //低電圧ICSP制御OFF //その他のconfigはデフォルト設定のまま void main(void) { unsigned int i; //使用変数の定義 //初期化 PORTC = 0b00000000; //PortCの中身をきれいにする OSCCON = 0b01110000; //内蔵発振器を8MHz使用に設定 TRISC = 0b00000000; //PortC 8個全て0:出力設定 PORTCbits.RC3 = 1; //照度比較用LED ON OpenPWM1(255); //PWM1をオープン OpenPWM2(255); //PWM2をオープン while(1) { //LEDの明るさを徐々に変える(1024分解能) for (i = 0; i < 1024; i++) { SetDCPWM1(i); //PWM1のDuty変更 SetDCPWM2(1023 - i); //PWM2のDuty変更 Delay10KTCYx(1); //5msec待つ } } } ★この情報は役に立ちましたか? #vote(はい[3],いいえ[2]) #comment