Go Down

Topic: Öl Temperatur messen, welcher Öltemperaturgeber? (KFZ) (Read 54535 times) previous topic - next topic

Ratlos


jurs


Das mit dem Typ K sensor und den VDO 150°C geht dank des Forums Super gut.
Daher noch einmal mit scharm eine frage.........................  smiley-red

kannst Du aune Formel für einen Drucksensor erstellen ?
http://www.druckgeber-oeldruckgeber.de/vdo-druckgeber-ohne-wk-daten.html


Das kann ich tun, sieht eher nach einer Kleinigkeit zum Rechnen aus.

Wenn die Spannungsteilerschaltung aus Vorwiderstand und Sensor dieselbe ist, gilt auch dieselbe Formel für die Messschaltung beim Messen mit dem Arduino:
RN= RV*VA/VB / (1-VA/VB) ==> Formel für den Widerstand des Sensors!

Das ist schonmal die halbe Miete. Der einzige Unterschied ist nun, dass es kein Datenblatt mit einer Formel für die Beziehung zwischen Widerstand und Messwert (in diesem Fall Druck) gibt, sondern nur eine kleine Tabelle. Und aus der Tabelle muss man sich selbst erst eine Formel aufstellen.

Mit dem 5bar Sensor meinst Du den, der diese Werte hat:
0 bar  -  10 Ohm
1 bar  -  48 Ohm
2 bar  -  82 Ohm
3 bar  - 116 Ohm
5 bar  - 184 Ohm

Wenn man das in einem xy-Koordinatensystem aufträgt, sieht man: Es ist keine Gerade. Eine lineare Interpolation zwischen den Punkten liefert daher sehr schlechte Ergebnisse.

Meine Idee wäre daher, eine Parabel als Nährungskurve zu verwenden, gegeben durch die Gleichung zweiter Ordnung:

p = a * RN2 + b * RN + c

mit
p= Druck
RN = Widerstand des Sensors

Eine Gleichung zweiter Ordnung ist durch drei Punkte vorgegeben, daher wähle ich aus der Tabelle drei Punkte zum Aufstellen der Gleichung, und zwar Anfangs- und Endpunkt und den Messpunkt in der Mitte:
0 bar  -  10 Ohm
2 bar  -  82 Ohm
5 bar  - 184 Ohm

Daraus ergeben sich drei Gleichungen mit drei Unbekannten:

0 = a * 102 + b * 10 + c
2 = a * 822 + b * 82 + c
5 = a *1842 + b * 184 + c

Und da ich ein fauler Sack bin wenn es ums Lösen geht, gehe ich auf http://www.arndt-bruenner.de/mathe/scripts/gleichungssysteme.htm wo es einen Online-Rechner zum Lösen solcher Gleichungen gibt, und bekomme heraus:

  float a=1.0/106488;
  float b=1433.0/53244;
  float c=-3595.0/13311;

So dass der Arduino den Druck nach dieser Formel rechnen kann:
pressure=a*RN*RN + b*RN + c;

Dabei bekomme ich folgende Wertetabelle herausgerechnet:
Code: [Select]

Ohm  bar
---  ----
10  0.00
11  0.03
12  0.05
13  0.08
14  0.11
15  0.14
16  0.16
17  0.19
18  0.22
19  0.24
20  0.27
21  0.30
22  0.33
23  0.35
24  0.38
25  0.41
26  0.44
27  0.46
28  0.49
29  0.52
30  0.55
31  0.57
32  0.60
33  0.63
34  0.66
35  0.68
36  0.71
37  0.74
38  0.77
39  0.79
40  0.82
41  0.85
42  0.88
43  0.90
44  0.93
45  0.96
46  0.99
47  1.02
48  1.04
49  1.07
50  1.10
51  1.13
52  1.15
53  1.18
54  1.21
55  1.24
56  1.27
57  1.29
58  1.32
59  1.35
60  1.38
61  1.41
62  1.43
63  1.46
64  1.49
65  1.52
66  1.55
67  1.58
68  1.60
69  1.63
70  1.66
71  1.69
72  1.72
73  1.74
74  1.77
75  1.80
76  1.83
77  1.86
78  1.89
79  1.91
80  1.94
81  1.97
82  2.00
83  2.03
84  2.06
85  2.09
86  2.11
87  2.14
88  2.17
89  2.20
90  2.23
91  2.26
92  2.29
93  2.31
94  2.34
95  2.37
96  2.40
97  2.43
98  2.46
99  2.49
100  2.52
101  2.54
102  2.57
103  2.60
104  2.63
105  2.66
106  2.69
107  2.72
108  2.75
109  2.78
110  2.80
111  2.83
112  2.86
113  2.89
114  2.92
115  2.95
116  2.98
117  3.01
118  3.04
119  3.07
120  3.09
121  3.12
122  3.15
123  3.18
124  3.21
125  3.24
126  3.27
127  3.30
128  3.33
129  3.36
130  3.39
131  3.42
132  3.45
133  3.48
134  3.50
135  3.53
136  3.56
137  3.59
138  3.62
139  3.65
140  3.68
141  3.71
142  3.74
143  3.77
144  3.80
145  3.83
146  3.86
147  3.89
148  3.92
149  3.95
150  3.98
151  4.01
152  4.04
153  4.07
154  4.10
155  4.13
156  4.16
157  4.19
158  4.22
159  4.25
160  4.28
161  4.31
162  4.34
163  4.37
164  4.40
165  4.43
166  4.46
167  4.49
168  4.52
169  4.55
170  4.58
171  4.61
172  4.64
173  4.67
174  4.70
175  4.73
176  4.76
177  4.79
178  4.82
179  4.85
180  4.88
181  4.91
182  4.94
183  4.97
184  5.00

