VTG Ansteuerung eines Turbos

Guten Abend!

Ich bin gerade dabei meinen alten E34 525tds in Bezug auf Leistung zu tunen. Der nächste Schritt wäre jetzt ein VTG Turbo von einem späteren 3 Liter Diesel. Diese haben einen elektrischen Stellmotor montiert welcher mittels eines PWM Signals (300Hz) angesteuert werden kann.

Ich kann den Turbo bereits mit dem Arduino ansteuern. Momentan habe ich einen Potentiometer eingebunden um die Klappen manuell zu verstellen.

int potPin = 2;
int val = 0;

void setup() {
//  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  val = analogRead(potPin);
  val = map(val, 0, 1023, 100, 3200);
//  Serial.println(val,DEC);
  digitalWrite(13, HIGH);
  delayMicroseconds(val); 
  digitalWrite(13, LOW);
  delayMicroseconds(3333 - val);
}

Geplant ist allerdings eine Ansteuerung welche aus Werten von zwei Sensoren errechnet werden soll. Ich werde hier den Drehzahlsensor und die Spannung der Einspritzpumpe als Werte verwenden. Je nach diesen Werten sollen dann die Klappen im Turbo angesteuert werden.

Meine Frage wäre jetzt ob es im Arduino eine Möglichkeit gibt Maps bzw. Kennfelder zu erstellen.
Also eine X- und eine Y-Achse mit Werten wie in einer Tabelle. Falls das ganze nicht so einfach sein sollte bitte ich um Vorschläge wie ich dies sonst lösen könnte. Hatte mit dem Arduino bisher leider noch nicht so viel zu tun.

Danke!

Tabellen können auch im Flash (PROGMEM) abgelegt werden. Wenn der Platz nicht ausreicht, kann externer Speicher dazugenommen werden. Das wird zwar etwas langsam, aber Klappen verstellen dauert ja auch seine Zeit.

Hallo,

bewegst du deinen E34 525tds im öffentlichen Straßenverkehr?

DrDiettrich:
Tabellen können auch im Flash (PROGMEM) abgelegt werden. Wenn der Platz nicht ausreicht, kann externer Speicher dazugenommen werden. Das wird zwar etwas langsam, aber Klappen verstellen dauert ja auch seine Zeit.

Hättest du einen Beispielcode wie so etwas aussehen würde? Ich habe im Internet nichts gefunden, und die Funktion "map" legt ja auch nur Eingangswerte auf andere Werte um.

Wie hier zum Beispiel soll der Arduino bei 4000 Umdrehungen und 90% Gaspedalstellung einen Wert von 1830 an den Turbo weitergeben. Dass man nicht direkt ein Kennfeld in diesem Format hinterlegen kann ist mir klar, aber ich müsste diese Funktion realisieren.

Doc_Arduino:
Hallo,

bewegst du deinen E34 525tds im öffentlichen Straßenverkehr?

Zurzeit wird er noch gefahren ja, wenn der Umbau allerdings fertig ist soll er als Driftfahrzeug verwendet werden.

Vermutlich ist std::map noch weniger geeignet, da es um zweidimensionale Interpolation geht.

Welchen Wert willst du aus deiner Tabelle bei 3550 RPM / 55% nehmen?

Dass man nicht direkt ein Kennfeld in diesem Format hinterlegen kann ist mir klar

mir ist nicht klar, wie es ohne gehen könnte. 200 byte Flash für das Kennfeld. Daraus die 4 Nachbarwerte holen. Dann 3mal interpolieren...

Hallo,

die gezeigte Tabelle könnte man im Flash anlegen, Zugriff erfolgt übern Index.

#include <avr/pgmspace.h>

const unsigned int table[3][6] PROGMEM = {  // Zeilen, Spalten
    {  1,  2,  3,  4,  5,  6 },   // Zeilenindex 0
    { 11, 12, 13, 14, 15, 16 },   // Zeilenindex 1
    { 21, 22, 23, 24, 25, 999 }   // Zeilenindex 2
};

