Merkwürdiges Verhalten eines Temperatursensors bei Minusgraden

Im Unterforum Alle anderen elektronischen Probleme - Beschreibung: Was sonst nirgendwo hinpasst

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 28 11 2024  23:29:35      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Alle anderen elektronischen Probleme        Alle anderen elektronischen Probleme : Was sonst nirgendwo hinpasst


Autor
Merkwürdiges Verhalten eines Temperatursensors bei Minusgraden

    







BID = 473576

Steppenwolf

Schreibmaschine



Beiträge: 1757
Wohnort: Zürich, Schweiz
Zur Homepage von Steppenwolf
 

  


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
Zur Homepage von Steppenwolf

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
Zur Homepage von Steppenwolf

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
Zur Homepage von Steppenwolf

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


Zurück zur Seite 1 im Unterforum          Vorheriges Thema Nächstes Thema 


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