Km/saat

Başlatan pro73, 05 Nisan 2008, 16:19:58

pro73

Aşagıdaki yazdıgım kod yazdıgım kodda 4,14 km/saat ve katlarını görüyorum 1km/saat görebilmem için sizce ne yapmalıyım

DEVICE 16F628A	
		TRISA = %11111000 
		TRISB = 0
		CMCON=7
		LCD_DTPIN = PORTB.0	
		LCD_RSPIN = PORTB.4
		LCD_ENPIN = PORTB.5
		LCD_INTERFACE = 4	' 4-bit 
		LCD_LINES = 2
		LCD_TYPE = 0
		CLEAR
		
		OPTION_REG = %1111000   ' TMR0 : RA4/T0CKI
    				
    INTCON = %10100000      
	
    tur	         var word    
    Gecikme      var word    
    TmrTasma     var word	 
   	ya			 var dword   
	ay			 var word
	
	tur = 0 
    TMR0 = 0         
    on interrupt goto Kesme
	
Basla:
    if tur <= 2 Then 
	porta.0 = 0
	else
	porta.0 = 1
	endif
	
	PRINT AT 1,1 ,"Tur/Snye " ,dec5  tur
	ya = (tur * 414)/100        ; km = tur*çevre*3600 (Tur * 1.15*3600/1000)
	ay = (tur * 414)//100       ;000,00 (cevre=3,45 metre 1tam turda 3 pals) 
	PRINT AT 2,1 ,"Km "  ,dec3 ya
	PRINT AT 2,7 ,"." ,DEC2 AY
	;for ya = 1 to 50
	for Gecikme = 1 to 46900 ; toplam 1 saniyelik gecikme süre
	    @ nop
	next
	@ nop
	@ nop
	@ nop
	;@ nop
	;@ nop
	;@ nop
	;@ nop
    ;ya = tmr0
	;return
	;next
	
	
	tur = TmrTasma + TMR0
    TmrTasma = 0 ' Reset TmrTaşma
    TMR0 = 0        ' reset Tmr
    goto Basla
	
	 disable
Kesme:
    
    TmrTasma = TmrTasma + 256 
    INTCON.2 = 0 
    TMR0 = 0     
    resume
    enable    


yardımlarınız için şimdiden teşekkürler

MOD NOTU: KOD TAGI KULLANINIZ.

Klein

Başkasının yazdığı kodu inceleyip , analizini yapacak sabır ne yazıkki bende yok. Bu yüzden yaptığın şeyi tam anlamadım. Ama YA değişkenini hesaplarken tur ile 414 sayısını çarpıp 100'e bölüyorsun. Bu da tur sayısındaki her bir birimlik değişime karşı 4.14 birimlik bir değişime karşılık gelir.

pro73

ilgine yine de teşekkürler 414 sayısı şurdan gelir
çevre = 3,45
1 turda 3 pals alınıyor dolayısı ile 1 palsde 1,15 metre yol alınıyor
km/saat = pals * 1,15*3600/1000 = 4140/1000
buraya kadar çözebiliyorum. Ama 1 km/s degeri yazılımla nasıl görebilirim.

not:yazmayı unutmuş olabilirim bu bir km/saat göstergesi olacak

Klein

Km/Saat= (1 saniyede gelen pals adedi *3600*1.15)/1000
1 saniye süreyle ölçüm alıp , gelen darbeyi saymalısın. 1 saniye sonunda yukardaki gibi işleme sokarsan  sonucun doğru çıkması gerekir ki saatte 4.14Km olması da normal.
Eğer daha yüksek çözünürlüğe sahip  sonuçlar istiyorsan darbe üretecinin 1 turdaki darbe adedi daha fazla olmalı. Doğrudan darbeyi saymak yerine, yükselen kenar ve düşen kenarları sayarak 2 kat hızlanabilirsin.

Eğer 1 saniyede gelen darbe adedinden yola çıkmak istemezsen , iki darbe arasında geçen süreden de yola çıkabilirsin. Bu yöntem , darbe üreticinin çözünürlüğüne bağlı olmaksızın , daha yüksek çözünürlüğe sahip ölçüm almanı sağlar. Ama bu yöntem darbeler sıklaştığında sorun olabilir. Çok hızlı bir sayıcıya ihtiyacın olabilir.

pro73

(Km/Saat= (1 saniyede gelen pals adedi *3600*1.15)/1000
1 saniye süreyle ölçüm alıp , gelen darbeyi saymalısın. 1 saniye sonunda yukardaki gibi işleme sokarsan sonucun doğru çıkması gerekir.)

Bu yazdıklarınız doru cıkıyor. ama 1km/saat'i göremiyorum
İkinci dediginizi nasıl uygulayabilirim Vaktinizi'de almak istemem ama örnekleyerek açıklayabilirmisiniz.

Klein

Örneğin:
iki darbe arası geçen süre 250mS. Bu durumda 250milisaniyede 1.15m yol alıyorsun demektir.  Bu da saniyede 4.6m saatte ise 16560m eder.

eğer 200ms olsaydı   Km/S=(((1/darbe genişliği (ms))*1000)*1.15*3600)/1000 olur.  yani 2.07Km/S

bigbey

Arkadaşlar eğer yanlış anlamadıysam 1000m/s değerini görmek istiyoruz.
Burada 1 pulse'da alınan yol belli 1 saniyelik süre içinde alınan pulse sayısını 1.15m ile çarpınca saniyede alınan yol belli olur.
buna göre yaklaşık saniyede 869 pulse sayılırsa yaklaşık 1000m/s yapar
(869*115)/100=999,35=999m/s yapmazmı.
buna göre 1 saniye içinde sayılan pulse sayısını direk 115 ile çarpıp çıkanı 100 e bölersek sonuç almış olmazmıyız.
TA6R

