Ultrasonic sensör uzaklık hesaplama problemi.

Başlatan kantirici, 20 Ağustos 2011, 19:01:32

kantirici

Merhaba arkadaşlar.Elimde HC-SR04 model ultrasonic sensör var.(sensör datasheet http://elecfreaks.com/store/download/HC-SR04.pdf ) Datasheetden anladıgım kadarıyla sensörün trig pinine 10us lojik1 verip lojiko yaptıktan sonra echo pinin lojik1 seviyesinde kalma süresini ölçüp fomül yardımıyla uzaklıgı hesaplayacagız.Buna göre aşağıdaki kodu yazdım sensörü çalıştırdım.Fakat iş mesafeyi hesaplamaya gelince iş karışıyor.Datasheetde yazan Test distance = (high level time×velocity of sound (340M/S) / 2 kullandıgımda çok büyük sonuç çıkıyor.Acaba timer prescaler oranındamı bir sorun var diye oranlarıda değiştirdim fakat sonuç düzülmedi.İnternette bu sensör için arduino kodlarını buldum(http://arduino.cc/en/Tutorial/Ping?from=Tutorial.UltrasoundSensor         http://arduino.cc/forum/index.php?topic=57210.0).Onlarda mesafeyi uzaklık=süre*29/2 formülü ile hesaplamışlar.Bunuda denedim fakat cetvelle yaptıgım ölçümlerde 2 katı mesafe veriyor.Bende süre*29/4 yaptım.Bu formülle timer1 prescaler oranı 1:4.Sorun yok gibi fakat bu farklılık neden oldu veya nerede yanlış yaptım acaba.teşekkürler.

Düzenlenen ve çalışan kod:

#include<htc.h>
#include"delay.h"
#include"lcd.h"
 
__CONFIG(0x3B31);//konfigirayon ayarla yapılıyor.
 
#define trig RC0     //pin tanımları
#define ECHO RC1 
 
void main(){
int  sure,uzaklik;
TRISB=0x00;	   //port giriş çıkış işlemleri
TRISC=0b0000010;
PORTB=0x00;
PORTC=0x00;
T1CON=0b00000101; //TIMER1 ayarları yapılıp çalıştırılıyor
 
	lcd_init();
	DelayMs(100);
	lcd_clear();
 
for(;;){ //trig pinine 15us lojik 1 yapılıyor
	trig=1;
	DelayUs(15);
	trig=0;
		while(!(ECHO)); //echo pini bekle
	TMR1=0; //echo pini 1 se timeri 0 la ve saymaya başla
 
		while((ECHO));
	sure=TMR1;
	 //echo pini 0 olunca timer değerini süreye eşitle
	uzaklik=(sure/58);//mesafeyi hesapla
	if(uzaklik>15)//cisim 15cm den uzaktaysa RC7 yi 1 yap
		RC7=1;
	else
		RC7=0;
 
	lcd_goto(0x00);//uzaklık ve sure lcdye yazdırılıyor
	lcd_puts("uzaklik:");
	lcd_write_int(uzaklik);
	lcd_goto(S1_13);
	lcd_puts("cm");
	lcd_goto(0x40);
	lcd_puts("sure:");
	lcd_write_int(sure);
	lcd_goto(S2_12);
	lcd_puts("us");
 
	DelayMs(100);//yeni ölçüm için bekle.
 
}
}


kantirici


Arkadaşlar sorunu çözdüm ve mcu-turkeyde konuyla ilgili bir şeyler karalamaya çalıştım.Tabi amatörce oldu ama bir yerden başlamak gerek diye düşünüyorum.Konuyla alakalı öneri ve eleştirilerinizi bekliyorum teşekkürler.Link: http://www.mcu-turkey.com/?p=16990