//********************************************************************** /* <DC→DCコンバーター> */ //********************************************************************** void interrupt() { if (INTCON.TMR0IF == 1) { // 約33msecの周期 INTCON.TMR0IF = 0; PORTB.F4 = ~PORTB.F4; } if (PIR1.TMR1IF == 1) { // 約250msecの周期 PIR1.TMR1IF = 0; PORTB.F5 = ~PORTB.F5; } } //********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** void main() { static unsigned int ad0; static unsigned int duty_ratio; // ADCON0 = 0b01000000; ADCON1 = 0b11001110; // AN0を使用する。 TRISA = 0b00001011; TRISB = 0b00000111; // CCP1はRB3を使用する。LED1はRB4、LED2はRB5を使用する。 OSCCON = 0b01110000; // クロックは内蔵の8Mhzを使用する。 OPTION_REG = 0b10000111; PIE1.TMR1IE = 1; PIR1.TMR1IF = 0; T1CON = 0b00110001; T2CON = 0b00000100; INTCON = 0b01100000; // Pwm_Init(10000); // 10Khz Pwm_Change_DutyEx(1024 / 2); PR2 = 0xFF; Pwm_Start(); // TRISB = 0b00000111; // 何故か再設定が必要! duty_ratio = 0; // INTCON.GIE = 1; // これ以降の処理で割り込みを許可する。 // while (1) { if (PORTB.F0 == 0) { // ホールド状態にする。 if (PORTB.F1 == 0) // 電流値を上げる。 duty_ratio++; if (PORTB.F2 == 0) // 電流値を下げる。 duty_ratio--; Pwm_Change_DutyEx(duty_ratio); Delay_ms(10); continue; } ad0 = Adc_Read(0); // 電流値を読み込む。 if (ad0 < 24) { // 電流を400mAに設定<Vcc=5V 、0.3Ω、AD分解能≒5mv> if (duty_ratio < 1024) // 電流値を上げる。 duty_ratio++; } else { if (duty_ratio > 0) // 電流値を下げる。 duty_ratio--; } Pwm_Change_DutyEx(duty_ratio); Delay_ms(10); } } //**********************************************************************