Hallo,
der obige Kompasssensor hat einen Tempsensor eingebaut.
Im Datenbblatt steht wie man die Werte umrechnet:
Format in zwei bytes kodiert:MSB und LSB und im Zweierkomplement
Wertebreiche von -40 bis +85°C bzw. 0xF800 bis 0x07FF
Umrechnungsformel laut DB:
(MSB*256)+LSB/(2⁴ * 8) +25 = Temp in °C
so jetzt nehmen wie mal den Wert 0x07FF also MSB=0x07, LSB=0xFF
MSB*256 + LSB = 0x07FF
das jetzt durch 2^4 *8 entspr. durch 2^7 was einem SHR um sieben Stellen
entspricht: SHR(0x07FF,7) = 15 dezimal. Hier nochmal 25°C drauf
=40°C. Es sollte aber 85 rauskommen
Wieso kommt da nicht 85 raus?
Rechne ich die -40 (0xF800) und beachte die 2er Komplementdarstellung (1
abziehen, Bits invertieren und weiter wie oben) komme ich auf -41 (1
weniger wohl wegen dem Offset von 0).
Peter Thermometer schrieb:> Wieso kommt da nicht 85 raus?
Weil 85 nicht rauskommen kann.
Die Angaben beziehen sich entweder auf Arbeitsbereich oder sind
schlichtweg falsch gedruckt.
Wenn 0x800 = Min, dann ist 0x7FF = ABS(Min) - 1
und nicht ABS(Min) + irgendetwas.
Aus dem Datenblatt:
The temperature output registers are two 8-bit registers, temperature
output register H and temperature output register L.
These registers store the measurement result from the internal
temperature sensor. Temperature output register H
contains the MSB from the measurement result, and temperature output
register L contains the LSB from the
measurement result. The value stored in these two registers is a 16-bit
value in 2’s complement form, whose range is
0xF800 to 0x07FF. TEMPH0 through TEMPH7 and TEMPL0 through TEMPL7
indicate bit locations, with TEMPH and
TEMPL denoting the bits that are in the temperature output registers.
TEMPH7 and TEMPL7 denote the first bit of the
data stream. The number in parenthesis indicates the default value of
that bit.
Peter Thermometer schrieb:> The value stored in these two registers is a 16-bit> value in 2’s complement form, whose range is> 0xF800 to 0x07FF.
Das stimmt schon mal nicht.
Positiv = 0x0000 bis 0x7FFF
Negativ = 0x8000 bis 0xFFFF = 16 bit.
Oder:
Positiv = 0x000 bis 0x7FF
Negativ = 0x800 bis 0xFFF = 12 bit.
Entweder gilt die Breite sowohl für positive als auch für negative
Zahlen oder derjenige der das geschrieben hat, versteht nichts davon.
Nach dessen Angaben gibt es nur 2047 positive Zahlen, alle anderen
sind negativ.
Liegt wohl am ADC, der hat 12 Bit, dafür brauchts schon 2 byte zur
Darstellung, der Rest wird ignoriert. Nur hat man hier 0°C nicht mit
0x0000
belegt sondern eben 25°C auf 0x0000.
Liest man jetzt Werte aus, z.B. bei Raumtemperatur ist MSB immer 0xFF,
das dürfte laut Wertebereich gar nicht sein. An I2C liegt es nicht,
lesen und schreiben anderer Register funktioniert tadelos.
Vermutlich ist deshalb auch die Temperaturkompensation per default
abgeschaltet, das ist unbrauchbar.
Die Formel ist wirklich doof.
Damit kommt man auf +9 °C bis +41 °C
Teilt man nicht durch 128, sondern durch 32,
kommen nach Addition von 25 Werte von -39 bis +89 heraus, was
auch etwa den empfohlenen Betriebsbereich in °C abdeckt.
Mit derzeit ca. 0 °C auf dem Fensterbrett (draußen) und
vielleicht 50 °C auf der Heizung sollte sich das leicht
überprüfen lassen.
Wobei man sich nicht von +/-5° verunsichern lassen darf.
(Toleranz ist laut Datenblatt großzügig...)
Wenn er ne Weile läuft und ein paar Messungen hinter sich hat, bekommt
auch MSB plötzlich vernünftige Werte, mit 32 als Teiler (danke an Jacko)
sind die im grünen Bereich, noch ein Korrekturwert zur Eichung und dann
passt es.
Trotzdem ein ziemlicher Krampf, die Formel im Datenblatt mit den
seltsamen Teilern (2^4 * 8 warum schreiben sie nicht gleich 128?) lässt
wohl darauf schliessen, dass der Hersteller wohl selber nicht wusste was
für ein Faktor da rein muss.
Peter Thermometer (Gast) schrieb:
> (2^4 * 8 warum schreiben sie nicht gleich 128?)
Wahrscheinlich haben da Datenblattschreiber und Entwickler
aneinander vorbei geredet. Der eine Entwickler brabbelte von
shift-operation (2^4), der Kollege (Urlaubszeit) vom
Multiplizieren (8)...
Du scheinst der erste zu sein, der die Temperatur-Daten
nutzen will, alle anderen verlassen sich wohl auf die eingebaute
Kompensation. Sonst gäbe es wohl mehr davon im Netz.
Da es mir nur "plausibel erschien" würde ich trotzdem raten,
morgen noch den von mir vorgeschlagenen Test über einen größeren
Temperaturbereich zu machen, bevor du dein Gerät zuschraubst.
Gute Nacht!
Würde mich freuen, vom Ergebnis zu hören.
Und wenn es nicht passt, denken wir zusammen noch mal nach!
Peter Thermometer schrieb:> Umrechnungsformel laut DB:> (MSB*256)+LSB/(2⁴ * 8) +25 = Temp in °C
Nein, im Datenblatt steht für die Berechnung der Temperature in °C:
So habe den Sensor mal rausgestellt und per WLAN "verkabelt":
Zur Kontrolle einen DS18B20 von dem ich weiss dass er funktioniert.
Hier mal erste Werte, wird gerade wieder wärmer und die Sonne scheint
aussen hin.
DS18B20 (°C), HMC5983 (direkt aus Registern)
-2.8xx °C, 0xF6C0
-2.500 °C, 0xF6C0
-2.438 °C, 0xF6C0
-2.250 °C, 0xF6C0
Umrechnung: 2er-Komplement beachten, danach Formel LSB/32+25 anwenden.
Ergebniss: 27. Das sind 25 zuviel. Zieht man die wieder ab und ergänzt
das neg. VZ sind es -2°C, das passt.
Mal schauen ob ich diese nacht unter -10°C komme, der Wind hat
nachgelassen, vermutlich max. -7°C drinn, im Eisfach habe ich kein
Platz.
Wolfgang schrieb:> Mit deiner Klammerung kann das nichts werden
Ja die ist hier falsch, im Source war sie geklammert wie im DB.
MSB*256 ergibt immer 0, das kann man gleich weglassen und damit erledigt
sich auch die Klammerung und die Werte passen auch, mit 32 als Teiler
anstatt 128.
Versteht man MSB*256 so, dass die linksgeshifteten Bits automatisch in
einen 16-Bitwert wandern und mit diesem die Formel anwendet kommen
unsinnig grosse Werte raus.
Die zwei Werte MSB und LSB sollen zu einer Zahl zusammengesetzt
werden. Also MSB * 256 + LSB. Das ergibt eine 16-Bit-Zahl - und
das ist pillepalle: OK.
> (MSB*256)+LSB/(2⁴ * 8) +25 = Temperatur in °C
Na gut, Peter Thermometer hätte besser
((MSB*256)+LSB)/(2⁴ * 8) +25 = Temperatur in °C
geschrieben, aber er hat so gerechnet - und so kommt genau
der gleiche Mist heraus, wie mit der Korrektur von
Wolfgang (Gast):
> (MSB * 2^8 + LSB) / (2^4 * 8) + 25 = Temperatur in °C
Der Fehler ist offensichtlich im (2^4 * 8) = 128 begraben,
denn damit kommt man nur auf eine Spanne von
+/-2047 / 128 = +/-16 und mit +25 auf 9...41 °C = SINNFREI.
MEINUNG und BESSERWISSEN ist nur so gut, wie das reproduzierbare
Ergebnis! - MANCHMAL (nicht immer) hilft der kritisch-
vernunftorientierte Ansatz.
Schaun mer mal, was Peter Thermometer rausbekommt!
Peter Thermometer schrieb:> MSB*256 ergibt immer 0, das kann man gleich weglassen
Das rechne mal vor.
MSB liegt im Bereich 0xF8..0x07, d.h. MSB*256 ergibt als 16-Bit Wert
eine Zahl im Bereich 0xF800..0x0700
Peter Thermometer schrieb:> Umrechnung: 2er-Komplement beachten, danach Formel LSB/32+25 anwenden.> Ergebniss: 27. Das sind 25 zuviel. Zieht man die wieder ab und ergänzt> das neg. VZ sind es -2°C, das passt.
Das ist auf jeden Fall falsch.
Lass die Rechnerei mit Zahlen die nirgendwo im DaBla zu finden sind.
Mach lieber ein paar zusätzliche Messungen bei Raumtemperatur, dann
kann man weitersehen.
Peter Thermometer schrieb:> DS18B20 MSBLSB
Hole deine Termometer einfach mal ins Zimmer, damit man Datenpunkte über
einen größeren Bereich bekommt. So schwierig kann das doch nicht sein
;-)
Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang