ultasonik sensör ile mesafe nasıl hesaplanır?

Başlatan nofearkartal, 29 Mayıs 2011, 07:51:55

nofearkartal

herkese selam.yaptığım ultrasonik sensörde  ses alıcıya ulaşınca high veriyor.Normalde ise low.Benim amacım 20-30 cm aşağısını algılamak.Yalnız bu algılama işlemini asm ile bir türlü yapamadım.Mantık olarak 8 periyotluk bir sinyal vericiden gidiyor.algılayıcı sinyali bekliyor.sinyal ulaşınca da timer durdurularak; karşılaştırma işlemini sadece TMR1H ile yapıyorum.yani ilk aşamada öyle hassas bişeye ihtiyacım yok. Ne olur koddaki hatamı bulun yoksa  :'(
Şimdiden teşekkürler.

LIST P=16F877A
INCLUDE "P16F877A.INC"
__CONFIG H'3F31'


	CBLOCK H'70'
		SAY1
		SAY2
		SAY3
		SAY4
		SAY5
		SAY6 
	ENDC
	ORG H'00'
	GOTO START


 
START
		
			CALL GECIKME					;başlangıçta bir gecikme  200us

			BANKSEL TRISA                  ;11111111111111111111111111111111111111111
			CLRF TRISB          
			MOVLW H'FF'
			MOVWF TRISC
			CLRF TRISD
			
			BANKSEL PORTA                  ;00000000000000000000000000000000000000000
			BCF PIR1,TMR1IF 				;taşma bayrağı sıfırla
			MOVLW H'00'	
			MOVWF INTCON					;kesmeler kapalı
			MOVLW H'01'
			MOVWF T1CON						;prescaler 1:1  (4mhz de 1 us artma)
			
WAIT
			BSF T1CON,0						;timer1 aktif
			CALL GECIKME					;farklı ölçümler arası bekleme		200us			
			BCF PIR1,TMR1IF					;;taşma bayrağı sıfırla
			
			BSF PORTB,0						;8 periyod 40 kHz göndermek için 555 i tetikle
			MOVLW H'42'
			MOVWF SAY3
			CALL GECIKME1					;200us bekle
			BCF PORTB,0						

			CLRF TMR1L						;timerları sıfırla
			CLRF TMR1H
						
		

L2			BTFSS PORTC,4					;c4 portunda 1 bekle
			GOTO L1
			BCF T1CON,0						;1 geldiyse timer1 i durdur
			MOVLW H'04'						;timerh değeri 4 olunca 04xx tahmini 20 cm civarı ile bir karşılaştırma
			SUBWF TMR1H,W
			BTFSC STATUS,0
			GOTO ZIPLA
			BCF PORTD,2						; portd,2 low
			GOTO L3
ZIPLA 	
			BSF PORTD,2						;portd,2 high
			GOTO L3

L1			BTFSS PIR1,0					;eğer taşma olduysa döngüden çık!
			GOTO L2
			GOTO WAIT


L3		
			
GOTO WAIT



GECIKME1
DONGU
	DECFSZ SAY3,F
	GOTO DONGU
RETURN
		

GECIKME
	MOVLW H'FF'
	MOVWF SAY1
DONGU1
	MOVLW H'FF'
	MOVWF SAY2
DONGU2
	DECFSZ SAY2,F
	GOTO DONGU2
	DECFSZ SAY1,F
	GOTO DONGU1
	RETURN
		
 
 
END


yamak

Hangi sensörü kullanıyosunuz bilmiyorum fakat genel uzaklık sensorlerinin çalışması uzaklığa göre farklı gerilim üretme mantığına göredir.Yani sensörün datasheetinde uzaklığa göre ürettiği gerilim değerini bakıp adc kullanarak ölçülen gerilimden uzaklığı belirlemelisiniz.

jackal183

Alıntı yapılan: yamak - 29 Mayıs 2011, 11:12:48
Hangi sensörü kullanıyosunuz bilmiyorum fakat genel uzaklık sensorlerinin çalışması uzaklığa göre farklı gerilim üretme mantığına göredir.Yani sensörün datasheetinde uzaklığa göre ürettiği gerilim değerini bakıp adc kullanarak ölçülen gerilimden uzaklığı belirlemelisiniz.
ultrasonik sensörler o şekilde çalışmıyor hocam, vericiden sinyali gönderirsiniz ve timerı başlatırsınız, alıcıdan sinyal aldığınız anda timerı kapatırsınız, geçen süreyi ikiye bölüp ses hızıyla çarpar mesafeyi bulmuş olursunuz


nofearkartal

