- Katılım
- 17 Eyl 2013
- Mesajlar
- 9,084
- Tepkime puanı
- 23,743
- Yaş
- 62
- Konum
- İstanbul
- Web sitesi
- www.sumeryamaner.com
- İlgi Alanı
- Uçak
Dur bir düşünelim...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.
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: