#include <xc.h> #include <stdlib.h> __CONFIG( FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF ); __CONFIG( WRT_OFF & VCAPEN_OFF & PLLEN_OFF & STVREN_OFF & BORV_HI & LVP_OFF ); #define _XTAL_FREQ 8000000 /* 蜍穂ス懷捉豕「謨ー : 8MHz */ void initializePort( void ); void initializePWM( void ); void initializeAD( void ); void main( void ) { int ad_value, duty; /* AD螟画鋤蛟、�轡uty豈� */ /* 蛻晄悄險ュ螳� */ OSCCON = 0b01110010; /* 蜀�Κ繧ェ繧キ繝ャ繝シ繧ソ 8MHz PLL OFF */ initializePort(); /* 繝昴�繝亥�譛溯ィュ螳� */ initializePWM(); /* PWM蛻晄悄險ュ螳� */ initializeAD(); /* ADC蛻晄悄險ュ螳� */ while( 1 ){ GO_nDONE = 1; /* AD螟画鋤髢句ァ�*/ while( GO_nDONE ); /* AD螟画鋤螳御コ�セ�■ */ ad_value = ADRESH; /* ad_value縺ォAD螟画鋤縺ョ邨先棡繧剃ソ晏ュ� */ if( (ad_value > 123) && (ad_value < 133) ){ /* 2.4[V] < Vref < 2.6[V] ? */ CCPR1L = 0; CCPR2L = 0; /* 荳。繝ャ繝�げ繧偵Ο繝シ繧オ繧、繝�100%縺ォ */ }else{ duty = abs( (ad_value - 128) * 100 / 128 ); /* Duty豈納%]繧定ィ育ョ� */ /////// 霑ス蜉� ////// if( duty > 95 ){ duty = 95; } /* Duty豈斐r95%縺ォ蛻カ髯� */ /////// 霑ス蜉�邨ゅo繧� ////// if( ad_value < 128 ){ /* 2.5[V} < Vref ? */ CCPR1L = 0; /* 蟾ヲ繝ャ繝�げ繧偵Ο繝シ繧オ繧、繝�100%縺ォ */ CCPR2L = PR4 * duty / 100; /* 蜿ウ繝ャ繝�げ繧定ィ育ョ励@縺櫂uty豈斐〒繝峨Λ繧、繝� */ }else{ CCPR1L = PR2 * duty / 100; /*蟾ヲ繝ャ繝�げ繧定ィ育ョ励@縺櫂uty豈斐〒繝峨Λ繧、繝� */ CCPR2L = 0; /* 蜿ウ繝ャ繝�げ繧偵Ο繝シ繧オ繧、繝�100%縺ォ */ } } } } void initializePort( void ) { PORTA = 0x00; LATA = 0x00; ANSELA = 0x00; TRISA = 0x00; PORTB = 0x00; LATB = 0x00; ANSELB = 0x00; TRISB = 0x00; PORTC = 0x00; LATC = 0x00; TRISC = 0x00; PORTE = 0x00; LATE = 0x00; TRISE = 0x00; } void initializePWM( void ) { CCPTMRS0 = 0b00000100; /* 繧ソ繧、繝槭�蜑イ繧雁ス薙※繧定ィュ螳� PWM繝「繧ク繝・繝シ繝ォ1:繧ソ繧、繝�2 PWM繝「繧ク繝・繝シ繝ォ2:繧ソ繧、繝�4 */ /* 蟾ヲ繝ャ繝�げ險ュ螳� */ TRISC2 = 1; TRISB2 = 1; /* PWM蜃コ蜉帙�繝シ繝医r荳譌ヲOFF */ PR2 = 125; /* PWM蜻ィ豕「謨ー : 1kHz */ CCPR1L = 0; /* Duty繧�0%縺ォ */ CCP1CON = 0b10011100; /* PWM繝「繧ク繝・繝シ繝ォ1繧丹N */ T2CON = 0b00000110; /* 繧ソ繧、繝�2繧丹N 繝励Μ繧ケ繧ア繝シ繝ゥ:16 */ PWM1CON = 0b00000100; /* 繝�ャ繝峨ち繧、繝�繧定ィュ螳� 2[us]*/ TRISC2 = 0; TRISB2 = 0; /* PWM蜃コ蜉帙�繝シ繝医rON */ /* 蜿ウ繝ャ繝�げ險ュ螳� */ CCP2SEL = 0; P2BSEL = 0; /* P2A繧坦C1縺ォ�訓2B繧坦C0縺ォ蜑イ繧雁ス薙※ */ TRISC1 = 1; TRISC0 = 1; /* PWM蜃コ蜉帙�繝シ繝医r荳譌ヲOFF */ PR4 = 125; /* PWM蜻ィ豕「謨ー : 1[kHz] */ CCPR2L = 0; /* Duty繧�0%縺ォ */ CCP2CON = 0b10011100; /* PWM繝「繧ク繝・繝シ繝ォ2繧丹N */ T4CON = 0b00000110; /* 繧ソ繧、繝�4繧丹N 繝励Μ繧ケ繧ア繝シ繝ゥ:16 */ PWM2CON = 0b00000100; /* 繝�ャ繝峨ち繧、繝�繧定ィュ螳� 2[us] */ TRISC1 = 0; TRISC0 = 0; /* PWM蜃コ蜉帙�繝シ繝医rON */ } void initializeAD( void ) { TRISB5 = 1; ANSB5 = 1; /* RA0繧但D蜈・蜉帙ヴ繝ウ縺ォ險ュ螳� */ ADCON1 = 0b01010000; /* ADC繧ッ繝ュ繝�け繧�2[us]縺ォ險ュ螳� */ ADCON0 = 0b00110101; /* ADC繝「繧ク繝・繝シ繝ォ繧丹N */ __delay_us( 100 ); /* 險ュ螳壼ョ御コ�凾髢灘セ�■ */ }