超音波距離測定



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);
}
}