超音波距離測定
setup_vref(VREF_LOW |val);で設定しますが、これで、電源電圧をVccとしたとき、VCC*val/24 の電圧を生成できます。valは0〜15 までの16レベルが指定できます。
setup_comparator(A0_VR_A1_VR);で設定することができます。PICには比較回路が2回路あり、上記の設定で、A0とA1端子の電圧と参照電圧を比較します。二つの回路の比較結果は、C1OUT,C2OUT として参照できます。参照電圧の方が高いと C1OUT は1になります。
#include <16F873a.h> #fuses HS,NOWDT,NOLVP,NOPROTECT #use delay(clock = 20000000) #use RS232(BAUD=9600,xmit=PIN_C6,rcv=PIN_C7) unsigned long dtime; unsigned long dist; unsigned int nc=0; void main() { setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);//1.6uS setup_vref(VREF_LOW |6); //VCC*val/24 setup_comparator(A0_VR_A1_VR);//A0-Vref while(1){ set_timer1(0); output_bit(PIN_C0,1);//Sonic Out delay_us(900); output_bit(PIN_C0,0);//Sonic Stop delay_us(300);//wait do { dtime = get_timer1(); } while (C1OUT==1 && dtime<10000 );//A0がVREF以上になるのを待つ dist=(long)((float)(dtime)*16.0/581.0);//クロック1.6u,58.14us for 1cm printf("%d:%lu:%lu\r\n",nc++,dist,dtime); if(nc>100) nc=0; delay_ms(100); } }