Für 0, 2 und 5 bar ergeben sich dabei die exakten Werte, denn diese Punkte hatte ich ja zum Aufstellen der Gleichung verwendet. Bei der Interpolation der beiden anderen bekannten Punkte ergibt sich folgender Fehler:

Statt  48 Ohm - 1 bar
Gerechnet: 48 Ohm 1.04 bar
und
Statt
116 Ohm - 3 bar
Gerechnet: 116 Ohm - 2.98 bar

Bevor ich weitermache:
Die Interpolationsfehler der von mir aufgestellten Formel von 0,02 bis 0,04 bar an einigen Punkten der Messkurve sind zu verkraften, oder muss es genauer gerechnet werden?

jurs

#32
Jul 23, 2013, 08:58 am Last Edit: Jul 23, 2013, 09:34 am by jurs Reason: 1

Die Interpolationsfehler der von mir aufgestellten Formel von 0,02 bis 0,04 bar an einigen Punkten der Messkurve sind zu verkraften, oder muss es genauer gerechnet werden?


Ach, was soll's, die verlinkte Seite zum Auflösen von Gleichungen erlaubt auch umfangreichere Gleichungssysteme, also mache ich mir jetzt mal die Mühe zur Aufstellung einer Formel für eine lineare Gleichung vierter Ordnung aus allen fünf Punkten für eine noch genauere Interpolationsformel.

0 = a * 104 + b * 103 + c * 102 + d * 10 + e
1 = a * 484 + b * 483 + c * 482 + d * 48 + e
2 = a * 824 + b * 823 + c * 822 + d * 82 + e
3 = a * 1164 + b * 1163 + c * 1162 + d * 116 + e
5 = a * 1844 + b * 1843 + c * 1842 + d * 184 + e
ausmultipliziert zum Einsetzen auf der Webseite:
0 = 10000a + 1000b + 100c + 10d + e
1 = 5308416a + 110592b + 2304c + 48d + e
2 = 45212176a + 551368b + 6724c + 82d + e
3 = 181063936a + 1560896b + 13456c + 116d + e
5 = 1146228736a + 6229504b + 33856c + 184d + e
Lösung:
 float a = 2.331362828169e-9;
 float b = -1.00248601611e-6;
 float c = 1.498600025947e-4;
 float d = 0.020190012411;
 float e = -0.21590695198;

Die Schaltung und die Variablen wie gehabt:
Code: [Select]

Öldruck-Messschaltung mit veränderlichem Messwiderstand

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

mit
VB = Betriebsspannung des Arduino (irgendwo bei ca. 5V)
RV = Vorwiderstand
RN = Widerstand des Messwiderstands (in diesem Fall druckabhängig!)
VA = Spannung am Arduino-Messeingang

Code: [Select]


/* VDO oil pressure calculation by 'jurs' for German Arduino Forum

Für den 5bar VDO-Öldrucksensor mit dieser Wertetabelle:
0 bar  -  10 Ohm
1 bar  -  48 Ohm
2 bar  -  82 Ohm
3 bar  - 116 Ohm
5 bar  - 184 Ohm

Interpolation mit Hilfe eines Polynoms vierter Ordnung:
p = a*x^4 + b*x^3 + c*x^2 + d*x + e
0 = 10000a + 1000b + 100c + 10d + e
1 = 5308416a + 110592b + 2304c + 48d + e
2 = 45212176a + 551368b + 6724c + 82d + e
3 = 181063936a + 1560896b + 13456c + 116d + e
5 = 1146228736a + 6229504b + 33856c + 184d + e

Aufgelöst mit Hilfe: http://www.arndt-bruenner.de/mathe/scripts/gleichungssysteme.htm
  float a = 2.331362828169e-9;
  float b = -1.00248601611e-6;
  float c = 1.498600025947e-4;
  float d = 0.020190012411;
  float e = -0.21590695198; 
*/


