Forum: Mikrocontroller und Digitale Elektronik Abweichende Temperatur - LM75 und DS18S20


von openWRT (Gast)


Lesenswert?

Hallo!

Ich habe auf einem alten W500V Router (Telekom) openWRT zum Laufen 
gebracht.
1Wire und I2C werden über GPIOs (waren vorher mal die LEDs) und die 
passenden Kernel-Module realisiert.

Am 1Wire-Bus hängt ein DS18S20 Temp-Sensor, am I2C ein LM75. Beide haben 
die zugehörigen Pull-up Widerstände (1Wire: 4,7k, I2C: 2x 10k).

Beide funktionieren soweit, und liefern mir die Temperatur.

1Wire:
1
cat /sys/bus/w1/devices/10-xxxxx/w1_slave

-> ~24 °C

I2C:
1
i2cget -y 0 0x48 0x00 w

-> nach Umwandlung der 2 Bytes in Temp (im Datasheet beschrieben) -> ~16 
°C

Wie könnte dieser Temperaturunterschied zu Stande kommen? Beide Sensoren 
liegen hier vor mir auf dem Breadboard. Der DS18S20 wurde sowohl in 
Parasite-Power Modus, als auch "normal" angesteuert und getestet -> 
macht keinen Unterschied.
Ein 2. DS18S20 liefert den gleichen Wert - also kann der DS18S20 nicht 
kaputt sein.
Da der LM75 wie im Datenblatt beschrieben reagiert, und auch ohne Murren 
erkannt wurde (per i2cdetect) gehe ich auch mal davon aus, dass der auch 
nicht "kaputt" ist.

Was kann solche Temperaturunterschiede verursachen?

von openWRT (Gast)


Lesenswert?

Nachtrag: VCC = 3,3V (kommt vom Router).

- keine "langen" Kabel wurden verwendet. Die Sensoren stecken im 
Breadboard und wurden mit Litze an das Router PCB gelötet.
- Der Anschluss an die GPIOs erfolgte "direkt", etwaige Widerstände von 
den LEDs (die da vorher waren) wurden ausgelötet.

von Mike A. (Gast)


Lesenswert?

openWRT schrieb:
> Was kann solche Temperaturunterschiede verursachen?

Unterschiedliche Temperaturen. ;-)

Welche Gehäusebauformen haben deine Sensoren und wie werden sie von der 
Luft angeströmt? Guck mal, ob der angezeigte Temperaturunterschied 
geringer wird, wenn du mit einem Lüfter beiden die gleiche Luft 
zuführst.

von openWRT (Gast)


Lesenswert?

Mike A. schrieb:
> openWRT schrieb:
>> Was kann solche Temperaturunterschiede verursachen?
>
> Unterschiedliche Temperaturen. ;-)
>
> Welche Gehäusebauformen haben deine Sensoren und wie werden sie von der
> Luft angeströmt? Guck mal, ob der angezeigte Temperaturunterschied
> geringer wird, wenn du mit einem Lüfter beiden die gleiche Luft
> zuführst.

DS18S20: TO92
LM75: µSOP-8 (LM75-CIM3)

Beide stecken nebeneinander (der SMD LM75 via Adapter) auf dem 
Breadboard. Die Fenster sind zu und es gibt keine Zugluft.

von (prx) A. K. (prx)


Lesenswert?

Und wieviel Grad hat es wirklich? Draussen wären die 16° realistisch und 
drinnen käme ich allenfalls im Gehäuse des Routers auf 24°.

von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> Und wieviel Grad hat es wirklich? Draussen wären die 16° realistisch und
> drinnen käme ich allenfalls im Gehäuse des Routers auf 24°.

Wie meinst du das? Beide Sensoren sind natürlich hier bei mir auf dem 
Schreibtisch und nicht draußen. Des Weiteren sind sie natürlich auch 
nicht im Router-Gehäuse verbaut, sondern stecken auf einem Breadbord, 
von dem die (kurzen) Kabel zum Router PCB gehen.

Ich habe leider kein anderes Thermometer zur Verfügung hier.

Ich würde ja auch erwarten, dass die beiden Sensoren leicht 
unterschiedliche Werte ausgeben. Aber nicht einen Unterschied von 8°C.

von (prx) A. K. (prx)


Lesenswert?

openWRT schrieb:
> Ich habe leider kein anderes Thermometer zur Verfügung hier.

Und ohne Thermometer bist du nicht in der Lage, bei der Raumtemperatur 
den Unterschied zwischen 16°C und 24"C festzustellen?

: Bearbeitet durch User
von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> openWRT schrieb:
>> Ich habe leider kein anderes Thermometer zur Verfügung hier.
>
> Und ohne Thermometer bist du nicht in der Lage, bei der Raumtemperatur
> den Unterschied zwischen 16°C und 24"C festzustellen?

Ach das meinst du ;)

Ich denke, dass der DS18S20 grob richtig liegt. Ich würde die Temperatur 
hier auf ~24 °C einschätzen.

Ich frage mich jedoch, wieso der LM75 dann so weit falsch liegt.

Habe eben nochmal die Konvertierung überprüft.

Der LM75 liefert "0x7710" zurück. 0x10 ist Upper-Byte, 0x77 ist 
Lower-Byte. In Binär wäre das ja 0001000001110111. Signifikant sind nur 
die ersten 9 Bit (8 vom Upper Byte, 1 vom Lower Byte).

Ergibt somit 000100000:
1
Bit  Bedeutung  Bsp
2
3
D15     +/-      0    -> +
4
D14    64°C      0    -> 0
5
D13    32°C      0    -> 0
6
D12    16°C      1    -> 16°C
7
D11    8°C      0    -> 0
8
D10    4°C      0    -> 0
9
D09    2°C      0    -> 0
10
D14    1°C      0    -> 0
11
D14    0.5°C      0    -> 0
12
======================================
13
                   Summe: 16,0°C

von MaWin (Gast)


Lesenswert?

openWRT schrieb:
> ein LM75. Beide haben die zugehörigen Pull-up Widerstände (1Wire: 4,7k,
> I2C: 2x 10k).

Mach mal einen 100nF Kerko an den LM75 und 1k vor SCLK.

von Mike A. (Gast)


Lesenswert?

openWRT schrieb:
> Die Fenster sind zu und es gibt keine Zugluft.

Dann sorge mal mit einem Lüfter dafür, dass mögliche 
Temperaturunterschiede abgebaut werden.

openWRT schrieb:
> i2cget -y 0 0x48 0x00 w

Bist du sicher, dass das stimmt. Nach DS Tab. 3 entsprich ein Wert von 
0x4800 im Temperaturregister einer Temperatur von 72°C. Da passiert 
irgendetwas in deine Auslesefunktion. In Tab. 4 mit den Beispielwerten 
wird für 25°C ein Registerwert von 0x190x genannt.

von openWRT (Gast)


Lesenswert?

Mike A. schrieb:
> openWRT schrieb:
>> i2cget -y 0 0x48 0x00 w
>
> Bist du sicher, dass das stimmt. Nach DS Tab. 3 entsprich ein Wert von
> 0x4800 im Temperaturregister einer Temperatur von 72°C. Da passiert
> irgendetwas in deine Auslesefunktion. In Tab. 4 mit den Beispielwerten
> wird für 25°C ein Registerwert von 0x190x genannt.

Das ist falsch. 0x48 ist die Adresse, wenn A0-A1 auf GND liegen. Ist die 
default i2c Adresse dieser Sensoren.
Laut Datenblatt wird im Register 0x00 dann die Temperatur gelesen.

i2cget <i2c-bus-id> <i2c device addr> <read register> <ausgabe als word>

Das -y ist nur ein Schalter, damit er ohne Rückfrage auf den i2c Bus 
zugreift.


MaWin schrieb:
> openWRT schrieb:
>> ein LM75. Beide haben die zugehörigen Pull-up Widerstände (1Wire: 4,7k,
>> I2C: 2x 10k).
>
> Mach mal einen 100nF Kerko an den LM75 und 1k vor SCLK.

Habe ich gerade probiert. Macht keinen Unterschied. :(


Aber danke schon mal allen, die geantwortet haben :)

von openWRT (Gast)


Lesenswert?

0x7710
0xf712
0x7713

->

0001000001110111
0001001011110111
0001001101110111


->

16 °C
17 °C
17,5 °C

Das sind die Werte, die ich von dem LM75 als "Probe" gelesen habe, 
während ich ihn kurz mit den Fingern anfasse.

Passt alles soweit von der Umrechnung :/

von openWRT (Gast)


Lesenswert?

Für den DS18S20:
1
$cat /sys/bus/w1/devices/10-0008025fe09b/w1_slave
2
3
31 00 50 4b ff ff 06 10 06 : crc=06 YES
4
31 00 50 4b ff ff 06 10 06 t=24375

Sorry für den Multi-Post :/

von (prx) A. K. (prx)


Lesenswert?

Datasheet LM75: "However, only the 11 significant bits should be used, 
and the 5 LSB bits of the LS byte are zero and should be ignored."

Die unteren 5 Bits sind bei dir aber nicht 0. Folglich sind die 
gelesenen Bits Unsinn. Und zwar nicht nur die unteren 5.

: Bearbeitet durch User
von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> Datasheet LM75: "However, only the 11 significant bits should be used,
> and the 5 LSB bits of the LS byte are zero and should be ignored."
>
> Die unteren 5 Bits sind bei dir aber nicht 0. Folglich sind die
> gelesenen Bits Unsinn. Und zwar nicht nur die unteren 5.

Woher hast du dieses Zitat?

Datasheet: http://datasheets.maximintegrated.com/en/ds/LM75.pdf

In diesem steht davon nicht. Da steht für die unteren, nicht genutzten 5 
Bit, "X = Don’t care".

von (prx) A. K. (prx)


Lesenswert?

openWRT schrieb:
> Woher hast du dieses Zitat?

Seite 8 von http://www.nxp.com/documents/data_sheet/LM75A.pdf

von Mike A. (Gast)


Lesenswert?

openWRT schrieb:
> Das ist falsch. 0x48 ist die Adresse, wenn A0-A1 auf GND liegen.

Ok, das hatte ich falsch verstanden.

openWRT schrieb:
> Passt alles soweit von der Umrechnung :/

Mmh. Der Temperaturanstieg sieht vernünftig aus. Mit Erwärmung durch 
einen warmen Luftstrom (Föhn in ausreichender Entfernung) könnte man 
noch mal über einen größeren Bereich beide Sensoren vergleichen und die 
Bitbewertung prüfen. Fehler sollten sich als dicker Faktor in der 
Steigung bemerkbar machen.

16°C als Zimmertemperatur würden dir bestimmt auffallen ;-)

Jetzt wäre ein zweiter LM75 nicht schlecht. Ich habe nur die DS18B20 im 
Einsatz und die liegen auch über mehrere Lieferchargen sehr gut 
beieinander (deutlich besser als 0.5°C).

von openWRT (Gast)


Lesenswert?

Mike A. schrieb:
> Jetzt wäre ein zweiter LM75 nicht schlecht. Ich habe nur die DS18B20 im
> Einsatz und die liegen auch über mehrere Lieferchargen sehr gut
> beieinander (deutlich besser als 0.5°C).

