VDO Öldruck 0-10 bar + Temperatur NTC 8k Ohm

Hallo jurs, hallo guntherb,

erstmal Danke, dass ihr euch die Zeit genommen habt, hier dazu etwas zu schreiben, und durchzurechnen.

Beim Thema linear habe ich mich selber widersprochen, das stimmt. Habe aus dieser Tabelle eventuell auch falsche Werte entnommen:

Zum VDO Öldrucksensor muss ich noch sagen, dass ich auch schon in div. Foren aufgeschnappt habe, dass der ab 7 bar Erfassung nach oben driftet. Was eigentlich nicht schlimm ist, denn an meinem KFZ-Motor am Motorblock "liegen" eh nur maximal 6-7 bar Öldruck an.

Die Schaltung habe ich schon aufgebaut, und ist im Probebetrieb. Die Schaltung wird seperat mit einem ungeregelten 12V Netzteil versorgt, geht in einen 7805 Festspannungsregler. Gegen das "schwingen" habe ich 2 Kondensatoren vor- und -nachgeschaltet.

Was vom vorgeschlagenen Schaltungsaufbau abweicht, ist dass ich keinen festen 150R Widerstand benutze, sondern einen Spindelpoti 200R. So kann ich "Softwaremäßig" und "Hardwaremässig" die Geschichte einpendeln.

Würde mir von einem damaligen Arbeitskollegen, der sich viel Zeit genommen hat, mir eine LCD Öldruck Anzeige zu entwerfen, so empfohlen.

Der Sketch funktioniert nun! Vielen Dank für die Geduld und Mühe!

So sieht das im Moment aus:

#include <LiquidCrystal.h> // richte die library fuer das LCD ein

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// VDO pressure sensor code by 'jurs' for German Arduino Forum

float pressure_VDO_10bar(float RV, float VA_VB)
// Ermittlung des Drucks mit einem VDO Öldruckgeber 10bar
// Erklärung der Parameter:
// RV : Vorwiderstand in Ohm
// VA_VB : Spannungsverhältnis "Spannung am NTC zu Betriebsspannung"
// Rückgabewert : Öldruck
//
// Info: Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ) - Deutsch - Arduino Forum
// VDO Öldruck 0-10 bar + Temperatur NTC 8k Ohm - Deutsch - Arduino Forum

{
float a = 8.37e-8;
float b = 0.000054058;
float c = 0.0439893708;
float d = -0.4453831665;
float RN=RVVA_VB / (1-VA_VB); // aktueller Widerstand des NTC Oeldruckgeber
float pressure= a
RNRNRN + bRNRN + c*RN + d;
if (pressure<0) return 0; // Begrenzung nach unten, keine negativen Werte extrapolieren
else if (pressure>11.1) return 11.1; // Willkürlich gewählte Begrenzung nach oben
else return(pressure);
}

void setup() { // das Setup / die Initialisierung wird erst bei Reset neu geladen
lcd.begin(40, 2); // LCD-Setup (40 Stellen in 2 Reihen)
lcd.setCursor(0, 0); // setze den Cursor an Stelle 0, Zeile 0
lcd.write("\357LD:"); // schreibe an dieser Stelle (Cursor) "OLD:"
}

void loop() {
float pressure;
float vorWiderstand=150; // Hier Vorwiderstand in Ohm angeben!
int analogPin=A1; // Hier den Analog-Pin angeben!
int messwert=analogRead(analogPin); // Hier wird gemessen!
pressure=pressure_VDO_10bar(vorWiderstand, messwert/1023.0); // Hier wird gerechnet!
lcd.setCursor(4, 0); // setzt Cursor an Stelle 4, Reihe 0
lcd.print(pressure,2); // LCD druckt den Wert mit 2. Kommastelle (oeldruck)
delay(200); // 200ms warten (quasie die Wiederholungsrate LCD warte)
}

Und das ist mein Schaltungsaufbau im Moment (etwas gruselig noch, aber wird schon):