float pressure_VDO5bar(float RV, float VA_VB)
// Ermittlung des Drucks mit einem VDO Öldruckgeber 5bar
// 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
{
  float a = 2.331362828169e-9;
  float b = -1.00248601611e-6;
  float c = 1.498600025947e-4;
  float d = 0.020190012411;
  float e = -0.21590695198; 
  float RN=RV*VA_VB / (1-VA_VB); // aktueller Widerstand des NTC
  float pressure= a*RN*RN*RN*RN + b*RN*RN*RN + c*RN*RN + d*RN +e;;
  if (pressure<0) return 0; // Begrenzung nach unten, keine negativen Werte extrapolieren
  else if (pressure>6.66) return 6.66; // Willkürlich gewählte Begrenzung nach oben
  else return(pressure);
}


void setup() {
  Serial.begin(9600);
  float pressure;
  float vorWiderstand=180;
  int messwert; // Messwert am Analogpin
  Serial.println();
  Serial.println("Wert  Druck");
  // In einer Schleife alle möglichen Messwerte simulieren
  for (messwert=0;messwert<1023;messwert++)
  {
    pressure=pressure_VDO5bar(vorWiderstand, messwert/1023.0);
    char buf[20];
    char buf1[15];
    dtostrf(pressure,4,2,buf1);
    sprintf(buf,"%4d  %s",messwert,buf1);
    Serial.println(buf);
  }
}

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



Überlegungen zur Größe des Vorwiderstands: Der Gesamtwiderstand aus Vorwiderstand und Sensor muss mindestens so gross sein, dass der absolute Maximalstrom eines Arduino Pins (40 mA) nicht überschritten wird. In Frage kommen daher Vorwiderstände von 150 oder 180 Ohm, so dass sich mit 10 Ohm Minimalwiderstand des Sensors folgende Maximalströme bei 5V Betriebsspannung ergeben:

I= U/(10+RV150)= 5/160 = 31 mA bei RV= 150 Ohm
I= U/(10+RV180)= 5/190 = 26 mA bei RV= 180 Ohm (den würde ich wohl nehmen)

rudirabbit

#33
Jul 23, 2013, 10:55 am Last Edit: Jul 23, 2013, 11:08 am by rudirabbit Reason: 1
Wow:  jurs   !

Ich wollte schon fragen, wie man unter Einbeziehung aller Punkte die Funktionsvorschrift bestimmt.
Du kannst vor allem auch gut erklären.

Ich hatte nur die Realschule (Technischer Zweig, also sowas wie Mathe LK dort), war immer zwischen 1..2 .
Trotzdem fehlt mir halt einiges im Lehrplan im Vergleich zum Gymi.
Arduino UNO,MEGA,DUE 
Dunkel die andere Seite ist. - Klappe, Yoda, und iss deinen Toast :-)

Ratlos

Mensch Mensch echt Danke jurs

Deine Erste mit dem VDO die ist echt sehr sehr gut.  "habe die ausführlich getestet"

Werde diese auch  Testen und Dir berichten.

Grüße
Ratlos

jurs


Werde diese auch  Testen und Dir berichten.


Alles klar, da bin ich ja mal gespannt!

Übrigens Kommando zurück was die Berechnung des Vorwiderstands betrifft: Der Strom fließt ja gar nicht über einen Digitalpin des Controllers, sondern nur zwischen 5V und GND. Und am 5V Pin des Arduino Boards darf man bei den meisten Boards bis zu 200mA entnehmen, die 40 mA Grenze für Controller-Pins greift daher NICHT.

Ich weiß nicht, wieviel Strom der Ödruckgeber maximal verkraftet und konnte auch keine Datenblattangaben dazu finden, aber ich schätze mal, dass der schon deutlich mehr als 40mA verkraftet. Um möglichst viel von der 10-Bit ADC Auflösung des Arduino auszunutzen, wäre es daher wahrscheinlich sinnvoller, eher einen Vorwiderstand zu verwenden, der im Bereich des Widerstands des Öldruckgebers liegt. Z.B. 82 Ohm Vorwiderstand. Der Maximalstrom bei 82 Ohm Vorwiderstand und 10 Ohm bei Nulldruck am Geber beträgt dann:
I = U/R = 5 / (82+10) = 54 mA

