Merkwürdiges Verhalten eines Temperatursensors bei Minusgraden Im Unterforum Alle anderen elektronischen Probleme - Beschreibung: Was sonst nirgendwo hinpasst
Autor |
Merkwürdiges Verhalten eines Temperatursensors bei Minusgraden |
|
|
|
|
BID = 473576
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
|
Hallihallo zusammen,
zu Testzwecken habe ich meinen Temperaturlogger für 24h ins Tiefkühlfach des Kühlschrankes befördert. Ich wollte sehen, ob er negative Temperaturen sauber und ohne Fehler misst.
Dies tut er jedoch nicht so recht zu meiner Zufriedenheit.
Der Sensor ist ein DS1631. Er kommuniziert per I2C mit einem AVR und überträgt so die Temperaturdaten.
Die Folgende Datenreihe(Ausschnitt) soll nun das Problem zeigen:
-9.875
-9.875
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.9375
-9.0
-9.9375
-9.0
-9.9375
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-9.0
-10.0625
-10.0625
-10.0625
-9.0
-10.0625
-10.0625
-10.0625
Wie man sieht, tritt das Problem beim Wechsel der Einer auf. Dies ist auch bei allen anderen Wechseln so, also auch beim Wechsel von
-1.9375 auf -2 etc. (-1.9375 ==> -1.0 ==> -2.0625)
Hier am Beispiel wird anstelle von -10.0 eine -9.0 angezeigt... Der Logger liegt im Kühlfach und kühlt sich stetig ab. nach den -9.9375 sollte logischerweise die -10°C kommen... Doch es kommt eine -9.0, was ja nicht sein kann.
Auch nachher, als er von -10.0625 wieder auf -10 wechseln will, zeigt er eine -9 an...
Zum System: Die Daten werden auf einer SD-Karte gespeichert und per UART ans Terminal geschickt.
Der Sensor sendet zwei Bytes für einen Temperaturwert. Das erste Byte beinhaltet den Kram links vom Komma, das zweite Byte beinhaltet die Nachkommastellen.
Ist die Temperatur negativ, werden die Bytes vom Thermometer invertiert und dann ausgegeben.
Nun frage ich mich, wo der Fehler liegt. Bei meiner Software oder beim Sensor. Ich verdächtige irgendwie die Software, da dieses Problem nur bei negativen Zahlen auftritt. Allerdings wandelt meine Software den Wert des Thermometers eigentlich korrekt um.
Für eine -9.9375 werden vom Thermometer folgende zwei Bytes übertragen:
0b11110110 für die -9
und
0b00010000 für die 0.9375
Wechselt die Temperatur auf -10°, so kommen vom Thermometer folgende Werte:
0b11110110 für die -9 (NICHT -10° wie es sollte..)
und
0b00000000 für die 0.0
Diese Werte habe ich mir zu Testzwecken auch per UART ausgeben lassen. Dies weist ja eigentlich darauf hin, dass der Fehler beim Thermometer liegt und mein "Umwandlungsalgorithmus" funktioniert...
Hier der Code, der aus den zwei Thermometer-Bytes die Temperatur zusammenfrickelt:
Code : |
Twidaten1 = Karte(zähler) 'erstes Thermo-Byte aus der SD
Incr Zähler
Twidaten2 = Karte(zähler) 'zweites Thermo-Byte aus der SD 'twidaten2 = nachkommastelle, twidaten1 = vorkomma
Incr Zähler
'für negative Temperaturen:
If Twidaten1 > 127 Then ' Dann ist die Sache negativ
Twidaten1 = 255 - Twidaten1
Temp1 = Str(twidaten1)
Temp1 = "-" + Temp1 'für den Minus-Strich
Rotate Twidaten2 , Right , 4 ' Die Nachkommastelle bearbeiten
Temperatur = 16 - Twidaten2
Temperatur = 0.0625 * Temperatur
Temp2 = Str(temperatur)
Temp2 = Mid(temp2 , 2 , 5) 'schneidet das "0." ab.
Print Temp1 ; Temp2 'Die Vor- und Nachkommastellen ausgeben
Elseif Twidaten1 <= 127 Then ' für positive temperaturen
Rotate Twidaten2 , Right , 4 'Nur Nachkommastelle bearbeiten
Temperatur = Twidaten2
Temperatur = 0.0625 * Temperatur 'Nachkommastelle
Temp2 = Str(temperatur) 'schneidet das "0" ab.
Temp2 = Mid(temp2 , 2 , 5)
Print Twidaten1 ; Temp2
End If
|
|
Wie gesagt, für positive Temperaturen funktioniert alles tipptopp, nur bei negativen Temperaturen klappt der Wechsel auf den nächsten Einer nicht wie er soll. Anscheinend kommen vom Temperatursensor falsche Daten...
Oder liegt der Fehler beim Programmcode?
Sieht jemand auf den ersten Blick einen groben Fehler oder weiss Rat?
Im Prinzip funktioniert die Sache ja...
Herzlichen Gruss
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com |
|
BID = 473579
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
|
Zitat :
| Oder liegt der Fehler beim Programmcode? | Mit Sicherheit.
Wie kommst du zu der Ansicht, dass der Chip die Bytes mit zusätzlichen Start und Stop-Bits versieht, die ein UART erwartet ?
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten ! |
|
BID = 473588
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Das Ganze läuft so ab:
Der AVR wird durch den Timer2 aus dem Sleep geholt.
Per I2C fragt der AVR einen Temperaturwert vom Thermometer ab (2 Bytes) und speichert diese 2 Bytes direkt auf einer SD Karte. Danach legt sich der AVR wieder schlafen etc. etc.
Nach einer Weile der Datenaquisition hole ich den AVR aus dem Tiefkühler und hänge ihn per RS232 an den PC. Mit dem Terminal kann ich ihm dann den Befehl zur Ausgabe aller auf der SD Karte gespeicherten Daten bewegen. Zusätzlich wandelt der AVR diese 2 Bytes eines Temperaturwertes in eine für den Menschen besser lesbare Form um. (also z.B. 25.0625°C oder -15.5°C etc.)
Es werden also zunächst die Rohdaten des Thermometers auf der SD gespeichert.
Werden die Daten abgerufen, werden sie umgewandelt und dann per UART ans Terminal geschickt, in einer lesbaren Form.
Im obigen Codebeispiel sind die beiden Bytes "Twidaten1" und "Twidaten2" eben diese beiden Thermometer-Temperatur-Bytes und werden von der SD abgerufen und danach umgewandelt.
Zur Fehleranalyse habe ich mir auch diese "Rohdaten" direkt auf der UART ausgeben lassen, und schon diese Daten zeigen einen Wert von
-9.0°C anstelle von -10°C was den Verdacht auf das Thermometer o.Ä. lenkt und nicht auf den Umwandlungsalgorithmus.
Bei positiven Temperaturen und bei allen anderen neg. Temperaturen klappt ja alles, nur der Wechsel bei den Negativen klemmt.
Edit: So sieht der Temperaturverlauf dieses Tiefkühler-Experimentes aus:
http://mauerer.m.googlepages.com/Temperaturlog_Tiefkhler1.pdf
Die "Spikes", die durch diesen merkwürdigen Fehler entstanden sind, habe ich jetzt halt von Hand geändert... Das kann es aber nicht sein...
Gruss
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
[ Diese Nachricht wurde geändert von: Steppenwolf am 19 Nov 2007 0:18 ]
|
BID = 473595
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Zusätzlich wandelt der AVR diese 2 Bytes eines Temperaturwertes in eine für den Menschen besser lesbare Form um. (also z.B. 25.0625°C oder -15.5°C etc.) |
Dann schau dir mal mit dem Simulator und simulierten Daten an der Grenze ganzer negativer Celsiusgrade an, was der Umwandlungsalgorithmus da treibt.
Vemutlich ist er fehlerhaft.
P.S.:
Zitat :
| Für eine -9.9375 werden vom Thermometer folgende zwei Bytes übertragen:
0b11110110 für die -9
und
0b00010000 für die 0.9375 |
Das stimmt schon nicht.
Der Binärwert ist 16*Celsius im Zweierkomplement.
Also: -9,9375*16= -159 dez = ffff61 und nicht f610.
Wenn du nicht korrekt im 2er-Komplement rechnen kannst, dann pole einfach alle Bits um, addiere 1 und rechne dann mit der positiven Zahl.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
[ Diese Nachricht wurde geändert von: perl am 19 Nov 2007 1:40 ]
|
BID = 473625
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
Bitte die Daten(definition) vom Thermometer ansehen.
Auf dem PDF sieht man eine recht "unnatürliche" Treppenbildung - meiner Meinung nach werden bei negativen Temperaturen die Nachkommawerte irgendwie anders ausgegeben, als Du sie auswertest
Edit: Zwei Tasten waren viel zu nah zusammen auf meiner tastatur
[ Diese Nachricht wurde geändert von: hajos118 am 19 Nov 2007 8:52 ]
|
BID = 473644
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Hmhm... Im Anhang die Datendef des Thermometers. (aus dem DB entnommen)
Das linke Byte ist die "Vorkommastelle" und das rechte Byte die Nachkommas.
Aber irgendwie ist das gar kein Zweierkomplement... Wenn ich die Bits umpole, dann kriege ich schon den richtigen Wert...
Beispiel:
-25.0625:
0b11100110
und
0b11110000
Nun das "Zweierkomplement umrechnen":
Bits umpolen:
0b00011001
1 Addieren:
0b00011010
Ergibt aber 26 und nicht 25....
Man muss nur die Bits umpolen, das reicht schon...
Die Nachkommastelle sollte auch korrekt berechnet werden, zumindest die Beispiele im DB werden von meinem Algorithmus genau so ausgegeben. Was meinst du mit der "Treppenbildung"?
Meinen Umwandlungsalgorithmus habe ich schon mehrere Male durch den Sim gedrückt, auch an der Sprunggrenze... Habe keine Fehler gefunden.
Auch wenn ich mir die zwei Roh-Bytes direkt aus der SD Karte anzeigen lasse, so sind diese schon falsch. Wenn ich sie von Hand umrechne, komme ich aufs Gleiche Resultat wie der AVR....
Ich raff das net
Edit: Habe das PDF etwas geändert, nun sieht man die Abstufungen der Kurve viel besser:
http://mauerer.m.googlepages.com/Temperaturlog_Tiefkhler.pdf
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
[ Diese Nachricht wurde geändert von: Steppenwolf am 19 Nov 2007 10:45 ]
|
BID = 473664
perl Ehrenmitglied
Beiträge: 11110,1 Wohnort: Rheinbach
|
Zitat :
| Man muss nur die Bits umpolen, das reicht schon... |
Das reicht eben nicht.
Du bist nicht trittsicher und dann wundert es mich nicht, wenn das schiefgeht.
Um bei deinen Beispiel zu bleiben:
-25,0625 * 16 = -401 dez = ffff fe6f (laut dem in Windofs eingebauten Rechner)
Zur Vorzeichenumkehr:
bits umpolen: 0000 0190 hex
1 addieren : 0191 hex
Probe: 1*256 + 9*16 + 1 = 401
dividiert durch 16 ergibt 25,0625
q.e.d.
P.S.:
Das High-Byte deines Beispiels sollte FF heissen und nicht F0.
Prüf mal nach, weshalb die Nibbles vertauscht sind und expandiere das Vorzeichenbit ins linke Nibble.
_________________
Haftungsausschluß:
Bei obigem Beitrag handelt es sich um meine private Meinung.
Rechtsansprüche dürfen aus deren Anwendung nicht abgeleitet werden.
Besonders VDE0100; VDE0550/0551; VDE0700; VDE0711; VDE0860 beachten !
[ Diese Nachricht wurde geändert von: perl am 19 Nov 2007 13:23 ]
|
BID = 473675
Steppenwolf Schreibmaschine
Beiträge: 1757 Wohnort: Zürich, Schweiz
|
Aaah, danke für die Tipps! Das kann man ja in einem Rutsch umrechnen
Jetzt klappt es wunderbar!
Das war ein struber Fehler...
Herzlichen Gruss und vielen Dank
Mario
_________________
Meine Projekte:
http://mauerer.m.googlepages.com
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag heute wurden bisher 21 Beiträge verfasst © x sparkkelsputz Besucher : 182420870 Heute : 5368 Gestern : 7490 Online : 464 28.11.2024 23:29 5 Besucher in den letzten 60 Sekunden alle 12.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0286591053009
|