Klein

@bigbey
1000metre/saat
her darbe aralığı 1.15metre
eğer saniyede 1 darbe gelirse saniyede 1.15metre yol katedilmiş olur.
bu da dakikada 1.15*60= 69metre yol demek. saatte ise 4140 metre yani 4.14KM yol katedilmiş demektir.
eğer saniyede 2 darbe gelirse  bu da saniyede 2.3metre saatte ise 8280metre demek. yani diğerinin iki katı. Buradan da şunu çıkarabiliriz. Bu darbe sıklığı ile en az 4.14KM/Saat ve katlarını ölçebiliriz. Oysa darbe başına katettiğimiz yol ~0.27777777metre olsaydı  1Kilometre/Saat katlarını görebilirdik.

bigbey

Evet @Klein durumu anladım. o zaman sensor değiştirmek yada sensör dönüşünü dişli gurubu ile redükte etmek gerekir. Tabiki orada bulunan mekanik ortamı bilmediğim için çok fazla bir şey de söyleyemiyorum.
TA6R

pro73

Arkadaşlar yardımlarınız için tşkler aklıma yeni bir çözüm geldi biraz saçma olabilir. mekanizmayı degiştiremedigimize göre pals okuma zamanını 1km/saat olacak şekilde ayarlamayı düşünüyorum
örnegin: 1000mt/1,15 = 870 pals/saat  eder buradan hareketle
870/3600 = 0,2416666 pals/saniye
bu (pals/saniye) degerini   puls/4,137 saniye şeklinde okutursam zannedersem 1km/saat =(4,137saniyedeki puls sayısı * 1,15 * 870)/1000 olur.diye düşünüyorum gerçe zamandan kaybediyoruz ama aklımada cok birşey gelmiyor.

Klein

Yok saçma deği. Tazeleme sıklığı ile ilgili sorunun yoksa , ve bu 4 saniye içerisinde hızında 1Km de fazla bir değişim olmayacaksa olur. ama değişim olursa  dengesiz sonuçlar okuyabilirsin. Eğer timer hızı yetiyorsa darbe okuma yerine , darbe genişliği okuma yöntemine geçsen daha doğru sonuçlar alabilirsin.

Cetinal

kendimiz yapalım biltek sitesinde var bununla ilgili bir proje

pro73

sayın klein ustam darbe genişligini okurken zaman aşımını nasıl yapacagız
bu konuyu tam yakalamış değilim iki örnek mümkün ise kod ile verebilirmisiniz. yada işleyiş mantıgını anlatsanızda yeterli.
yukarıda biaz bahsetmiştiniz örnegin bu yazmış oldugum kod'da 1 saniyelik bir zaman aşımı var idi 1 saniye sonra sayacları sıfırlıyordum
darbe genişligini okurken mutlaka sayac vardır bu sayacları ne zaman sıfırlıyacagız?

Klein

Pic'de capture modülü veya timer kontrolleri nasıl çalışır bilmiyorum. Renesas'ta timer'ler darbe genişliği ölçüm modunda çalışabildiği için özel bişey yapmıyorum. Bu yüzden göndereceğim kodun pek işinize yarayacağını zannetmem. MCS51 de ise doğrudan timer'in saymasını kontrol eden pinler ve kesmeler var. MCS51 kullanırken de ybu özellikleri kullanırım. Bu durumda bu kodların da işinize yarayacağını zannetmem. Pic'de de bu tür özellikle olabilir. Bu özellikleri kullanarak işinizi kolaylaştırabilirsiniz. Ama ben bu özellikler olmadığını varsayarak yol göstermeye çalışayım.
Eğer harici giriş kesmesi varsa işiniz çok kolay. Ama yoksa da sorun değil. Öncelikle Timer'i mümkün olan en hızlı çalışmaya ayarlamalısınız. Eğer Timer 8bit ise işiniz biraz zorlaşacak. Ext int  ile birlikte timer int kesmelerini de kullanmanız gerekecek.
Darbenin bağlı olduğu pin LO olduğunda sayıcıyı sıfırlayın ve saymayı başlatın. Pin Hi olup tekrar Lo olduğunda ise önce sayıcının değerini okuyun, sonra sayıcıyı sıfırlayın.  Bundan sonrası ise çarpma bölme toplama çıkarma. Sayıcıdan aldığımız değeri milisaniyeye çevirip , Km/S formülüne sokacağız.
Eğer darbe  kesme girişine bağlı ise ,bu kesmeyi yüksek öncelikli olarak ayarlamış olman gerekli. aynı zamanda düşen kenarda kesme isteği üretecek şekilde ayarlanmış olmalı. Pin Lo olduğunda kesme hizmet programına dallanıp yukarıda bahsettiğim sayıcı sıfırlama ve çalıştırma işini burada yaparsın. Böylece programdaki gecikmelerden etkilenmeden daha düzgün bir okuma yaparsın.
Eğer timer 8bit ise , düşük hızlarda muhtemelen taşacaktır. bu durumda Timer kesmesi de kullanman gerekecek. Her timer kesmesi geldiğinde bir değişkenin değerini 1 artır. Bu değeri daha sonra 256 ile çarpıp Sayıcıdan son aldığımız değere ekleyeceğiz.  Veya Timer kesmesine her girişte int veya long int bir değişkenin değerine 256 ekle.  Son olarak da Timeri sıfırlamadan önce aldığın değeri bu değere ekle.  bundan sonrası  yine milisaniye hesaplayıp Km/S formülüne sokmak olacak.
Kolay gelsin.