Das gibt der 5V Pin am Arduino locker her und auch der Geber sollte das locker verkraften.
Also vielleicht doch eher 82 Ohm Vorwiderstand statt 180 Ohm.
Prinzipiell funktionieren sollte beides.

Zum Messen natürlich keine Widerstände mit 10% oder 20% Toleranz verwenden, sondern welche mit höchstens 1% Toleranz (oder noch bessere "Messwiderstände"), sonst nützt die genaueste Formel nichts.

turbo91

Hi erstmal, also ich habe hier in dem Thema endlich eine Antwort auf meine fragen bekommen, ich habe bei mir den VDO Temperaturgeber verbaut. Nur möchte ich mein Analogeingang gegen Überspannung schützen, dies würde ja mit einer Diode gehen.
Nur würde diese ja mein Messergebniss verfälschen. Wie kann ich diese wieder rausrechnen?


Danke im vorraus:-)

guntherb

Nimm eine Schottky-Diode auf 5V.
die verfälscht (bei normalen Temperaturen) nicht.

Falls du das anders machen willst, wäre ein Schaltung hilfreich für die Anworten.
Grüße
Gunther

jurs


Nur würde diese ja mein Messergebniss verfälschen. Wie kann ich diese wieder rausrechnen?


Eine Transienten-Suppressordiode zwischen +5V und GND in der Messschaltung verfälscht den Messwert nicht.

Falls Du andere Arten von Dioden mit unbekannten Daten und auf andere Art in die Schaltung integrieren möchtest, so dass die Messwerte verfälscht werden, kannst Du die Schaltung zur Steigerung der Genauigkeit ggf. kalibrieren.

Du machst zum Kalibrieren z.B. immer zwei Messungen, einmal ohne die Schutzschaltung und einmal mit, bei derselben Temperatur, und beobachtest, um wieviel sich die Temperaturanzeige beim Anschalten des zusätzlichen Bauteils ändert:
- Bei Zimmertemperatur ohne/mit Schutzbauteil: Temperaturanzeige ändert sich wieviel?
- Bei kochendem Wasser ohne/mit Schutzbauteil: Temperaturanzeige ändert sich wieviel?
- Bei erhitztem Frittieröl (Vorsicht Brandgefahr!) ohne/mit Schutzbauteil: Temperaturanzeige ändert sich wieviel?

Dann kennst Du den Einfluß des Bauteils an drei festen Temperaturpunkten. Und um den Einfluß bei anderen Temperaturen zu erhalten, kannst Du den Korrekturwert mittels linearer Interpolation ermitteln.

guntherb

Jurs hat recht, Transienten-Suppressordioden helfen, und meine Antwort mit den Schottky dioden war zu kurz gegriffen.
Ich hatte übersehen, dass es sich um eine Automotive Anwendung handelt.

Im KFZ mußt du mit verschiedenen Arten von Überspannung rechnen:
a) im Falle eine Kabelfehler dauerhaft 12V
b) hochenergetische Pulse die kapazitiv in die Sensorleitung eingekoppelt werden die Spannungen größer als +/-100V haben können.

Entsprechend mußt du auch zweimal filtern:
Einmal mit Suppressordioden oder anderen Bauteile die die entsprechenden Energien aufnehmen können, um die hohen Spannungspulse platt zu machen. Dabei hast du das Problem, dass du ja die Suppressordiode so dimensioniern mußt, dass bei normalen Signalspannungen noch kein Strom durch die Schutzdiode fließt.
Wenn du hier eine wählst mit einer Nennspannug von 5V, dann hast du eine Klemmenspannung größer 7V. Zuviel.
Also brauchst noch eine zweite Stufe:
nach einem Widerstand je eine Schottky-Diode von Signal auf 5V und GND. Die klemmt dann die restliche Spannung auf für den µC verträgliches Niveau. Zusätzlich noch einen EMV-C am Eingang der Schaltung und einen Filter-C vor dem AD-Pin.

Also: von aussen kommend:
- einen EMV-kondendator  (ca 22nF / 50V keramisch)
- Supressordioden
- Längswiderstand
- Schottkydioden
- Filter-C (der mit dem Längswiderstand einen Tiefpass bildet, der auf das Signal und die Abtastung abgestimmt ist)
- AD-Pin
Grüße
Gunther

uwefed

#40
Jan 25, 2014, 04:09 pm Last Edit: Jan 25, 2014, 04:11 pm by uwefed Reason: 1


