#include #include __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変換値,Duty比 */ /* 初期設定 */ 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比を95%に制限 */ /////// 追加終わり ////// if( ad_value < 128 ){ /* 2.5[V} < Vref ? */ CCPR1L = 0; /* 左レッグをローサイド100%に */ CCPR2L = PR4 * duty / 100; /* 右レッグを計算したDuty比でドライブ */ }else{ CCPR1L = PR2 * duty / 100; /*左レッグを計算したDuty比でドライブ */ 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出力ポートを一旦OFF */ PR2 = 125; /* PWM周波数 : 1kHz */ CCPR1L = 0; /* Dutyを0%に */ CCP1CON = 0b10011100; /* PWMモジュール1をON */ T2CON = 0b00000110; /* タイマ2をON プリスケーラ:16 */ PWM1CON = 0b00000100; /* デッドタイムを設定 2[us]*/ TRISC2 = 0; TRISB2 = 0; /* PWM出力ポートをON */ /* 右レッグ設定 */ CCP2SEL = 0; P2BSEL = 0; /* P2AをRC1に,P2BをRC0に割り当て */ TRISC1 = 1; TRISC0 = 1; /* PWM出力ポートを一旦OFF */ PR4 = 125; /* PWM周波数 : 1[kHz] */ CCPR2L = 0; /* Dutyを0%に */ CCP2CON = 0b10011100; /* PWMモジュール2をON */ T4CON = 0b00000110; /* タイマ4をON プリスケーラ:16 */ PWM2CON = 0b00000100; /* デッドタイムを設定 2[us] */ TRISC1 = 0; TRISC0 = 0; /* PWM出力ポートをON */ } void initializeAD( void ) { TRISB5 = 1; ANSB5 = 1; /* RA0をAD入力ピンに設定 */ ADCON1 = 0b01010000; /* ADCクロックを2[us]に設定 */ ADCON0 = 0b00110101; /* ADCモジュールをON */ __delay_us( 100 ); /* 設定完了時間待ち */ }