@ Andi996: Schön, dass es nun funktioniert! Glückwunsch!

@ Jurs: ja, im streng mathematischen Sinn ist die Kennlinie nicht linear.
Allerdings ist die einfache Gerade, die ich verwendet habe so genau, dass sie weitestgehend innerhalb der Toleranzen des Sensors liegt.

Ich komme ja aus der Branche, und generell werden bei uns Sensorkennlinien als Tabelle abgelegt und linear interpoliert.
das hat den Vorteil, dass du jede beliebige Kennlinie abbilden kannst. Allerdings oft nicht äquidistant wie in meinem Beispiel, sondern in Bereichen in denen die 2.Ableitung besonders gross ist, enger, und auch in den Bereichen, in denen die Messwerte wichtig sind, enger.

Ich finde auch den Ansatz leichter: ich kann mir im Excel die Kennlinie basteln und dann einfach die Werte in den Code kopieren.

Ist es dann eine Glaubensfrage ob man mit Polynom Koeffizienten eine Formel errechnet oder eine Tabelle mit linearer Interpolation benutzt ?
Beide werden immer genauer je mehr Stützwerte man nimmt oder bei den Polynomen die Ordnung erhöht.

Bei meinem letztem Fall sah der Graph einer Glockenkurve ähnlich nur im Maximum breiter (Steigung dort über mehrere Werte 0)

Dies konnte ich mit Polynomen zwar nachbilden nur in dem Bereich ging der Graph über die Grenzen, einen längeren Bereich mit Steigung 0 ist mit den Polynomen IHMO nicht möglich.
Gunther gab mir den Tip mit der Tabelle und linearer Interpolation, das passte dort viel besser.

Mein Verständnis nach wäre ein gangbarer Weg, erst die Punkte ins Koordinatensystem eintragen und sich die fiktive Kurve ansehen.
Und dann beurteilen welche Methode besser ist.

@ Andi996

.... Was eigentlich nicht schlimm ist, denn an meinem KFZ-Motor am Motorblock "liegen" eh nur maximal 6-7 bar Öldruck an.

Das hat auch einen Grund, wenn der Öldruck > 7 bar ansteigt, diesen Fehler gibt es beispielsweise bei einem klemmendem Öldruckregelkolben . Die Hydrostößel verhindern dann durch den zu hohen Druck ein vollständiges Schließen der Ventile.
Dies führt zu schlechtem Motorlauf oder auch zu einem Liegenbleiber.

rudirabbit:
Ist es dann eine Glaubensfrage ob man mit Polynom Koeffizienten eine Formel errechnet oder eine Tabelle mit linearer Interpolation benutzt ?

Letztlich ja.
Es ist wie so oft: viele Wege führen zum Ziel.
In der Praxis ist es aber oft recht aufwändig, die richtige Funktion zu ermitteln, wogegen eine Wertetabelle bei jedem Sensor dabei ist. Ganz zu schweigen von der Rechenzeit. Polynome höherer Ordung fressen Ressourcen. Die lineare Interpolation ist sehr schnell. Und an einer modernen Motorsteuerung für einen Verbrennungsmotor hängen bis zu 20 Sensoren!
Und die Genauigkeit? Die ist in beiden Fällen besser als die des Sensors selbst.

Und an einer modernen Motorsteuerung für einen Verbrennungsmotor hängen bis zu 20 Sensoren!

Das ist mir bekannt, schließlich ist es Teil meines Jobs das die Motoren wieder laufen, oder auch das die MIL-Led nicht mehr leuchtet.

OT: Aus deiner Antwort könnte man rauslesen, das du die in der Firmwareentwicklung Motormanament tätig bist ?
Wenn ja, hätte ich einige Fragen :slight_smile:

rudirabbit:
Aus deiner Antwort könnte man rauslesen, das du die in der Firmwareentwicklung Motormanament tätig bist ?

