Forum: Mikrocontroller und Digitale Elektronik HMC5983 Thermometerdaten umrechnen klappt nicht


von Peter Thermometer (Gast)


Lesenswert?

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).

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Peter Thermometer (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Peter Thermometer (Gast)


Lesenswert?

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.

von Jacko (Gast)


Lesenswert?

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...)

von Peter Thermometer (Gast)


Lesenswert?

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.

von Jacko (Gast)


Lesenswert?

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!

von Wolfgang (Gast)


Lesenswert?

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

von Peter Thermometer (Gast)


Lesenswert?

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.

von Peter Thermometer (Gast)


Lesenswert?

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.

von Jacko (Gast)


Lesenswert?

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!

von Wolfgang (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Peter Thermometer (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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 
;-)

von Peter Thermometer (Gast)


Lesenswert?

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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Peter Thermometer schrieb:
> -3.125      0xF580
> -4.563      0xF580
...
> -8.313      0xF580
> -8.625      0xF580

 Unbrauchbar, vergiss es.

von Lattice User (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.