sensörü hazır almadım, kendim yaptım. O yüzden bu sensörler dediğiniz mantıkla çalışmıyor. gönderdiğiniz sinyal ile yankılanan sinyal arasıdanki zaman ölçülerek mesafe hesaplanmakta.alıcı ve verici devresini kendiniz tasarlıyor iseniz benim dediğim gibi bi ölçüm yapmak gerekiyor. Yani daha önce yapılmış sensör ve yazılımları öyle. iki sinyal arası zamanı ölçemiyorum aslında problemim bu sanki.yada  bi yerde anlamadığım yanlış bi yer var sanki, ya da atladığım. elbet vardır uzaklık ölçüm devresi yapan ya  :(

yamak

#4
Alıntı Yapultrasonik sensörler o şekilde çalışmıyor hocam, vericiden sinyali gönderirsiniz ve timerı başlatırsınız, alıcıdan sinyal aldığınız anda timerı kapatırsınız, geçen süreyi ikiye bölüp ses hızıyla çarpar mesafeyi bulmuş olursunuz
pardon hocam ben infrared ile karıştırdım.

ferit06

#5
asm  tam bilmiyorum ama kodunuzu inceledim. siz timer i çalıştırıyorsunuz ancak sinyalin dönüşünde durduracak bir kod yok.
@jackal183 ın dediği gibi sinyal dönüşünde timeri durdurmanız gerekir. Bunu da bir kesme ile yapmanız gerekir. Kesme geldiğinde timer1 i durdurup diğer işlemleiniz yapmalısınız.

L2 kısmında böyle bir şey yapmak istiyorsunuz ancak T1CON  yerine INTCON ile yapmanız gerekir.  T1CON,0 timer1 i çalıştırmak yada durdurmak için sizin yükleme yapmanız gereken bittir.  INTCON,0 ise PORTB değişim bayrağıdır. Sizin bunu kontrol etmeniz gerekir.

Kodu yeniden inceledim siz PORTB,4 de 1 geldiğinde timer 1 i durdurmak istiyorsunuz. Ancak 8 periotluk süreden önce sinyal dönerse ne yapacaksınız?

40 KHz i harici olarak 555 ile üretiyorsunuz. kullandığınız işlemci ile  dahili PWM kullanarak 40 Khz üretebilirsiniz.

http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html


PR2 = 0b00011000 ;
T2CON = 0b00000100 ;
CCPR1L = 0b00001100 ;
CCP1CON = 0b00011100 ;

değerleri ile 40 KHz üretebilirsiniz.



nofearkartal

hocam pwm i motor sürmek için kullanıyorum.o yüzden böyle bir şey yaptım. 8 periyotluk süreden önce gelmesi demek 4 cm den falan dönmesi gerekki ben dediğim gibi 20 cm civarını ölçmeye çalışıyorum.yani dediğiniz gibi timerı, 555 i tetikledikten hemen sonra da çalıştırdım ama yine sonuç yok.galiba sitede asm ile ilgilenen de yok. yani iki sinyal arasındaki süreyi ölçmek amma da zormuş ya  :'( yine de ilginiz için teşekkür ederim. aklınıza süreyi ölçebilmek için farklı bi algoritma gelirse lütfen paylaşın ben de asm de yazmaya çalışıyım. burda mantık hatası mı var yoksa kod hatası mı var bari onu çöziyim.çok az zaman kaldı çünkü.

ferit06

dediğim gibi asm çok bilmiyorum ama kesmeler üzerine biraz araştırma yapın PORTB4 high olduğunda kesme oluşşun ve kesme programı sadece timer1 i durdursun. Böylece geröek mesafe ölçümü yapabilirsiniz.

Farazi yazıyıyorum, pratik devrenizde veric/alıcı kısmınız çalışıyormu ? nasıl test ettiniz?

Şema vs olmayınca yorum yapmak ta pek kolay değil...

nofearkartal

verici devre ye 555 ile 40kHz bağlanmış durumda.Alıcı devrede ise alıcı sensörden gelen bilgi 1000 kat kuvvetlendirilerek karşılaştırıcıya sokuluyor. ölçüm yaptığımda ise alıcının çıkışı normalde 10mV civarı. vericideki 555 i tetiklediğimde ise alıcı çıkışı 3,7 volt oluyor.

ferit06

sensörlerin biribirine konumu nasıl? Siz belkide timer1 daha TIMER1L dolmadan RB4  high oluyor ve siz TIMER1H  sıfır iken kesmiş oluyorsunuz.  boşta bir pine  LED bağlayıp RB4  HIGH olduğunda bu pinin HIGH olmasını ve LEDin yanmasını gözleyin. Eğer 555 tetiklendiğinde LED yanıyorsa  ölçüm yapabiliyorsunuzdur. Bu durumda sensörlerin biribini doğrudan görmesini(duymasını) engelleyip sadece yansıyan ses ile bağlantı kurmasını sağlayacak şekilde sensörlerin konumu ile oynayın.

nofearkartal

ferit hocam ilginiz için teşekkür ederim, karşılaştırıcımda bir problem varmış çözdüm onu da  :P selam ve saygılar.