Ich war es lange Jahre. Jetzt bin ich mehr in der Verwaltung gelandet. Aber früher war ich mal richtiger Intschinör!

guntherb:
Ganz zu schweigen von der Rechenzeit. Polynome höherer Ordung fressen Ressourcen. Die lineare Interpolation ist sehr schnell.

Ich habe mal einen Beispiel-Sketch gemacht, der für alle 175 Ohm-Werte zwischen 10 Ohm und 184 Ohm des 10bar Sensors einmal die Drücke per linearer Interpolation und einmal per Polynom errechnet.

Code:

float linear(float resistance)
{
  if (resistance<=10) return 0;
  else if (resistance>=184) return 10;
  else return 10*(resistance-10)/(float)(174);
}

float polynom(float resistance)
{
  float a = 8.37e-8;
  float b = 0.000054058;
  float c = 0.0439893708;
  float d = -0.4453831665;
  if (resistance<=10) return 0;
  else if (resistance>=184) return 10;
  else return a*resistance*resistance*resistance + b*resistance*resistance + c*resistance + d;
}


float p_linear[175];
float p_polynom[175];
unsigned long timer, t_linear, t_polynom;

void setup() {
  Serial.begin(9600);
  // Zuerst 175 Werte per linearer Interpolation ermitteln
  timer=micros();
  for (int i=0;i<175;i++) p_linear[i]=linear(i+10);
  t_linear=micros()-timer;
  // Dann 175 Werte per Polynomenformel ermitteln
  timer=micros();
  for (int i=0;i<175;i++) p_polynom[i]=polynom(i+10);
  t_polynom+=micros()-timer;
  Serial.println();
  // Wertetabelle ausgeben
  Serial.println("Ohm\tlinear\tpolynom");
  for (int i=0;i<175;i++)
  {
    Serial.print(i+10);
    Serial.print(" Ohm\t");
    Serial.print(p_linear[i]);
    Serial.print("\t");
    Serial.print(p_polynom[i]);
    Serial.println();
  }
  Serial.println();
  // Zeitbedarf ausgeben
  Serial.print("Zeitbearf mit linearer Interpolation: ");
  Serial.println(t_linear);
  Serial.print("Zeitbearf mittels Polynomengleichung: ");
  Serial.println(t_polynom);
}

void loop() {
}

Ja, die Berechnung per Polynomenformel dauert länger als per linearer Interpolation.
175 mal einfache lineare Interpolation: 10396 µs
175 mal Polynomenformel: 15380 µs
Das sind 50% zusätzlicher Zeitbedarf für die Berechnung.
Oder anders ausgedrückt: Es sind (15380-10396)/175 = ca. 28,5 µs pro Messung.

Einige Worte auch noch zur Genauigkeit: In der Ausgabe des Demoprogramms kann man genau sehen, welche Druckunterschiede errechnet werden, wenn man die krumme Kurve per Polynomenformel zur Berechnung heranzieht oder wenn man einfach eine Gerade durch den Anfangs- und Endpunkt der Kurve legt und linear interpoliert.

Da die Kurve eine einseitige Krümmung hat, sind bei linearer Interpolation zwischen Anfangs- und Endpunkt alle errechneten Drücke zu einer Seite verschoben, in der Mitte der Kurve teils um mehrere Zehntel bar.

Um die absoluten Abweichungen nicht zu groß werden zu lassen, müßte man sich also nicht nur bei der Polynomenformel ein paar Gedanken wegen der Koeffizienten machen, sondern auch bei der linearen Interpolation, und kann nicht einfach zwischen Anfangs- und Endpunkt der Kurve interpolieren, wenn eine gute absolute Genauigkeit eher bei mittleren Messwerten gegeben sein soll und nicht nur am Anfangs- und Endpunkt der Kurve. Dann müssen nämlich die Punkte für die Interpolation vielmehr so gelegt werden, dass ein Teil der Kurve oberhalb und ein anderer Teil der Kurve unterhalb der Interpolationsgeraden liegt. Und das erfordert dann auch ein bisschen mehr, als nur die im Datenblatt gegebenen Tabellenwerte einfach einzusetzen.

