Kontrol Algoritması

Başlatan xoom, 29 Ekim 2024, 17:56:19

xoom

18 tane input kontrol ettiğim bir kartım var.
6 farklı input geldiğinde motoru devreye aldığım bir sistemim var.
(7.input gelirse )Motor 1 tur attığında 
(8.input gelirse )Motor 2 tur attığında 
(9.input gelirse )Motor 3 tur attığında 

Çıkışı kesmem gerekiyor.

18 Sensörlerimi 1ms'lik timer içerinden kontrol ediyorum
Sorum şu : Motor tur atarken 5.Sensör ( tur sayan sensör ) önünden geçerken sensör bana
hızlıca tur sayısını tuttuğum değişkenimin değerini arttırıyor.. Yani aslında 1.tur olmasına rağmen
değer 6-7-10 gibi değerler döndürüyor.
Bu durumun önüne geçmek için Delay koysam Timer içinde Akışta sekteye uğrucak.
While ile sensör önünden geçene kadar programı bekletsem yine doğru olmaz gibi?

Sizce ne yapmalıyım? Tur sayma işini harici kesmeye mi vermeliyim?

alikeskinkilic

düşükten yükseğe çıkışta yada tersine  kesme koy böylece sadece sensör durum değiştirince artar. sen büyük ihtimalle 1 iken arttır demişsin oda 1 gördüğü sürece artırıyor
Hep meraktan

~ENES~

Daha basit bir yöntem kesme süresi pulse süresinden daha hassas oldugu icin pulse genişliği boyunca 7 8 kez kesme uretileceğinden bu sorun oluşuyor.

Şunu yapmayi dene kesme oluştugunda pulse 1 ise 0 olana kadar degiskeni 1 kez artırsın eger 0 gelirse tekrardan 1 gelmesini bekleyip başa dönsün.

FEHMİ_ASM


Hocam öncelikle hangi inputu değerlendireceğinizi belirlemek için if veya case bloğu kullanın. Bu blokta motor tur sayısını ölçmek için daha önceden oluşturduğunuz değişken değerlerini arttırarak mantıksal işlem operatörlerini kullanın. Sayaç döngüleri tamamlandığında da mutlaka sıfırlayın.

Tur sayılarını belirlemek için pin değişiklik kesmesini kullanabilirsiniz. Kullandığınız işlemcinin yükselen, düşen veya her ikisinde tetik oluşturabilecek şekilde belirleyebilirsiniz bunu.

Eğer işlemcinizin değişiklik kesme pinleri yeterli değilse, veya bunu harici olarak yapmak istiyorsanız monostable multivibratör de kullanabilirsiniz, piyasada farklı özellikteki multivibratörlerin doğruluk tablosunu inceleyerek uygun olanı tercih edebilirsiniz.

Motor tur sayılarını belirlemek için while, delay gibi zaman fonksiyonları kullanmayın, aksi halde fazla veya eksik sayabilirsiniz.

xoom

#4
Alıntı yapılan: FEHMİ_ASM - 30 Ekim 2024, 21:12:21Hocam öncelikle hangi inputu değerlendireceğinizi belirlemek için if veya case bloğu kullanın. Bu blokta motor tur sayısını ölçmek için daha önceden oluşturduğunuz değişken değerlerini arttırarak mantıksal işlem operatörlerini kullanın. Sayaç döngüleri tamamlandığında da mutlaka sıfırlayın.

Tur sayılarını belirlemek için pin değişiklik kesmesini kullanabilirsiniz. Kullandığınız işlemcinin yükselen, düşen veya her ikisinde tetik oluşturabilecek şekilde belirleyebilirsiniz bunu.

Eğer işlemcinizin değişiklik kesme pinleri yeterli değilse, veya bunu harici olarak yapmak istiyorsanız monostable multivibratör de kullanabilirsiniz, piyasada farklı özellikteki multivibratörlerin doğruluk tablosunu inceleyerek uygun olanı tercih edebilirsiniz.

Motor tur sayılarını belirlemek için while, delay gibi zaman fonksiyonları kullanmayın, aksi halde fazla veya eksik sayabilirsiniz.
Neredeyse bu şekilde yapıyorum ama kaçırdığım bir yer var hala bulmuş değilim ama bulacağım.
Tur saymayı Harici kesme olarak ayarladım fakat buton ark'ından oluşuan debounce'ların önüne nasıl gececeğim. Hızlıca 1'den fazla Tur bilgisi gelebiliyor. Falling olarak ayarladım ama butona basarken 1'den 0'a geçiş farklı sayıda geliyor.

alikeskinkilic

tur sayımı için kullandığınız sensör bir butonmu!? eğer öyleyse bu sistemin çalışmamasını açıklıyor zaten buton arklarını engellemenin yolları belli ya belli bir süre paus vericeksiniz yada çok sağlam filtre kullanacaksınız ama ikisi de çözüm olmaz bence . hall, optik, indüktif  vb gibi ark yaratmayan herhangi bir  sensörlerden faydalanmanızı öneririm
Hep meraktan

xoom

Alıntı yapılan: alikeskinkilic - Dün, 14:45:36tur sayımı için kullandığınız sensör bir butonmu!? eğer öyleyse bu sistemin çalışmamasını açıklıyor zaten buton arklarını engellemenin yolları belli ya belli bir süre paus vericeksiniz yada çok sağlam filtre kullanacaksınız ama ikisi de çözüm olmaz bence . hall, optik, indüktif  vb gibi ark yaratmayan herhangi bir  sensörlerden faydalanmanızı öneririm
Denemeleri buton ile yapıyorum normalde endüktif sensör var.

alikeskinkilic

hocam yanlış malzeme ile deneme yanlış sonuç almanıza neden oluyor bence normalde değişiklik kesmesi en düşük Pic serilerinde bile 120 khz de okumayı hatasız yapacak kadar iyi .Pic için bir örnek verecek olursam değişiklik olduğu anda
8 mhz clk çalışan işlemcinin bir komutu 500ns sürüyor . buda kesme oldu 1us sonra  kesme rutinine girmesine kesmeyi kapatma falan derken maksimum 2 yada 3 us süresinde kesme sonucunda oluşan değişikliği registere kaydedip rutinden çıkmana yetecek kadar hızlı. bunlar olurken butondaki parazit sitemin kapasitansına bağlı olarak veya butonun yayının geri sekmesi her ne ise bu sürelerin çok üstünde bir dalgalanmaya neden olur yani frekansı işlemcinin okuma hızından yavaş olur bu sürede kesme rutini bitmiş ve kesmeleri tekrar aktif etmiş olursunuz ikinci dalga üçüncü dalga hatta sizin bahsettiğiniz sistemde 10 dalgalanmaya kadar tekrar kesmeye girer ve değişkeninizin değeriini kendi elinizle değiştirmiş olursunuz. uygun malzeme ile deneyin düzelecektir programda bir hata yoksa kolay gelsin
Hep meraktan

Epsilon

#8
Bir butonun cevap verme süresi ençok 50 Hz/dakika falandır herhalde.Kaldıki buton sıçraması bile 5-10 ms olabilir.Programa ekleme yaparak bu süreleri  ölçürebilirsiniz.
Buton yerine hall effect sensörü falan kullanın .

Erol YILMAZ

ilgili pini skopla görüntüleyin.. fiziksel durumu anlamaya çalışın derim..;
Skop yoksa SALEAE logic analyzer...