Übrigens Kommando zurück was die Berechnung des Vorwiderstands betrifft: Der Strom fließt ja gar nicht über einen Digitalpin des Controllers, sondern nur zwischen 5V und GND. Und am 5V Pin des Arduino Boards darf man bei den meisten Boards bis zu 200mA entnehmen, die 40 mA Grenze für Controller-Pins greift daher NICHT.

Am 5V Pin darfst Du bei Stromversorgung über USB-fast 450mA abgreifen (geschätzen Verbrauch für Arduino von 50mA). Der Stromverbrauch von Shields muß von diesem Wert noch abgezgen werden.
Der Maximalwert bei Stromversorgung mit einem Externen Netzeil hängt von der Verlustleistung am Spannungsstabilisator auf dem Arduino, und dmit von der Eingangspannung ab. Mehr als 1W würde ich ihm aber nicht zutrauen ohne langfristig die Platine (Platinenmaterial ) zu verschmoren.

Die 200mA sind die Grenze der GND und Spannungsversorgungspins des Microcontrollers und nicht der Pins des Arduinos. Die Pins der Arduinos sind durch die 40mA pro Ausgangspin, 200mA als Summe aller Ströme aller Ausgangspins für L bzw H Pegel. und zusätzlich 100 bzw 150mA für bestimmte Pinngruppen. Genaueres auf http://www.atmel.com/Images/doc8161.pdf Seite 313 Tabelle Kapitel 28.1 und Fußnoten 3 und 4 der Tabelle Kapitel 28.2.

Grüße Uwe

michael_x

Quote
Nur möchte ich mein Analogeingang gegen Überspannung schützen

Wenn du es genauso machst wie in diesem Thread vorher beschrieben ( 5V vom Arduino an den Öldruck-Sensor und einen 82 .. 100  Ohm Widerstand ) hast du eigentlich keine Überspannungsprobleme (ausser bei Verdrahtungsfehlern) und bei der Versorgung des Arduino selbst.
Wenn du den Geber am 12V Bordnetz betreibst, hast du ausser Überspannung noch ganz andere Probleme:
Willst du Druck ( oder inzwischen wieder die Temperatur ?)  oder die Batteriespannung messen?

turbo91

Oh das wird ja  doch mehr als ich dachte.
Also das Problem mit der Überspannung entsteht ja nur weil der Sonsor Masse am Gehäuse hat.
Da es in M10x1,0 keinen mir bekannten Sensor gibt, der eine Masseanschluss hat.
Wenn ich jetzt versuche einen größeren Sensor zu kaufen der einen Masseanschluss hat, benötige ich doch nur eine Schottky für die Induktiven Spannungen oder?
Danke für die vielen Antworten:-)

guntherb

Also das Problem mit der Überspannung entsteht ja nur weil der Sonsor Masse am Gehäuse hat.
Die Masse am Gehäuse sorgt vor allem für eine ungenaue Messung.
Mit dem AD misst du ja die Spannung zwischen AD und Arduino GND.
Wenn der Arduino seine Masse irgenwo herkriegt, z.B. aus der E-Box im Auto, und der Sensor seine Masse vom Motorblock, dann können da schnell einige 100mVbis zu 3V  potentialunterschied sein, die dir dann dein messergebnis verhauen.

Du brauchst einen Sensor, der potentialfrei ist, also keine Verbindung zum Gehäuse hat.
Eine Abhilfe wäre, einen zweiten AD-Eingang zu nehmen, und die relative Masse am Sensor mitzumessen dann kannst du den Fehler rausrechnen. (der Motorblock kann auch negativ gegenüber dem Arduino sein, du mußt also einen Spannungsteiler von 5V bilden)


...benötige ich doch nur eine Schottky für die Induktiven Spannungen oder?

Für eine Signalspannung (auf mit GND auf Gehäuse) kannst du auf die Supressordioden verzichten. Aber nicht auf den EMV-Kondensator und den Tiefpass!
Also: 22nF auf GND, 10k, 100nF nach GND, 2 Schottky, Arduino.

Wo ich dir die Supressordioden aber dringend empfehle, ist die Spannungsversorgung des Arduino!
KFZ Bordnetze sind recht versaut. da wandern Spannungspulse über +/-100V rum. vor denen solltest du den Arduino schützen.
Grüße
Gunther

turbo91

Danke, ich habe jetzt ein passenden NTC Sensor gefunden der ein Massekabel hat. Da muss ich die Rechnung von Jurs zwar noch minimal anpassen aber das sollte kein Problem darstellen:-).
Die Spannungsversorgung vom Arduino selber ist schon mit einem DC/DC Spannungsregler und entsprechendem Umfeld schon gerwgelt.

Go Up