/* 電源電圧監視ユニット(汎用スピーカ版)   0927k26vdd_sp.c PIC12F683用   6.7V以下でLEDを点滅、スピーカを鳴らすなどの警告をする */ #include<12f683.h> #DEVICE ADC=10 //ADコンバータを10bitで使用 #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR //ウオッチドックタイマ無し、パワーアップタイマ使用 //プロテクト無し、MCLRなし #use delay(CLOCK=8000000) //8MHz駆動 #byte GP=5 #bit LED=GP.5 #define ON 1 #define OFF 0 #define HI 1 #define LOW 0 long vdd_adc; signed long s_duty;//パルスカウント用 //VR入力をADコンバータより読み出し、各変数にセットする。 //電源電圧を7.4Vにセット後、トリムポッドにより、A/Dコンバータ入力を3端子レギュレータ出力と同じに調整する。 void adc_in(void) { set_adc_channel(3); delay_us(20); vdd_adc=read_adc(); } void sp_on(void) //スピーカーON { set_pwm1_duty(127); } void sp_off(void) //スピーカーOFF { set_pwm1_duty(0); } //メインルーチン void main() { int i; set_tris_a(0x18); /* GP 5 4 3 2 1 0 L VD BZ 0 1 1 0 0 0 */ setup_oscillator(OSC_8MHz); setup_comparator(NC_NC); //デジタル入力切り替え setup_adc_ports(sAN3 | VSS_VDD); //ADコンバータ使用宣言 setup_adc(ADC_CLOCK_DIV_32); //ADコンバータクロック setup_ccp1(CCP_PWM); //PWMモード使用宣言 setup_timer_2(T2_DIV_BY_4,255,1); //CCP1 PWMモードセット //PWM周期=(255+1)*4*(1/8E6)*4=0.512ms=1.95KHz enable_interrupts(GLOBAL); //割り込み全体許可 LED=OFF; sp_off(); for(i=0;i<3;i++){ LED=ON; sp_on(); delay_ms(250); LED=OFF; sp_off(); delay_ms(250); } LED=OFF; sp_off(); while(1){ adc_in(); if(vdd_adc < 802){ // 5.8/7.4*1024=830 250ms LED,ブザー鳴りっぱなし LED=ON; sp_on(); delay_ms(500); LED=OFF; delay_ms(250); } else if(vdd_adc < 830){ // 6V/7.4*1024=830 250ms LED,ブザー LED=ON; sp_on(); delay_ms(500); LED=OFF; sp_off(); delay_ms(250); } else if(vdd_adc < 871){ // 6.3V/7.4*1024=871 500ms LED、ブザー LED=ON; sp_on(); delay_ms(250); LED=OFF; sp_off(); delay_ms(500); } else if(vdd_adc < 899){ // 6.5V/7.4*1024=899 1000ms LED、ブザー LED=ON; sp_on(); delay_ms(250); LED=OFF; sp_off(); delay_ms(1000); } else if(vdd_adc < 927){ //6.7V/7.4*1024=927 LED点滅開始 LED=ON; delay_ms(250); LED=OFF; delay_ms(500); } else{ LED=OFF; sp_off(); } } }