Patron çıldırdı... Türbin motorlara ECU (ya da FADEC) yapıyoruz...

Size karşı değilim, yapılamaz demiyorum, sizi destekliyorum, hatta geliştirmenize yardımcı olmak bile isterim. Bunu baştan belirteyim :)
Güzel açıklamalarınız içinde teşekkür ederim, Tecrübe paylaştıkça çoğalır gerçekten.
az çok türbinin nasıl çalıştığını biliyorum. Çalıştırma kısmında sorun olmaz diye tahmin ediyorum. hd çözünürlükte dokunmatik bir ekran kullanırsanız ya bir (mini)bilgisayar kullanmanız gerekecek ya da üzerinde kendi işlemcisi olan bir ekran ile spi, seriport gibi yollarla haberleşeceksiniz, yine mikroişlemci gücüne ihtiyacınız olmayacak.
RPM'i ana loopta okumak olmaz dediğiniz gibi interrupt ile okumak gerekiyor, kendi tecrübelerimde arduinonun kendi interruptları yüksek rpmlerde çok kaçırdı (benim yazılımsal hatalarımda olabilir tabi) onun için sorma gereği duydum.
16mhz = 16000döngü/milisaniye demek. Eğer arduinoya bu döngü tamamlanmadan 2. bir pulse yollarsanız okumayacaktır. buna işlemciye eklediğiniz diğer yavaşlatıcı etkenleri(matematiksel işlemler, conditionlar) de eklerseniz biraz daha düşecektir. Dolayısıyla arada kaçan bir pulse okuma sürenizi artıracaktır. Mantık olarak bahsettiiniz iki yöntemde aynı yere çıkıyor zaten. iki pulse arası süre hesabı.
Neyse hocam, genel olarak, bu konuda olası bir sorun yaşayabileceğinizi düşünerek görmüşken söylemek istedim.
Gerek arduino, gerek python-C# gibi yazılımsal konularda destek olmak isterim hocam. RC'ye başlamadan önceki hobilerim bu tarz işler keza robot kol(simulink ile) basit quad kontrolcüsü gibi çalışmalarım var(daha çok matematiksel)
Saygılar bizden hocam.
Dur bir düşünelim...
Interrupt servis rutin şöyle:

ISR(PCINT0_vect)
{
cntr++;
}

16 bitlik bir değişkeni bir artırıyoruz. Muhtemelen makine kodu şu şekilde ilerliyordur diye düşünüyorum:
İlgili değişken lokasyonundan iki byte birer registere okunur (iki read instruction).
Low byte bir artırılır. (Bir instruction).
Overflow varsa high byte bir artırılır. (Bir instruction).
Değerler yerlerine yazılır. (İki write instruction).
Altı instruction en kötü durumda.
Haa bir de reti komutu var. Etti yedi.
Atmega328 her bir clock cycle'da bir instruction işlediğine göre yedi clock cycle kullandık. Bu da 16 MHz'de çalışan bir işlemcide 437.5 nS ediyor. 500 desek... Aralarda da ana kod için 500 nS bıraksak. Yani her bir mikrosaniyede bir bir pulse gelmiş oluyor. Bu da 1 Mhz demek. Her bir devir için iki pulse ve iki interrupt geleceğini düşünürsek, saniyede 500 bin devir ediyor. Bu da dakikada 30 milyon devire karşılık oluyor.
Yanlış mı hesapladım?

Peki bir de tersten gidelim.
Diyelim ki 300 bin devir ölçüyoruz. Yani dakikada 600 bin interrupt gelecek. Saniyeye vurursak 10 bin interrupt ediyor. Her bir interrupt içinde 500 nS geçtiğine göre bir saniyenin (10.000 * 0.0000005 = 0.050 yani 50 mS) 50 milisaniyesi ya da başka bir deyişle yüzde beşi bu işle geçecek. Zamanın %95'i ise koda ayrılmış olacak. Hiçbir türbin 300 bin devir dönmüyor bu arada. Bizim hedef devir sayımız 125 bin.
Yanlış mı hesapladım?

NOT: "Yanlış mı hesapladım" sorusunu aslında kendime sormuştum. Artık işlemci datasheetine kötü dalmış bulunuyorum. Hesap doğru mu değil mi bulacağım! :)
 
Son düzenleme:
Bugün yine türbin testleri için sahadaydık. Tabii yanımızda laptop ve programlayıcı ile birlikte. :) Bolca test ve düzeltme yaptık. Bazı algoritmaları değiştirdik. Sonunda 95000 devri gördük. Zaten bu çalıştırmalar için 100 bin limiti koymuştuk koda. Türbinin hassas balansından snra 125'e çıkaracağız limiti.
 
Vay vay kolay gelsin..
İhtiyacınız olup ürettiremediğiniz parçaların malzemeleri neler acaba ? birde aşağı yukarı boyutları ne kadar ?
 
Şimdi bugünkü araştırmaların sonucunu paylaşayım:

Şu komut dizisinin ne kadar sürede işleneceğini araştırıyordum.

ISR(PCINT0_vect)
{
cntr++;
}


Çok yeterli bir bilgiye ulaşamadım. Ben de bir test yapmaya karar verdim. Arduino Uno'ya şu kodu yazdım:

int cntr;

void setup()
{
Serial.begin(9600);
TCCR1A = 0;
TCCR1B = 1;
TCCR1C= 0;
}

void loop()
{
TCNT1 = 0;
sub();
Serial.println(TCNT1);
delay(500);
}

void sub()
{
cntr++;
}


