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

Hallo,
je mehr klappt um so mehr möchte mann.

Hat schon mal jemand eine vernünftige Schaltung für einen VDO Öldruckmesser erstellt ? ( Mit OP +/- 10V Ausgang für Arduino 0-5V)
Breich 0 bis 8 bar
http://www.ljf-design.com/westfield/vdo_pressure_sensors.pdf
( Wenn ja .. kann ich diese bekommen ? )

Hat auch schon mal jemand eine vernünftige Schaltung für einen Temperatursensor NTC 8k Ohm Sensor erstellt ? ( Mit OP +/-10V Ausgang für Arduino 0-5V)
Temperaturbereich 0 bis 150°C
( Wenn ja .. kann ich diese bekommen ? )

Wenn es das nicht gibt,
wäre es mir recht wenn jemand die Schaltung macht, über ein entgeld müste man dabei sprechen.

Danke
Grüße
Ratlos

Für beide Sensoren kannst du meines Erachten die gleiche Schaltung verwenden, nur die Werte differieren.

Ich verstehe allerdings nicht, wofür du einen OP mit +/- 10V Ausgang brauchst, wenn du doch mit dem Arduino nur 0V-5V verarbeiten kannst?

Brauchts auch nicht, es geht viel einfacher!

Einfach einen Spannungsteiler mit internem Widerstand und dem externen Sensor bilden, und die dabei entstehende Spannung messen.

Der Widerstand R1 bildet dabei mit dem Sensor den Spannungsteiler.
Er sollte so dimensionierte werden, dass er in dem Messbereich, in dem du die größte Genauigkeit erwartest, etwa genauso groß ist, wie der Widerstandswert des Sensors. Allerdings darf dabei der maximale Strom des Sensors nicht überschritten werden!

C1 sollte möglichst nach am Steckerpin nach aussen sitzen, und sehr gut an Masse angebunden sein. (Massefläche!?) Er filtert Störer aus, bevor sie sich in der Elektronik breit machen können.
R2 / C2 bilden einen Tiefpass, um die Grenzfrequenz unter die der Abtastfrequenz du drücken. Die Dimensionierung hängt vom Signal ab, wie schnell sich das ändert, und davon, wie oft du das Signal abtastest. Beispiel: Du hast eine Signal das sich langsam ändert (Temperaturen!) und du fragst den AD alle 100ms ab.
fg = 1/100ms = 10Hz. Passende Werte wären: R2 = 16k C2 = 1µF
Die beiden Dioden D1 und D2 sind Schottky-Dioden, die den Eingang des Arduino schützen sollen.

Dimensionierungsvorschlag:

Für den Drucksensor:
R1 = 150R 0,5W 1%
R2 = 16k
C1 = 10nF / 100V
C2 = 1µF + 100nF parallel
D1, D2 = BAT43 o.ä.

Für den NTC:
R1 = 4.7k 1%
R2 = 16k
C1 = 10nF / 100V
C2 = 1µF + 100nF parallel
D1, D2 = BAT43 o.ä.

Diese Art von Schaltung ist völlig ausreichend, mehr braucht es nicht.
(So lesen auch die meisten Elektroniken in den Autos die Sensoren ein!)

Grüße

Gunther

Hallo Gunther,

dachte die im PKT sind hochtrabend komplizierter.

Habe oft gelesen das das nur mit OP usw im akzeptabelen bereich liegt.
Oder das es im gebrauch wegen der Temperaturänderung sehr weite trifte gibt.
Werde das mal so machen wie Du schreibst.

Danke Dir

Grüße
Ratlos

Hi Rastlos,

nur aus Interesse: Geht es Dir nur um die Anzeige der Werte, oder tüftelt Du vielleicht an einem Puzzlestück für eine dynamische Kennfeldmanipulation zur Ladedruckregelung (-maximierung) eines Turbomotors?

Ratlos:
Habe oft gelesen das das nur mit OP usw im akzeptabelen bereich liegt.
Oder das es im gebrauch wegen der Temperaturänderung sehr weite trifte gibt.