Ja, das stimmt. Habe aber leider nur einen :(

Habe nun nochmal einen DS18S20 aus einer anderen Charge getestet. Alle 
drei liefern, wie du auch beschreibst, mit ~0,5°C Abweichung den 
gleichen Wert.

Ich tippe, dass einfach der LM75 einen "Knack weg" hat.

Außer ich liege doch fundamental falsch mit meiner Umrechnung, so wie 
von prx angedeutet.

von (prx) A. K. (prx)


Lesenswert?

openWRT schrieb:
> Außer ich liege doch fundamental falsch mit meiner Umrechnung, so wie
> von prx angedeutet.

Meine Aussage war, dass die ausgelesenen Bits schlichtweg nicht stimmen 
können, weil die unteren 5 Bits 0 sein müssen. Und wenn die nicht 
stimmen, dann stimmen die übrigen 11 Bits wahrscheinlich auch nicht.

Apropos: Was für ein LM75 ist es denn genau?

: Bearbeitet durch User
von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> openWRT schrieb:
>> Woher hast du dieses Zitat?
>
> Seite 8 von http://www.nxp.com/documents/data_sheet/LM75A.pdf

Das ist aber ein LM75A. Der hat eine Auflösung von 0,125°C. Außerdem 
unterscheidet sich hier die Berechnung für den Temperaturwert.


Ich habe einen LM75 mit 0,5°C Auflösung.

http://esd.cs.ucr.edu/labs/temperature/LM75.pdf
http://datasheets.maximintegrated.com/en/ds/LM75.pdf

Da steht nichts davon, dass die übrigen 5 Bits Null sein müssen. 
Lediglich "Dont care".

von Mike A. (Gast)


Lesenswert?

openWRT schrieb:
> Außer ich liege doch fundamental falsch mit meiner Umrechnung, so wie
> von prx angedeutet.

Das könntest du mit dem Temperaturvergleich über einen größeren Bereich 
prüfen (s.o.)

von (prx) A. K. (prx)


Lesenswert?

openWRT schrieb:
> Das ist aber ein LM75A. Der hat eine Auflösung von 0,125°C.

Weshalb es dort 5 ungenutzte Bits sind, beim LM75 aber 7.

> Außerdem
> unterscheidet sich hier die Berechnung für den Temperaturwert.

Nur in der Maskierung, wenn das tatsächlich zwingend erforderlich ist. 
Davon abgesehen wird der Wert linksbündig in 16 Bits unabhängig von der 
Auflösung immer gleich interpretiert.

> Ich habe einen LM75 mit 0,5°C Auflösung.

Exakt ganz genau welchen?

: Bearbeitet durch User
von openWRT (Gast)


Lesenswert?

1
Hex           2Byte          9Bit    deg C
2
0x7710  0001000001110111  000100000  16
3
0xf716  0001011011110111  000101101  22,5
4
0xf717  0001011111110111  000101111  23,5
5
0xf719  0001100111110111  000110011  25,5
6
0xf71b  0001101111110111  000110111  27,5
7
0xf71c  0001110011110111  000111001  28,5
8
0xf71b  0001101111110111  000110111  27,5
9
0xf71c  0001110011110111  000111001  28,5
10
0xf71e  0001111011110111  000111101  30,5
11
0xf71f  0001111111110111  000111111  31,5
12
0x771e  0001111001110111  000111100  30
13
0xf71c  0001110011110111  000111001  28,5
14
0xf71b  0001101111110111  000110111  27,5
15
0xf71a  0001101011110111  000110101  26,5
16
0x7719  0001100101110111  000110010  25
17
0x7718  0001100001110111  000110000  24
18
0x7717  0001011101110111  000101110  23
19
0xf716  0001011011110111  000101101  22,5
20
0xf715  0001010111110111  000101011  21,5
21
0x7715  0001010101110111  000101010  21
22
0xf714  0001010011110111  000101001  20,5
23
0x7714  0001010001110111  000101000  20
24
0xf713  0001001111110111  000100111  19,5
25
0x7713  0001001101110111  000100110  19
26
0xf712  0001001011110111  000100101  18,5
27
0xf712  0001001011110111  000100101  18,5
28
0x7712  0001001001110111  000100100  18
29
0xf711  0001000111110111  000100011  17,5
30
0x7711  0001000101110111  000100010  17
31
0xf710  0001000011110111  000100001  16,5
32
0x7710  0001000001110111  000100000  16

Hab den LM75 mal ein wenig mit dem Feuerzeug von der Seite warm gemacht 
(nein, nichts angeschmort oder sowas).

Die Berechnung müsste doch so stimmen? Auch die Werte sehen sinnig aus.

von openWRT (Gast)


Lesenswert?

LM75-CIM-3 von NXP. Sollte aber baugleich zu dem Maxim LM75 sein.

Datasheet: http://esd.cs.ucr.edu/labs/temperature/LM75.pdf

von openWRT (Gast)


Lesenswert?

1
0x772a  0010101001110111  001010100  42
2
0xf729  0010100111110111  001010011  41,5
3
0xf718  0001100011110111  000110001  24,5

Auch das "32°C Bit" macht er.

von Mike A. (Gast)


Lesenswert?

openWRT schrieb:
> Hab den LM75 mal ein wenig mit dem Feuerzeug von der Seite warm gemacht
> (nein, nichts angeschmort oder sowas).

Wie wäre es, wenn du mal beide Sensoren mit dem gleichen warmen 
Luftstrom auf halbwegs gleiche Temperatur bringst. Woher willst du bei 
der Feuerzeugmethode wissen, ob der Senser 10 oder 20°C erwärmt wird?

von (prx) A. K. (prx)


Lesenswert?

openWRT schrieb:
> LM75-CIM-3 von NXP.

Interessanterweise gibts den auf der Webseite von NXP nicht.

von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> Interessanterweise gibts den auf der Webseite von NXP nicht.

Entschuldige bitte. Meinte natürlich National Semiconductor. Datasheet 
hab ich oben schon verlinkt. Hier noch mal:

http://esd.cs.ucr.edu/labs/temperature/LM75.pdf

von Quentin (Gast)


Lesenswert?

openWRT schrieb:
> 0xf729  0010100111110111 001010011  41,5

0xf729 ist bei mir binär folgendes:
1111 0111 0010 1001

Irgendwie ist das nicht wirklich mit Deinen Binärziffern korreliert...

von (prx) A. K. (prx)


Lesenswert?

Der LM75 liefert das MSB zuerst aus. Der Prozessor aber je nach Bauart 
das LSB oder das MSB. Da die 16 Bits des LM75 vom Linux-Kernel als 
natives 16-Bit Wort durchgereicht werden (per union), werden bei einer 
little endian CPU die Bytes verdreht.

Wer angesichts dessen die Weisheit des Autors des Kernel-Moduls in Frage 
stellt, der hat meine volle Zustimmung.

: Bearbeitet durch User
von Malefiz (Gast)


Lesenswert?

openWRT schrieb:
> 0x7719  0001100101110111  000110010  25

laut Datenblat muss da aber 190x raus kommen

von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> Wer angesichts dessen die Weisheit des Autors des Kernel-Moduls in Frage
> stellt, der hat meine volle Zustimmung.

:D


Also stimmt die Konvertierung so?

Falls ja, wären wir wieder beim Anfang des Problems. Wieso solch eine 
hohe Abweichung?

von openWRT (Gast)


Lesenswert?

Malefiz schrieb:
> openWRT schrieb:
>> 0x7719  0001100101110111  000110010  25
>
> laut Datenblat muss da aber 190x raus kommen

Guter Punkt...

Ich werde wohl nochmal intensiver lesen müssen.

von (prx) A. K. (prx)


Lesenswert?

Malefiz schrieb:
>> 0x7719  0001100101110111  000110010  25
>
> laut Datenblat muss da aber 190x raus kommen

0x7719 ist auf einer little endian CPU tatsächlich 0x1977 - und wenn man 
die unteren 7 Bits wegmaskiert 0x1900.

von openWRT (Gast)


Lesenswert?

A. K. schrieb:
> Malefiz schrieb:
>>> 0x7719  0001100101110111  000110010  25
>>
>> laut Datenblat muss da aber 190x raus kommen
>
> 0x7719 ist auf einer little endian CPU tatsächlich 0x1977 - und wenn man
> die unteren 7 Bits wegmaskiert 0x1900.

Ah. Super. Danke dir fürs Nachprüfen!

Also kann ich davon ausgehen, dass die Umrechnung stimmt?

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.