Kod, Timer1'i 16 MHz hızında çalıştırıyor. Timer1 sayacını sıfırlayıp en baştaki koda benzer bir alt programı çağırıp o arada Timer1'in kaça kadar saydığını ekrana yazıyor.
Eğer cntr için integer değişken kullanırsam sonuç 11, long değişken kullanırsam sonuç 21 oluyor. ECU kodunda bu değişken integer. Yani Timer1 bu kodu işlerken 11'e kadar sayıyor.
sub() altprogramının bir interrupt servis rutini olarak çağrılması durumunda süre biraz daha uzayabilir (işlemcinin yapacağı ek işlemler nedeniyle).

Timer1'in 11'e kadar sayması demek 1.000.000 / 16.000.000 * 11 = 0.6875 mikrosaniye demek. Yani 687,5 nanosaniye. Dİyelimki tümü 1 mikrosaniye olsun.
300 bin devir hesabını tekrar yaparsak, dakikada 600 bin interrupt demek saniyede 10 bin demek. Yani her 100 mikrosaniyede bir interrupt geliyor ve 1 mikrosaniye boyunca işlemci interrupt servisi yapıyor. Yani işlemci zamanının yüzde birini harcamış oluyoruz.

Demek ki ilk yaptığım hesap çok da fazla şaşmamış.

16 MHz saat hızındaki bir Atmega 328 ile yüksek devir ölçülemez diyen arkadaşlarımın bilgisine sunarım...
 
ECU 1.56 versiyon halen Gelibolu'da iki farklı motoru çalıştırmaya devam ediyor. İstanbul'da da versiyon 1.60'a ulaştık. Artık yakıt pompasının hassas güç ayarını o anki pil gerilimine göre dengeleyerek motoru çalıştırıyoruz ki bence bu çok önemli bir ayrıntı.Son versiyonu (ve aralardakileri de) 18 - 19 Mayıs hafta sonu test etmeyi umuyoruz. Eğer bu testler istediğimiz gibi sonuçlanırsa tamamen yeni bir plaket tasarımı ile vealıcıdan kumanda edilecek şekilde yeni bir ECU yapmayı planlıyorum.
 
Tamamen yeni bir plaket tasarımına girişmeden önce geçtiğimiz Pazar günü JetFest sırasında eski ECU ile motorumuzu birkaç kez çalıştırdık. Yakıt akışı ile ilgili bazı değişikliklerden sonra gayet keyifle birkaç tur çalıştırıp izleme imkanımız oldu.
Alıcı bağlantısı için bazı teknik sorunları aşmam gerekeceği için şimdilik o işe girişmiyorum. Yakıt akışı için yeni bir algoritma planladık ve onu test etmek istiyorum. Bunedenle hataları düzeltilmiş yeni bir ECU plaketi hazırladım. Temelde eskisinin aynı, sadece birkaç değişiklik yapılmış durumda. Kablolama ve soketler daha profesyonelce yapıldı. İlk fırsatta bunu version 1.70 kod ile test edeceğiz.

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol
 
SÜMER abi başından sonuna kadar hayranlıkla okudum emeğine sağlık neladar güzel bir iş başarmışsınız gerçekten eldeki imkanları sonuna kadar kullanıp bu işin yapılabilmesi ve çalışması gurur verici çok canı gönülden tebrik ediyorum sizleri ve hevesle takip ediyorum abi.
 
SÜMER abi başından sonuna kadar hayranlıkla okudum emeğine sağlık neladar güzel bir iş başarmışsınız gerçekten eldeki imkanları sonuna kadar kullanıp bu işin yapılabilmesi ve çalışması gurur verici çok canı gönülden tebrik ediyorum sizleri ve hevesle takip ediyorum abi.
:) Çok teşekkür ederim.
 
Basit bir GSU ile uzaktan kontrol edilen ve tüm işlevlerine çevir / bas buton ile erişilebilen sistem kullanıma hazır. Bu videoda kullanım ile ilgili bazı detayları görebilirsiniz.

Bu VIDEOYU görmek için izniniz yok. Giriş yap veya üye ol
 
Birtakım elektronik devre sorunları yaşıyordum. Özellikle starter motoru ve kızdırma bujisi oldukça fazla akım çekiyorlar. Onların devreye girişleri sorunlu olabiliyordu. Sistem resetleniyordu tam onlar çalışırken ya da kilitleniyordu. Yabacı bir elektronik forumunda epey bir tartıştık konuyu.
Eğer Atmega işlemci çıkışı ile MOSFET gate ucu arasına (olması gerektiği gibi) 47 - 100 ohm bir direnç koyarsam hızlı anahtarlama nedeniyle sorun oluyordu. Çünkü plaket tasarımında acemilik yapmış, ground hatlarını uygun tasarlamamıştım. Eğer 47 - 100 ohm yerine 1 - 2.2 kohm direnç koyarsam sistem çalışıyor ama anahtarlamanın yavaşlaması nedeniyle MOSFET'ler fazlaca ısınıyorlardı. Sisteme farklı yerlere iki adet devasa kondansatör lehimleyerek idare edecek bir sonuca ulaşmıştım. Ama içim rahat değildi.
Farklı bir yola girmeye karar verdim.
Yüksek akımlı elemanları tamamen sistemden ayırıp ayrı bir karta, kontrol bölümünü ayrı bir karta aldım. Boyutlar küçüldü, iki katlı bir sistem oldu. İşin daha iyi tarafı, iki kartı ayrı ayrı geliştirmek mümkün olacak bu şekilde.

Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol


Bu RESMİ görmek için izniniz yok. Giriş yap veya üye ol