İlk değişiklik

Dört boyutlu haritanın şimdilik gereksiz olduğuna karar verdim. Çok fazla veri vardı ve CPU utilizasyonunu arttırıyordu. Ben de daha basit bir yol seçmeyi düşündüm. (Şimdilik 🙂 )

Kafamdaki tam olarak şu;

Öncelikle yakıt için 3 boyutlu bir haritadan verileri MAP ve RPM e dayalı olarak veriyi çekecek. Daha sonra kendi hesapladığı süre ile karşılaştırıp OEM ECU ‘larda olduğu gibi trimler kullanarak püskürtme süresini ayarlayacak.

Bunun için taslak scriptte şöyle bir değişikliğe gittim.

  • Öncelikle global değişkenler tanımlamam gerekti.

int XCount;
float LTFTrim;
float Total_Trim;

  • Bir sayıcı eklemek zorunda kaldım

Adından da anlaşılacağı üzere XCount değişkeni sayıcım. Beş kez STFT değeri yüksek çıkarsa LTFT değerini %5 arttırıyor/eksiltiyor.

  • Trim değerleri için karşılaştırma satırları eklendi.

if (STFTrim <= -20)
{
STFTrim = -20;
XCount = ++XCount;
if (XCount > 5)
{
XCount = 0;
LTFTrim = LTFTrim – 5;
if (LTFTrim <= – 20)
{
LTFTrim = -20;
}
}
}
if (STFTrim >= 20)
{
STFTrim = 20;
XCount = ++XCount;
if (XCount > 5)
{
XCount = 0;
LTFTrim = LTFTrim + 5;
if (LTFTrim >= 20)
{
LTFTrim = 20;
}
}
}

    Buna göre kısa vadeli düzeltme değerine göre %5 lik dilimler halinde kalıcı değişkenin değeri değişiyor. Her beş veri okumanın sonunda artış/eksilme yapılıyor. Her iki değer de %20 ile sınırlı. İleride buna hata kodu eklemeyi planlıyorum.

 

  • Son PWM değerini hesaplamak için eklentiler yaptım. Osilaskopta okuduğum duty-cycle değeri hesapladığımla birebir örtüşüyor. 🙂
  Total_Trim = LTFTrim + STFTrim;
Inj_Value = fuel_Value + Total_Trim;

  pwmvalue = map(Inj_Value, 0, 99, 0 ,255);

analogWrite(11, pwmvalue);

 

Reklamlar

Başladık bakalım

İlk denemeler başarılı.
İki tane potansiyometre alıp adruino uno nun analog girişlerine bağladım. Bunlar temsili sensörlerim olacak. 🙂 Bunlardan gelen verilere göre 4 boyutlu haritalarımdan uygun değeri seçerek PC nin comport’una gönderiyorum. Evet daha yolun başında bile sayılmam belki ama yıllar önce öğrencilik yıllarımda öğrendiğim C’yi yeniden keşfetmem gerektiği hesaba katılınca aslında fena da yol almadım hani. 🙂

Neyse Sketch ime kısaca göz gezdirirsek; Öncelikle haritaları tanımlamakladım.

int fuel_Map[4][10][12] = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 10, 10, 12, 12, 12, 12, 13, 12, 12, 10, 0,
2, 10, 11, 20, 13, 15, 15, 20, 25, 15, 10, 0,
3, 10, 12, 14, 18, 18, 18, 30, 25, 15, 10, 0,
4, 10, 15, 18, 20, 22, 35, 30, 25, 15, 10, 0,
5, 10, 22, 20, 22, 25, 35, 30, 25, 15, 10, 0,
6, 10, 20, 22, 25, 28, 35, 30, 25, 15, 10, 0,
7, 10, 22, 25, 30, 30, 35, 30, 25, 15, 10, 0,
8, 10, 15, 20, 33, 35, 35, 32, 25, 15, 10, 0,
9, 10, 15, 25, 35, 40, 40, 35, 25, 15, 10, 0,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
3, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
4, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
7, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
9, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
2, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
3, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
4, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
5, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
6, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
7, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
8, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
9, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
1, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
2, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
3, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
4, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
5, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
6, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
7, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
8, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0,
9, 147, 147, 147, 147, 147, 147, 147, 140, 135, 130, 0};
Buna göre 4 ayrı yüzey, 10 satır ve 12 sütundan oluşan 4 boyutlu harita hazırlanmış oldu. Değerler tamamen afaki tabi.

Daha sonra analog portlardan gelen veriyi okumaya geldi sıra.

int fuel_Value = 0;
int MapSensorVal = analogRead(A0);
int RpmSensorVal = analogRead(A1);
// int TpsSensorVal = analogRead(A2); Üçüncü potansiyometreyi alana kadar buna sabit değer atamak durumunda kaldım. 🙂
int TpsSensorVal = 0 ;