Hallo Zusammen,

habe soeben diesen Thread gefunden, vielen Dank jurs, dass du hier soviel geholfen hast.
Bin aktuell auch an einem ähnlichen Projekt dran, jedoch ist dies für einen Motorprüfstand gedacht.
Am Motor sind schon Druck- und Temperatursensoren verbaut, welche zum Steuergerät gehen.
Kann ich bei diesen einfach das Signal abzweigen oder hat es dann Einflüsse auf die eingelesenen Signale im Steuergerät?

Vielen Dank.

Kwios:
habe soeben diesen Thread gefunden, vielen Dank jurs, dass du hier soviel geholfen hast.
Bin aktuell auch an einem ähnlichen Projekt dran, jedoch ist dies für einen Motorprüfstand gedacht.
Am Motor sind schon Druck- und Temperatursensoren verbaut, welche zum Steuergerät gehen.
Kann ich bei diesen einfach das Signal abzweigen oder hat es dann Einflüsse auf die eingelesenen Signale im Steuergerät?

Jede Leitung wirkt als "Antenne" und fängt als solche elektromagnetische Wellen und "Elektro-Smog" ein. Und wenn Du eine "lange Leitung" irgendwo anders anschließt, wo schon Signale anliegen, koppelst Du damit natürlich auch zusätzliche Störungen mit ein.

Die EMV-Maßnahmen zur "elektromagnetischen Verträglichkeit" im vorhandenen Motorsteuergerät zum dazu passenden Motor werden genau für den vom Hersteller vorgesehenen Betriebsfall ausreichend sein, ohne dass der Hersteller Entstörmaßnahmen zigfach zu großzügig dimensioniert hat.

Ob Du da störungsfrei Deine eigenen Messleitungen anschließen kannst, keine Ahnung.
Das wirst Du wohl selbst ausprobieren müssen, ob sich das nachteilig auswirkt.

Außerdem müßtest Du natürlich prüfen, ob es von den Spannungspegeln her passt, irgendwoanders Signale für eine Arduino-Schaltung abzugreifen: Arduino-Boards arbeiten meist mit 5 Volt und verkraften maximal Betriebsspannung+0,5 Volt an den Eingängen.

Hallo,

ich möchte das Thema auch noch mal ausgraben, ich möchte den Umgekehrten Weg gehen.

Also ich habe ein modernes MSG mit CAN-BUS und möchte die alten VDO Anzeigen ansteuern.

Ich bekomme also die Öl- Druck/Temp Werte aus dem CAN-BUS und muss diese so Umwandeln
das sie auf den alten VDO Instrumenten richtig angezeigt werden.

Die CAN-BUS Auswertung ist kein Problem, aber wie bekommt man am einfachsten die
Instrumente mit dem MC angesteuert?

Gruß
Jackson

Kleine Schrittmotoren(Endschalter nicht vergessen), oder Servos, hinter den Skalen.
Alten Zeiger auf die Motorwelle kleben.

Eine Referenzfahrt des Instruments, beim Zündung anmachen, ist eine immer wieder gerne gesehene Show.

Wenn du die orginal Instrumente nicht verändern willst, dann wirst du die Sensoren durch eine DAC gesteuerte Stromsenke ersetzen müssen.
(würde ich mal so annehmen)

Nein ich möchte die original (Drehspul) Instrumente nicht verändern.

Hast du einen link für mich auf dem ich Beispiele für eine DAC oder I2C/SPI gesteuerte Stromsenke finde?

Vorab: VDO Instrumente ansteuern habe ich noch nie getestet.

Da das Ganze nicht schnell sein muss, könntest du auch PWM und einen Tiefpass als DAC verwenden.
Und einen Transistor nach schalten.
NPN, oder FET, je nach dem, was dir besser gefällt.