Im professionelle Automotive Geschäft werden hier aus zwei Gründen keine OPs verwendet:

  1. OPs kosten Geld. Und da geht es um jeden Cent.
  2. Halbleiter driften über Temperatur viel stärker als passive Komponenten. (Es gibt aus welche die weniger driften, aber die sind teuer, Siehe Punkt 1.)

Wenn ein Sensor bereits ein Ausgangsignal im messbaren Bereich liefert, (und das tun die beiden Sensoren, die du dir ausgesucht hast) dann ist ein Einsatz von OPs nicht nur überflüssig, sondern führt meist zu einer Verschlechterung. Vor allem bei Elektroniken, die in einer stark wechselnden Umgebungstempertur eingesetzt werden. Die üblichen Methoden, einen OP mit Hilfe eines Trimmers abzugleichen, funktioniert wenn das alles im Haus eingesetzt wird, also bei konstanter Temperatur. Wenn man diese Elektronik dann auf 100°C aufheizt, dann ist der Abgleich völlig weg. Deshalb: je weniger Bauteile das Messergebnis beeinflussen können, um so besser.
Bei einer echten Automotive-Anwendung würden auch die beiden Schottkydioden wegfallen, weil die über ihre Leckströme Fehler verursachen, und weil die dort eingesetzten Controller geschützte Eingänge haben. Für den Arduino sind sie zwingend notwendig.

Grüße

Gunther

Gunther

Danke Dir Gunther,

Hallo Helmuth ,

es geht mir nur um die ungefähre anzeige der werte.

( Kennfeldmanipulation zur Ladedruckregelung (-maximierung) eines Turbomotors? ) von sowas lasse ich besser die Finger.
Bei sowas würde ich die
http://www.trijekt.de/
zu rate ziehen und auf das System setzen.

Grüße
Ratlos

Hi Rastlos, danke für den Link, war mir nicht bekannt. Und ist preislich voll im Rahmen, wie ich finde.

Gruß, Helmuth.

Hallo zusammen,

ich muss diesen Threat ausbuddeln.

So ganz direkt hat das nicht mit dem Arduino zu tun, möchte aber einen Arduino nutzen um folgende Werte aufzunehmen, umzuformen, und auf einem LCD-Display darzustellen.

Habe die Schaltung für den Messumormer "Widerstand VDO-Sensor -> Spannung" nachgebaut,
habe bei 184ohm (Vollausschlag Drucksensor, also 10 bar) Spannung von 2.8V und bei 10ohm ("Offset" Drucksensor, 0 bar)
0.3Volt.

Das heisst also, ich habe einen Bereich von 2.5V der linear zum Druckgeber verlaufen sollte. Habe aber gegen gemessen, und erhalte bei 50 ohm, das dann eigentlich 0,5V sein sollte, 1,3V!

Warum ist die Spannung so unliniear?

Richtig linear sind diese Sensoren nicht wirklich.
Evtl. macht auch die Schutzschaltung /Tiefpass den Graphen etwas krumm.

Eine Methode wäre mit bekannten Stützwerten, also Druck/Spannungspaare zu arbeiten.
Die Werte dazwischen lassen sich mit linealer Interpolation berechnen.

Klingt kompliziert ist es aber nicht.
Wenn du willst kann ich dir die funktion geben, die kommt auch von Gunther :slight_smile:

Ja, ich bitte darum!

Wenn ich ehrlich bin, habe ich die Hälfte deiner Antwort nicht verstanden.

Ich experementiere seit 2 Wochen mit dem Arduino herum, innerhalb 2h habe ich die LCD-Ansteuerung begriffen, Texte, Laufschriften usw. gebastelt. Aber seit 3 Tagen versuche ich eigentlich ununterbrochen in meiner Freizeit, was vernünftiges aus dem Drucksensor herauszubekommen...

