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.
:
Bearbeitet durch User
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:
1 | Temperature = (MSB * 2^8 + LSB) / (2^4 * 8) + 25 |
Mit deiner Klammerung kann das nichts werden
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.
1 | DS18B20 MSBLSB | 2er-komp, LSB/32 +25 | 2er-komp, LSB/32 |
2 | ----------------------+----------------------+------------------ |
3 | -1.875 0xF6C0 | -27 | -2 |
4 | -3.000 0xF6C0 | -27 | -2 |
5 | -3.063 0xF600 | -25 | 0 |
6 | -3.125 0xF580 | -29 | -4 |
7 | -4.563 0xF580 | -29 | -4 |
8 | -5.063 0xF6E0 | -26 | -1 |
9 | -5.125 0xF740 | -31 | -6 |
10 | -5.188 0xF840 | -31 | -6 |
11 | -7.438 0xF300 | -25 | -0 |
12 | -8.313 0xF580 | -29 | -4 |
13 | -8.625 0xF580 | -29 | -4 |
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 ;-)
Musste umbauen, der ESP spinnt mal wieder.
1 | DS18B20 °C | HMC5983 MSBLSB |
2 | ------------+----------------- |
3 | 17.56 | 0xFE40 |
4 | 17.94 | 0xFE40 |
5 | 18.44 | 0xFEA0 |
6 | 19.00 | 0xFEA0 |
7 | 19.31 | 0xFEE0 |
8 | 19.75 | 0xFF20 |
9 | 20.12 | 0xFF80 |
10 | 20.50 | 0xFFE0 |
11 | 20.81 | 0x40 |
12 | 21.19 | 0x80 |
13 | 21.69 | 0xC0 |
14 | 22.00 | 0x120 |
15 | 22.69 | 0x120 |
16 | 23.69 | 0x180 |
17 | 24.25 | 0x1E0 |
18 | 24.62 | 0x1E0 |
19 | 25.62 | 0x220 |
20 | 26.00 | 0x280 |
21 | 25.69 | 0x280 |
22 | 26.00 | 0x2C0 |
23 | 25.87 | 0x2C0 |
24 | 25.94 | 0x2C0 |
25 | 26.06 | 0x2C0 |
26 | 26.25 | 0x300 |
27 | 26.44 | 0x300 |
28 | 26.69 | 0x300 |
29 | 27.19 | 0x380 |
30 | 27.56 | 0x380 |
31 | 28.00 | 0x3E0 |
32 | 28.69 | 0x3E0 |
33 | 29.44 | 0x420 |
34 | 30.06 | 0x420 |
35 | 30.50 | 0x4A0 |
36 | 30.87 | 0x4A0 |
37 | 31.37 | 0x500 |
38 | 31.69 | 0x500 |
39 | 32.19 | 0x560 |
40 | 32.63 | 0x560 |
41 | 33.06 | 0x5C0 |
42 | 33.44 | 0x5C0 |
43 | 33.75 | 0x620 |
44 | 34.19 | 0x620 |
45 | 34.44 | 0x660 |
46 | 34.88 | 0x660 |
47 | 35.19 | 0x6A0 |
48 | 35.50 | 0x6A0 |
49 | 35.75 | 0x6E0 |
50 | 36.00 | 0x6E0 |
51 | 36.31 | 0x720 |
52 | 36.44 | 0x720 |
53 | 36.75 | 0x760 |
54 | 36.94 | 0x760 |
55 | 37.06 | 0x760 |
56 | 37.31 | 0x7C0 |
57 | 37.56 | 0x7C0 |
58 | 37.69 | 0x7C0 |
59 | 37.88 | 0x800 |
60 | 38.00 | 0x800 |
61 | 38.13 | 0x800 |
62 | 38.25 | 0x800 |
63 | 38.44 | 0x840 |
64 | 38.56 | 0x840 |
65 | 38.69 | 0x840 |
66 | 38.81 | 0x840 |
67 | 39.00 | 0x8A0 |
68 | 39.19 | 0x8A0 |
69 | 39.31 | 0x8A0 |
70 | 39.50 | 0x8E0 |
71 | 39.69 | 0x8E0 |
72 | 39.81 | 0x8E0 |
73 | 40.06 | 0x8E0 |
74 | 40.19 | 0x920 |
75 | 40.38 | 0x920 |
76 | 40.50 | 0x920 |
77 | 40.69 | 0x960 |
78 | 40.81 | 0x960 |
79 | 41.00 | 0x960 |
80 | 41.19 | 0x960 |
81 | 41.31 | 0x9A0 |
Peter Thermometer schrieb: > -3.125 0xF580 > -4.563 0xF580 ... > -8.313 0xF580 > -8.625 0xF580 Unbrauchbar, vergiss es.
Peter Thermometer schrieb:
1 | > DS18B20 °C | HMC5983 MSBLSB |
2 | > ------------+----------------- |
3 | |
4 | > 20.50 | 0xFFE0 |
5 | > 20.81 | 0x40 |
6 | > 21.19 | 0x80 |
7 | > 21.69 | 0xC0 |
8 | > 22.00 | 0x120 |
9 | > 22.69 | 0x120 |
10 | > 23.69 | 0x180 |
11 | > 24.25 | 0x1E0 |
12 | > 24.62 | 0x1E0 |
13 | > 25.62 | 0x220 |
Also ein Fehler von ca 4°. Völlig in Ordnung, das Datenblatt verspricht 7° Genauigkeit.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.