Malum 8 bit ADC kullanılan portlarda 0-1023 arası değer çevrimi yapılabiliyor. Yani sizin porta gönderdiğiniz 5 ya da 3.3V u 8 bit data olarak çevirdiğimiz için öncelikle bunu scale etmek gerekiyordu. Bunun için map fonksiyonunu kullandım ki faydalı bir eser zira ara değerlerde kendi yuvarlama yaptığı için çok fazla gereksiz veri girişine gerek kalmıyor.

RpmSensorVal = map(RpmSensorVal, 0, 1023, 0, 11);
MapSensorVal = map(MapSensorVal, 0, 1023, 0, 9);
TpsSensorVal = map(TpsSensorVal, 0, 1023, 0, 4);

 

Hadi şimdi sensörlerden gelen verilere göre haritamızdan uygun değeri çekip com
portuna gönderelim. Veri sıralaması [yüzey][satır][sütun] olacak şekilde

fuel_Value = fuel_Map[TpsSensorVal][MapSensorVal][RpmSensorVal];
Serial.print(“MAP value : “);
Serial.println(MapSensorVal);Serial.print(“RPM value : “);
Serial.println(RpmSensorVal);

Serial.println(” “);
Serial.print(“PWM value : “);
Serial.println(fuel_Value);
Serial.println(” “);
Serial.println(“—————– “);

ComPort görüntüsü şöyle bir şey oldu.

 

map1

Genel strateji

Başlangıçta sadece yakıt kontrolünü yapabilmeyi planlıyorum. Bunun için çok kullanılan üç ayrı yöntem var.

Birincisi motorun hacimsel verimliliğinin haritasını çıkartıp kaydederek sensörlerden gelen veriye göre püskürtme süresini hesaplayarak enjektör sinyalini oluşturmak. Bunun kendine göre kolaylıkları ve kısıtlamaları var. Avantaj kısmında çok fazla bir şey bilmeye gerek kalmaksızın temel bir V E (Volumetric Efficiency = Hacimsel verimlilik) haritası ile bile marşa basabiliyor olmanız.  Tabi bu büyük kolaylık sağlıyor. En önemli sıkıntısı ise her döngüde tek tek tüm verileri kontrol edip hesaplama yapması nedeni ile işlemci ve RAM kaynaklarına ihtiyaç duyuyor olması. Gerçi işlemcilerin üç otuz paraya satılmaya başlandığı şu günlerde bu pek sıkıntı değil artık ama en büyük dezavantajı bu. Megasquirt ve benzeri ECU lar

İkinci yöntem ise basit haritalar hazırlayarak, kullanılan sensörlere göre bunların değerlerini el ile girerek statik püskürtme süreleri ile çalışmak. Genelde Piggy-back ve LPG ECU ları falan bu tip püskürtme yapıyor.

Üçüncü yöntem ise (ki bu OEM üreticilerin kullandığı yöntem) sabit haritalar kullanarak sabit değerler verip ek olarak sensörlerden gelen verilerle hesaplama yapıp tablodaki hazır değerler ile karşılaştırılarak püskürtmenin sağlanması ve trimler kullanarak sürekli sistem kontrolünün sağlanması.

Benim yapmak istediğim üçüncü yöntem elbette ancak daha henüz işin ABC sinde olduğum için ikinci yöntem ile başlayıp sonrasında birincisi ile hibritleyerek üçüncüye ulaşmak. Tabi bu noktada closed loop correction stratejisini oluşturabilmem feedback interfacelerini hazırlamam ve scripte onları da dahil etmem gerekiyor. Acelem yok elbet bitecek. Başladık…

Yolum uzun hadi tutmayın beni. :))

 

Enjektör kontrolü

Merhaba,

Epeydir aklımda olup bir türlü başlamadığım, elimin varmadığı, zaman bulamadığım kısacası yapmadığım enjektör kontrol devresi projeme başladım. Başlangıçta C ile firmware i hazırlayıp arduino ile test ettikten sonra gerekirse başka bir işlemci kullanıp onun için compile etmeyi planlıyorum. Ama temelde strateji belirlemem gerekiyor. Onun içinde ABC den başlayacağım.

Neden arduino? Çünkü açık kaynak kodlu olduğu için internette zilyon tane kaynak var. Neredeyse her ne isterseniz bulabiliyorsunuz. Bulamasanız bile yazabiliyorsunuz. Bellek adreslemeleri falan binlerce kez paylaşılmış. O nedenle temelde onunla başlayıp gerekirse ileride işlemciyi değiştiririm diye düşündüm. Halihazırda Arduino Uno üzerinde ilk denemelerimi yapıyorum. Elimde hazırda Mega ve Due de var. Nihai hedef olarak Due üzerinde çalıştırmayı düşünüyorum. Mega ile çevrebirimleri kontrol edeceğim. Interface lerin I/O devreleri zaten daha önce başkaları tarafından geliştirildiği için sıkıntı yok. Sadece onları daughter board olarak kullanılabilmesi için yeniden hazırlamam gerekecek.

Neyse velhasıl-ı kelam bindik bir alamete gidiyoruz kıyamete bakalım. Umarım maymun iştahımın kurbanı olmaz bitiririm. 🙂