Habe auch die Schaltung von diesem Herrn hier nachgebaut

(er rechnet es in Pressure per Inch, US), aber diese Funktion funktioniert ebenso wenig, obwohl ich beachtet habe, dass er mit einem Range von 0-5bar, und ich mit 0-10bar arbeite, ist aber gleiche Widerstandskennlinie.

Interpolation ist Umkehrung? Stützwert ist eine Art Tabelle, wichtige Eckwerte von 10-184ohm ~ 0V-2.55V zu erfassen?

Die Sperrdioden sind in meiner Schaltung erstmal nicht drin, ich habe erstmal mit einem 7805, "gestützt" mit 100uF Kondensatoren die 5V anliegen.

Schreib das mal ruhig rein.
Wäre für mich auch interessant...

:smiley:

Andy966:
ich muss diesen Threat ausbuddeln.

Du hast den falschen Thread ausgebuddelt.

Hier in diesem Beitrag
http://forum.arduino.cc/index.php?topic=155733.msg1325925#msg1325925
habe ich offenbar genau den auch von Dir verwendeten Sensor mal durchgerechnet und eine passende Funktion gepostet.

Wenn Du das in dem Beitrag gepostete Schaltbild nachbaust und den Code der Funktionen "float pressure_VDO5bar" in Deinen Sketch reinkopierst, brauchst Du eigentlich nur noch den Ohm-Wert des Vorwiderstands wissen und rechnest Dir dann mit dem Code:

pressure=pressure_VDO5bar(vorWiderstand, messwert/1023.0);

mit den Parametern "vorWiderstand" = Größe des Vorwiderstands in Ohm und
"messwert" = analogRead-Messwert (0...1023)
den Öldruck gemäß Kennlinie aus.

Hallo,

ich glaube, dass werde ich erstmal versuchen zu verstehen, dort geht es eigentlich um den VDO-Öldrucksensor 0-184ohm (0-5bar)

http://forum.arduino.cc/index.php?topic=155733.30

Andy966:
Hallo,

ich glaube, dass werde ich erstmal versuchen zu verstehen, dort geht es eigentlich um den VDO-Öldrucksensor 0-184ohm (0-5bar)

Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ) - Deutsch - Arduino Forum

Na bravo!

Du hast einen 0-10 bar Sensor von VDO?

In dem Fall müssen natürlich die Polynom-Koeffizienten für diesen Sensor berechnet werden.
In meinem Code stehen die Koeffizienten für den 0-5bar Sensor drin.

Polynom dritter Ordnung mit Berechnungskoeffizienten hast Du ja offenbar bereits, das braucht dann nur noch in die Formel integriert werden. Sag Bescheid, wenn Du dabei Hilfe benötigst!

Hallo,

nein, bin nicht direkt davon ausgegangen, dass die 0-5 Bar Sensor sich so einfach auf den 0-10 Bar Sensor übertragen lässt.

Und zum herumbuddeln: Ich habe den "besseren" Threat gar nicht entdeckt, bevor ich hier was geschrieben habe.

Sondern mit erstmal lesen meinte ich, dass der Sketch schon riesig und komplex gegen über dem aussieht, was ich gemacht habe. :sweat_smile:

EDIT: Dazu kommt noch, dass ich mit der Schaltung einen Offset von 0.3 Volt habe (0.3-2.8V ~ 0-184ohm Widerstand vom Geber)

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

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);                               // initialisiere die library an den digitalen interface pins

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);
  lcd.write("\357LD:");                                              // druckt an dieser Stelle (Cursor) "OLD:"
                                                                     
}

void loop() {                                                        // loop, Dauerschleife, alles was in {} steht
  int SensorSpannungsWertOeldruck = analogRead(A1);                  // lese Wert am analog pin 0:
  float oeldruck = SensorSpannungsWertOeldruck * (20.0 / 1023);      // Rechne den Wert (0-1023) von sensorValue von Volt in bar
                                                                     // 2,5V = 10bar max peak
                                                                                                                                   
  lcd.setCursor(4, 0);                                               // setzt Cursor an Stelle 4, Reihe 0
  delay(200);                                                        // 200ms warten (quasie die Wiederholungsrate LCD warte)
  lcd.print(oeldruck,2);                                             // LCD druckt den Wert mit 2. Kommastelle (oeldruck)
  
  }