void setup(void) {
  Serial.begin(9600);
    
  int var = pgm_read_word (&table[1][2]);  // Zugriff auf 13
  Serial.println(var);
  var = pgm_read_word (&table[2][5]);      // Zugriff auf 999
  Serial.println(var);
  
}

void loop(void) {
  
}

noch ein Bsp. komplett auslesen

#include <avr/pgmspace.h>

constexpr byte sum_row = 3;
constexpr byte sum_col = 6;
constexpr unsigned int table[sum_row][sum_col] PROGMEM = {  // Zeilen, Spalten
  {  1,  2,  3,  4,  5,  6 },   // Zeilenindex 0
  { 11, 12, 13, 14, 15, 16 },   // Zeilenindex 1
  { 21, 22, 23, 24, 25, 999 }   // Zeilenindex 2
};

void setup() {
  Serial.begin(9600);
  pinMode(LED_BUILTIN, OUTPUT);

  for (byte y = 0; y < sum_row; y++) {
    for (byte x = 0; x < sum_col; x++) {
      int var = pgm_read_word (&table[y][x]);
      Serial.println(var);
    }
  }
}


void loop() {

}

Ich möchte mich schonmal für die Antworten bedanken und gleichzeitig für meine späte Antwort entschuldigen.
Das Projekt ist natürlich nicht tot, nur habe ich in sehr vielen Bereichen noch keine Erfahrung und muss mich erst einarbeiten. Die Zeit lässt es oft auch nicht ganz zu.

michael_x:
Vermutlich ist std::map noch weniger geeignet, da es um zweidimensionale Interpolation geht.

Welchen Wert willst du aus deiner Tabelle bei 3550 RPM / 55% nehmen?mir ist nicht klar, wie es ohne gehen könnte. 200 byte Flash für das Kennfeld. Daraus die 4 Nachbarwerte holen. Dann 3mal interpolieren...

Hättest du ein kleines Beispiel wie so etwas mit der Interpolation aussehen könnte? Oder kannst du mir nennen mit welchen Funktionen ich dies durchführen kann damit ich recherchieren kann?

Ein Zwischenwert wäre natürlich optimal.

Doc_Arduino:
Hallo,

die gezeigte Tabelle könnte man im Flash anlegen, Zugriff erfolgt übern Index.

#include <avr/pgmspace.h>

const unsigned int table[3][6] PROGMEM = {  // Zeilen, Spalten
   {  1,  2,  3,  4,  5,  6 },   // Zeilenindex 0
   { 11, 12, 13, 14, 15, 16 },   // Zeilenindex 1
   { 21, 22, 23, 24, 25, 999 }   // Zeilenindex 2
};

void setup(void) {
 Serial.begin(9600);
   
 int var = pgm_read_word (&table[1][2]);  // Zugriff auf 13
 Serial.println(var);
 var = pgm_read_word (&table[2][5]);      // Zugriff auf 999
 Serial.println(var);
 
}

void loop(void) {
 
}



noch ein Bsp. komplett auslesen


#include <avr/pgmspace.h>

constexpr byte sum_row = 3;
constexpr byte sum_col = 6;
constexpr unsigned int table[sum_row][sum_col] PROGMEM = {  // Zeilen, Spalten
 {  1,  2,  3,  4,  5,  6 },   // Zeilenindex 0
 { 11, 12, 13, 14, 15, 16 },   // Zeilenindex 1
 { 21, 22, 23, 24, 25, 999 }   // Zeilenindex 2
};

void setup() {
 Serial.begin(9600);
 pinMode(LED_BUILTIN, OUTPUT);

for (byte y = 0; y < sum_row; y++) {
   for (byte x = 0; x < sum_col; x++) {
     int var = pgm_read_word (&table[y][x]);
     Serial.println(var);
   }
 }
}

void loop() {

}

Ich danke dir schonmal für deine Antwort, ich denke dass ist schon so etwas was ich brauche. Ich werde mal herumprobieren damit ich den Code auch wirklich verstehe.