Andy966:
nein, bin nicht direkt davon ausgegangen, dass die 0-5 Bar Sensor sich so einfach auf den 0-10 Bar Sensor übertragen lässt.

Man muß halt ein anderes Polynom für den 10-Bar-Sensor einsetzen als für den 5-Bar-Sensor.

Das Polynom aus Deiner Tabelle ist leider völlig unbrauchbar, denn das ist ein Polynom, um aus dem gegebenen Druck den Widerstand des Sensor zu errechnen.

Du brauchst aber das umgekehrte Polynom, um aus dem gegebenen Widerstand des Sensors den Druck auszurechnen.

Code für den VDO-10-Bar-Sensor anbei.

// 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: http://forum.arduino.cc/index.php?topic=155733.0
//       http://forum.arduino.cc/index.php?topic=152024
{
  float a = 8.37e-8;
  float b = 0.000054058;
  float c = 0.0439893708;
  float d = -0.4453831665;
  float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
  float pressure= a*RN*RN*RN + b*RN*RN + 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() {
  Serial.begin(9600);
  float pressure;
  float vorWiderstand=100;
  int messwert; // Messwert am Analogpin
  Serial.println();
  Serial.println("Wert\tca. V\tDruck");
  // In einer Schleife alle möglichen Messwerte simulieren
  for (messwert=0;messwert<1024;messwert++)
  {
    pressure=pressure_VDO_10bar(vorWiderstand, messwert/1023.0);
    Serial.print(messwert);
    Serial.print('\t');
    Serial.print(messwert*5/1023.0);
    Serial.print("V\t");
    Serial.print(pressure);
    Serial.println(" bar");
  }
}

void loop() {
  // put your main code here, to run repeatedly: 
}

Die in dieser "Simulation" ausgegebenen Spannungswerte sind nur "circa", da von der tatsächlichen Betriebsspannung abhängig. Und der Wert der absoluten Betriebsspannung wird eigentlich auch nirgends benötigt, denn in die Berechnung fließt nur das Verhältnis von Messspannung zu Betriebsspannung ein, eben der Messwert von analogRead geteilt durch 1023. D.h. ob der Arduino jetzt mit 4,7 Volt oder 5,1 Volt läuft, spielt für die Messung und Berechnung keinerlei Rolle, sondern die absolute Betriebsspannung fällt aus der Berechnungsformel komplett heraus und hängt nur vom Spannungsverhältnis an der Spannungsteilerschaltung ab.

Andy966:
EDIT: Dazu kommt noch, dass ich mit der Schaltung einen Offset von 0.3 Volt habe (0.3-2.8V ~ 0-184ohm Widerstand vom Geber)

Das ist völlig normal bei dieser Schaltung mit Spannungsteiler am Widerstand.
Da der Drucksensor auch einen Offset hat, und 0 bar NICHT 0 Ohm entsprechen, sondern 0 bar 10 Ohm entsprechen, gibt es natürlich auch bei der gemessenen Spannung am Spannungsteiler einen Offset.

Okay, 1A Hilfestellung schonmal!

Was ich mit dem Code machen soll weiss ich nicht. Also noch nicht :wink:

Eigentlich sollte die Kennlinie linear sein!
(Hersteller-Angabe)

Andy966:
Was ich mit dem Code machen soll weiss ich nicht.

Du fügst die Funktion "float pressure_VDO_10bar(float RV, float VA_VB)" in Deinen eigenen Sketch ein, mißt die Spannung zwischen Vorwiderstand und Sensor, und rufst in der loop immer dort die Funktion auf, wo der Druck ausgerechnet werden soll. Danach zeigst Du den Druck irgendwie an, z.B. auf Serial. Oder vielleicht auch auf einem LCD-Display.

Dieser Code zeigt den gemessenen Druck auf Serial an:

// 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: http://forum.arduino.cc/index.php?topic=155733.0
//       http://forum.arduino.cc/index.php?topic=152024
{
  float a = 8.37e-8;
  float b = 0.000054058;
  float c = 0.0439893708;
  float d = -0.4453831665;
  float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
  float pressure= a*RN*RN*RN + b*RN*RN + 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() {
  Serial.begin(9600);
}

void loop() {
  float pressure;
  float vorWiderstand=100; // Hier Vorwiderstand in Ohm angeben!
  int analogPin=A0;        // Hier den Analog-Pin angeben!
  int messwert=analogRead(analogPin); // Hier wird gemessen!
  pressure=pressure_VDO_10bar(vorWiderstand, messwert/1023.0); // Hier wird gerechnet!
  Serial.print(pressure);  // Hier wird der Druck ausgegeben!
  Serial.println(" bar");  // Hier wird die Einheit des Drucks und das Zeilenende ausgegeben!
  delay(1000); // Hier wird eine Sekunde Pause gemacht
}

Die Schaltung hast Du bereits fertig? Falls nicht, hier nochmal die Schaltung dazu:

Öldruck-Messschaltung mit veränderlichem Messwiderstand

VB -----<Vorwiderstand>-----<Messwiderstand>----- Ground 0V
5V            RV         |        RN
                         |      
                         |      
                    Analogeingang
                      am Arduino
			 VA

Edit/Nachtrag:
Weshalb Deiner Meinung nach der Sensor angeblich "linear" sein soll, erschließt sich mir nicht. Du hast hier doch selbst einen Auszug des Datenblatts gepostet, in dem von "Characteristic Curve" und "Polynom" die Rede ist. Also von "Kurve" und "Polynom". Wenn der Sensor einen linearen Verlauf hätte, dann wäre eher von "Gerade" und "Linearer Verlauf" die Rede. Das steht aber nirgends im Datenblatt, ich sehe da nur was von Kurve und Polynom.

Andy966:
Schade, dass der Sensor nicht wie vom Hersteller behauptet, linear ist. Da hätte ich mir die 80 EUR auch sparen können, und einen billig-Sensor kaufen können. Da bin ich etwas enttäuscht von deutschen "Premium-Hersteller" VDO.

Die Widerstandskennlinie des Sensors IST linear!

Wenn den Sensor dann allerdings als Spannungsteiler betreibst, dann wird die kennlinie eben gekrümmt.
da kann der Sensor aber nichts dafür!

Im Anhang ein Codebeispiel, wie man aus einer Wertetabelle mittels linearer Interpolation den Korrekten Sensorwert ermittelt, sowie ein Excel-Sheet zur Berechnung der Wertetabelle. Im Excelsheet mußt du nur noch deinen Vorwiderstand eingeben, dann kannst du den im Gelben Feld erzeugten Code in die Funktion kopieren.

Wertearray.xls (12 KB)

lineare_Interpolation.ino (2.12 KB)

guntherb:
Die Widerstandskennlinie des Sensors IST linear!

Ne, schau nochmal genau hin:
2 bar - 52 Ohm
6 bar - 124 Ohm
10 bar - 184 Ohm

Linear würde bedeuten, daß bei gleichen Unterschieden im bar-Wert auch gleiche Unterschiede im Ohm-Wert auftreten.

Aber zwischen 2 bar und 6 bar (Differenz 4 bar) liegen 124-52 = 72 Ohm
Und zwischen 6 bar und 10 bar (Differenz 4 bar) liegen 184-124 = 60 Ohm
D.h. die Steigung der Kurve unterscheidet sich in den beiden Bereichen.
Es ist eine Kurve.

Ich rechne doch nicht mühsam Polynom-Koeffizienten für eine Gerade aus.