Forum: Mikrocontroller und Digitale Elektronik Digitaler Temperatur Sensor Ungenau? DS7505


von C. H. (hedie)


Lesenswert?

Hallo zusammen....

Ich verwende einen DS7505 von Dallas (Maxim)

Hier das Datenblatt: http://datasheets.maxim-ic.com/en/ds/DS7505.pdf
Interessante Seite: 5

Es handelt sich dabei um einen Sensor welcher bereits einen integrierten 
ADC enthält und die Daten per I2C wahlweise in einer auflösung von 
9,10,11 oder 12 Bits sendet.

Laut Datenblatt hat der Sensor eine Genauigkeit von +/-0.5C

Die kommunikation mit dem IC läuft soweit problemlos...
Einzig störrender faktor ist, das ich einen Offset von etwa 5C habe... 
also alle meine Zimmerthermometer zeigen 24C an jedoch vom ic kommt 29C 
zurück

Meine Auswertung der zwei empfangenen bytes
1
ucVorkomma = ((uiTemp & 0x7F00) >> 8); //Vorzeichen entfernen und nur MSByte verwenden
2
  ucVorkomma = ucVorkomma - 5; //hier den Offset abziehen
3
  ucNachkomma = ((uiTemp & 0x00FF) >> 4); //Die nachkomma stellen speichern
4
  ucNachkomma = ((ucNachkomma * 625) / 1000); //nachkommastellen haben eine auflösung von 0.0625C daher umrechnen

Vielleicht sieht ja jemand einen Fehler...

Durch das entfernen des Offsets scheint der Sensor perfekt zu messen...
Aber irgendwie sind mir 5C tolleranz ein wenig zu viel :)


Danke schonmal

von C. H. (hedie)


Lesenswert?

Guten Morgen zusammen...

Ich habe noch eine Merkwürdigkeit zu ergänzen...

Habe heute den Sensor bzw. das Gerät eingeschaltet... und der Sensor hat 
zuerst viel zu tiefe Temperaturen angezeigt... doch Die Temperatur 
steigt jetzt seit 2 Minuten um über 3 Grad an... und nach 2 Minuten 
stimmt der gemessene wert...

Ist das normal, das ein solcher Sensor so lange hat, bis er die 
"richtige" (abgesehen vom Offset) Temperatur misst?

Danke

von Purzel H. (hacky)


Lesenswert?

Kann er die Erwaermung selbst machen ? ZB durch Ueberspannung ? Zu 
haeufige Kommunikation ? Unguenstiger Montageort ueber einem 
Spannungsregler ?

von C. H. (hedie)


Lesenswert?

A...aha Soooo. schrieb:
> Kann er die Erwaermung selbst machen ? ZB durch Ueberspannung ? Zu
> haeufige Kommunikation ? Unguenstiger Montageort ueber einem
> Spannungsregler ?

Sollte eigentlich nicht der Fall sein... Spannung liegt bei 2.8V und er 
ist bis 1.8V ausgelegt... Die Datenleitungen gehen direkt zum 5V AVR da 
diese laut Datenblatt 5V Kompatibel sind....

Er ist auf einer externen Platine angebracht welche frei in der luft ist

Abgefragt wird er alle 2.5 Sekunden...

von Purzel H. (hacky)


Lesenswert?

Du hast einen 2.8V spannungsregler ? Und Widerstande in den 
Datenleitungen ? Wie gross sind die Widerstaende ?
Hatt ich auch mal. Ein DS1302 an einen 3.3V Regler, und keine 
Widerstande, oder zu Kleine. Nachmessen ergab, dass die Uhr dann an den 
5V des Prozessors lief. Die wurden ueber die Datenleitungen geliefert. 
Die 3.3V wurden hochgedrueckt. Daher bitte die 2.8V Spannung mal 
nachmessen.

von C. H. (hedie)


Lesenswert?

A...aha Soooo. schrieb:
> Daher bitte die 2.8V Spannung mal
> nachmessen.

Hab ich grad gemacht...

Exakte 2.85V (Durch spannungsteiler erzeugt da das teil nicht mal 1mA 
verbraucht...)

A...aha Soooo. schrieb:
> Wie gross sind die Widerstaende ?

Hab ich keine, da Die leitungen 5V Logik kompatibel sind
lediglich pullups für SCL und SDA

von Thomas (kosmos)


Lesenswert?

hast du nicht die Möglichkeit den Sensor dorthin zu legen wo die 
Temperatur gemessen werden soll ohne das die ganze Platine mitwandert, 
ist doch klar das wenn sich den Sensor in der Nähe eines analogen 
Spannungsreglers befindet, diese Temperatur mitmisst.

Das mit der Dauer der Temperaturanpassung hängt mit der Wärmekapazität 
des Sensors zusammen. Beispiel wenn ich ein Termomether in ein Glas 
Wasser stelle und dieses einfriere und dann ins Wohnzimmer stelle dauert 
es eine kleine Weile bis mein Thermometer Zimmertemperatur anzeigt.

Bist du auf eine schnelle Messung der Temperaturänderungen angewiesen? 
Wenn ja bau einen Spannungsteiler mit einem Widerstand und einem 
Dünnfilmwiderstand (wenig Wärmekapazität)auf , wäre dann halt analog 
aber sehr schnell anhauchen genugt und schon ändert sich der 
Spannungswert.

von C. H. (hedie)


Lesenswert?

Thomas O. schrieb:
> hast du nicht die Möglichkeit den Sensor dorthin zu legen wo die
> Temperatur gemessen werden soll ohne das die ganze Platine mitwandert

Der Sensor befindet sich auf einer eigenen kleinen Platine etwa 1 x 1 cm 
gross und nur die I2C Leitungen führen zur haupt platine

Thomas O. schrieb:
> Das mit der Dauer der Temperaturanpassung hängt mit der Wärmekapazität
> des Sensors zusammen. Beispiel wenn ich ein Termomether in ein Glas
> Wasser stelle und dieses einfriere und dann ins Wohnzimmer stelle dauert
> es eine kleine Weile bis mein Thermometer Zimmertemperatur anzeigt.

Der Sensor war die ganze nacht über an ein und derselben stelle im 
zimmer... Am morgen hab ich eingeschaltet und dan hatte er etwa 3 
minuten bis er die richtige temperatur angezeigt hat... er hatte sich 
angenähert...

Thomas O. schrieb:
> Bist du auf eine schnelle Messung der Temperaturänderungen angewiesen?
> Wenn ja bau einen Spannungsteiler mit einem Widerstand und einem
> Dünnfilmwiderstand (wenig Wärmekapazität)auf , wäre dann halt analog
> aber sehr schnell anhauchen genugt und schon ändert sich der
> Spannungswert.

Die Reaktionsgeschwindigkeit ist sehr schnell..
Ich kann den Sensor auch anhauchen und er zeigt sofort den Messwert :)

Aber danke für den Tipp :)

von Alexander S. (esko) Benutzerseite


Lesenswert?

Ich glaube auch, dass es die Selbsterwärmung ist.
Suche mal hier im Forum so ähnliche Probleme gabs schon öfters.

von Arc N. (arc)


Lesenswert?

Alexander Schmidt schrieb:
> Ich glaube auch, dass es die Selbsterwärmung ist.
> Suche mal hier im Forum so ähnliche Probleme gabs schon öfters.

Dann müsste das Teil einen extrem hohen Stromverbrauch haben...
Der thermische Widerstand der Gehäuse ist zwar hier nicht spezifiziert, 
liegt aber bei anderen Herstellern/ICs grob zw. 150 °C/W bis 250 °C/W 
(SO-8, MSOP-8, wenn das IC auf einer Platine sitzt und kein Luftstrom 
vorhanden ist).

2.8 V * 0.75 mA = 2.1 mW d.h. die Selbsterwärmung dürften nur 250 °C/W * 
2.1 mW ~ 0.5 °C sein.

von Alexander S. (esko) Benutzerseite


Lesenswert?

Arc Net schrieb:
> 2.8 V * 0.75 mA = 2.1 mW d.h. die Selbsterwärmung dürften nur 250 °C/W *
> 2.1 mW ~ 0.5 °C sein.

Dazu kommt dann noch die Erwärmung des Spannungsteilers. Wenn der Sensor 
1mA verbraucht hat der Spg.teiler einen Querstrom von 10mA.

Ist nach dem Spannungsteiler noch ein Kondensator 10µF und 100nF?

von Remote O. (remote1)


Lesenswert?

Alexander Schmidt schrieb:
> Ich glaube auch, dass es die Selbsterwärmung ist.
> Suche mal hier im Forum so ähnliche Probleme gabs schon öfters.

Ich arbeite selber auch mit dem Sensor und kann das von dir beschriebene 
Verhalten nicht nachvollziehen. Ich habe nicht solche enormen 
Abweichungen feststellen können. Ich könnte auch nicht behaupten, dass 
der Sensor übermäßig träge ist. Was aber Fakt ist, dass der Sensor bei 
übermäßigen Handhabung (ständig anfassen etc.) natürlich mehr anzeigt 
als die Umgebungstemperatur.

von C. H. (hedie)


Lesenswert?

Alexander Schmidt schrieb:
> Ist nach dem Spannungsteiler noch ein Kondensator 10µF und 100nF?

ja, hab noch einen 100nF Kondensator dran...

Remote One schrieb:
> Was aber Fakt ist, dass der Sensor bei
> übermäßigen Handhabung (ständig anfassen etc.) natürlich mehr anzeigt
> als die Umgebungstemperatur.

Das ist selbstverständlich klar... ich habe den Sensor aber eben nicht 
angefasst... :)

Du hast geschrieben, das du den Sensor auch selbst einsetzt... Kannst du 
denn bestätigen, das ich die empfangenen Daten korrekt auswerte? (Siehe 
Code am beginn des threads...)

von Jens G. (jensig)


Lesenswert?

zwei Dinge könnten zu hoher Eigenerwärmung führen:
- I2C ist mit zu niedrigen PullUp-R's abgeschlossen (zu hoher Strom nach 
Masse bei L)
- oder der Spannungsteiler ist zu niederohmig, und heizt selbst zu viel 
(wenn ebenfalls mit auf dem Sensor-Platinchen)

von C. H. (hedie)


Lesenswert?

Jens G. schrieb:
> zwei Dinge könnten zu hoher Eigenerwärmung führen:
> - I2C ist mit zu niedrigen PullUp-R's abgeschlossen (zu hoher Strom nach
> Masse bei L)
> - oder der Spannungsteiler ist zu niederohmig, und heizt selbst zu viel
> (wenn ebenfalls mit auf dem Sensor-Platinchen)

Pullups sind 10k


Der Spannungsteiler ist 220 ohm und 330 ohm

und ja er ist auf dem platinchen und sogar mit dem massepin des ic's 
verbunden...

Eventuell ist es wirklich das...

Werde es mal checken.... bzw Spannungsregler auf der Hauptplatine 
einbauen

Danke :)

von Remote O. (remote1)


Lesenswert?

Claudio Hediger schrieb:
> Du hast geschrieben, das du den Sensor auch selbst einsetzt... Kannst du
> denn bestätigen, das ich die empfangenen Daten korrekt auswerte? (Siehe
> Code am beginn des threads...)

Da du nicht den ganzen Code zeigst, ist da schwer eine Aussage möglich. 
Du bekommst ja von dem Sensor 2Byte, MSB und LSB. Du hast mit uiTemp ein 
int16 oder der gleichen und damit die beiden einzelnen Bytes 
zusammengefasst. Es weiß aber keiner wie du das gemacht hast. Natürlich 
kann es sein, dass du da einen Fehler drin hast. Mein Code zum DS7505 
bzw. dem DS75LV ist im Artikel zum Thema [[Versenden von SMS mittels 
Mobiltelefon]] mit dabei (Da ist auch eine Funktion mit dabei, welche 
dir die Ausgabe fürs Display ohne deine Division macht)

von Jens G. (jensig)


Lesenswert?

>Der Spannungsteiler ist 220 ohm und 330 ohm

Naja - sorgt doch schonmal für 50mW - ist schon gut geeignet, um wenige 
Grad zu machen.

von Michael H. (michael_h45)


Lesenswert?

Thomas O. schrieb:
> hast du nicht die Möglichkeit den Sensor dorthin zu legen wo die
> Temperatur gemessen werden soll ohne das die ganze Platine mitwandert,
> ist doch klar das wenn sich den Sensor in der Nähe eines analogen
> Spannungsreglers befindet, diese Temperatur mitmisst.
du und wärme... das geht irgend wie nicht zusammen, hm?

> Das mit der Dauer der Temperaturanpassung hängt mit der Wärmekapazität
> des Sensors zusammen. Beispiel wenn ich ein Termomether in ein Glas
neein, die kapazutät ist winzig
der wärmewiderstand machts aus.

> Wasser stelle und dieses einfriere und dann ins Wohnzimmer stelle dauert
> es eine kleine Weile bis mein Thermometer Zimmertemperatur anzeigt.
DAS ist kapazität und deine "kleine weile" sind wohl eher ~1h.

> Bist du auf eine schnelle Messung der Temperaturänderungen angewiesen?
es wird alle 2,5s gemessen. da gähnt jeder sensor.

von C. H. (hedie)


Lesenswert?

Hallo zusammen...

Ich habe den Sensor inzwischen umgelötet...

Auf der Sensor Platine befindet sich jetzt auschlieslich der Sensor und 
die Anschlussdrähte...

Die Spannung bekommt er von einem entfernten 3.3V regler...

Merkwürdigkerweise, habe ich immer noch einen offset von 5 Grad

Es ist wirklich sehr merkwürdig....

Habe auch mal einen neuen Sensor getestet... mit diesem ist es das 
selbe..

von Remote O. (remote1)


Lesenswert?

Claudio Hediger schrieb:
> Habe auch mal einen neuen Sensor getestet... mit diesem ist es das
> selbe..

Dann zeig doch mal dein ganzes Programm und nicht nur den Ausschnitt. 
Wie bereits erwähnt können da ja auch fehlöer im Zusammenhang mit deiner 
16 Bit Zahl sein. Oder probiere mal die oben angegebene Lib für den 
DS75LV. Die haben beide die gleiche Ansteuerung.

von ich (Gast)


Lesenswert?

>> Das mit der Dauer der Temperaturanpassung hängt mit der Wärmekapazität
>> des Sensors zusammen. Beispiel wenn ich ein Termomether in ein Glas
>neein, die kapazutät ist winzig
>der wärmewiderstand machts aus.



Macht beides etwas aus.
Tau = R * C
Das gilt analog auch für Temperaturen

von C. H. (hedie)


Lesenswert?

Remote One schrieb:
> Dann zeig doch mal dein ganzes Programm

Ok...



Hier also der Code...

1
void Get_Temp(void)
2
{
3
  unsigned int uiTemp = 0;
4
  unsigned char ucVorkomma = 0;
5
  unsigned char ucNachkomma = 0;
6
  unsigned char ucVorzeichen = 0;
7
  I2C_Start();
8
  I2C_Send_8(0x91);
9
  uiTemp = i2c_rx(1); //Erstes Byte empfangen
10
  uiTemp = uiTemp << 8; //Nach links schieben
11
  uiTemp |= i2c_rx(0); //zweites byte empfangen
12
  I2C_Stop();
13
14
15
  ucVorkomma = ((uiTemp & 0x7F00) >> 8); //Oberstes bit ist das vorzeichen, daher löschen.
16
  ucVorkomma = ucVorkomma - ucSubtrakt; //Offset abziehen, ucSubtrakt ist 4
17
  ucNachkomma = ((uiTemp & 0x00FF) >> 4);
18
  ucNachkomma = ((ucNachkomma * 625) / 1000);
19
20
  if((ucVorkomma != ucVorkomma_alt) || (ucNachkomma != ucNachkomma_alt))
21
  {
22
    ucVorkomma_alt = ucVorkomma;  //Bereich löschen auf GLCD
23
    ucNachkomma_alt = ucNachkomma; 
24
    lcd_fill_rect (59,15,69,20,WHITE);  //Anzeige löschen
25
  }
26
27
  if((uiTemp & 0x8000))  //Vorzeichen ausgeben
28
  {
29
    ucVorzeichen = 1;  //Minus
30
    lcd_set_cursor(58,LINE2);
31
    lcd_putc(Font[3],'<');
32
  }
33
34
35
  lcd_set_cursor(70,LINE2);
36
37
  char Buffer[5]; //Temperaturwerte ausgeben
38
  itoa( ucVorkomma, Buffer, 10 );
39
  lcd_puts(Font[3],Buffer);
40
  lcd_putc(Font[3],';');
41
  itoa( ucNachkomma, Buffer, 10 );
42
  lcd_puts(Font[3],Buffer);
43
  lcd_putc(Font[3],'=');
44
}

von Matthias (Gast)


Lesenswert?

Der ist nicht komplett.
Wie wird das Teil denn initialisiert?

von Michael H. (michael_h45)


Lesenswert?

ich schrieb:
> Macht beides etwas aus.
mal ganz abgesehen davon, dass ich nie etwas gegenteiliges behauptet 
hab...
> Tau = R * C
...ist das eine rein theoretische aussage, die du praktisch eher nie 
antreffen wirst, weil es keine praktische senke ohne vernachlässigbaren 
innenleitwert gibt.

von C. H. (hedie)


Lesenswert?

Matthias schrieb:
> Der ist nicht komplett.
> Wie wird das Teil denn initialisiert?

Stimmt

Tut mir leid...

Hier nun also die Initialisation
1
void Config_DS7505(void)
2
{
3
  I2C_Start();
4
  I2C_Send_8(0x90);  //Schreiben
5
  I2C_Send_8(0x01);  //Config Register
6
  I2C_Send_8(0x60);  //Schreiben
7
  I2C_Stop();
8
}
9
10
11
void Temp_Register_DS7505(void)
12
{
13
  I2C_Start();
14
  I2C_Send_8(0x90);  //Schreiben
15
  I2C_Send_8(0x00);  //Temp Register
16
  I2C_Start();
17
  I2C_Send_8(0x91);
18
  i2c_rx(0);
19
  I2C_Stop();
20
}

nach dem Config DS7505 wird auf das Tempregister gewechselt...
Und von da werden dann auch die Temperaturmessungen durchgeführt...

von C.H. (Gast)


Lesenswert?

Hat niemand mehr eine Idee?

Der Sensor befindet sich nun frei in der luft..

Dennoch steigt die Temperatur stetig seeehr langsam an.. bis zu einem 
Offset von ein paar Grad

von Matthias (Gast)


Lesenswert?

mach mal folgendes:

Alle Initialisierungen durchlaufen lassen.

Einmal die Temperatur auslesen

Konfigurationsregister zurücklesen,
ob da noch der korrekte Wert drinsteht.

Verifizierung des Signals mit einem Oszi oder Logic Analyzer

Die I2C Routine prüft das ACK vom Sensor?

von C. H. (hedie)


Lesenswert?

Matthias schrieb:
> mach mal folgendes:
>
> Alle Initialisierungen durchlaufen lassen.
>
> Einmal die Temperatur auslesen
>
> Konfigurationsregister zurücklesen,
> ob da noch der korrekte Wert drinsteht.
>
> Verifizierung des Signals mit einem Oszi oder Logic Analyzer
>
> Die I2C Routine prüft das ACK vom Sensor?

Ok vielen Dank für den Tipp...

Hab ich gemacht... Stimmt alles so wie es soll... Mit dem Oszi hab ich 
die korrekten Pegel auf dem Logicanalyzer stimmt das byte und die I2C 
Routine prüft bzw wartet auf das ACK des Sensors... Es hat auch kein 
Timeout drinn welches zu früh abbrechen könnte da die wandlung ja 200ms 
dauert...

wahrscheinlich muss ich einfach mit nem offset leben oder ich ruf mal 
bei maxim an :)

von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Hallo zusammen...

Ich konnte das Problem beheben...

Es lag an der Speisung... Diese hatte aufgrund der I2C Leitung (333kHz) 
sowie des schlechten netzteiles ziemlich unangenehme Rippel drauf... (+- 
20mV)

Ich habe nun ein Filter vor den Sensor gepackt und er läuft nun ziemlich 
einwandfrei :)


Vielen Dank euch allen die mir versucht haben zu helfen...

Anbei noch das von mir verwendete Filter...

Grüsse
Claudio

von Falk B. (falk)


Lesenswert?

@  Claudio Hediger (hedie)

>Anbei noch das von mir verwendete Filter...

Wie sah denn die Stromversorgung vorher aus? Sag nicht, dass dort GAR 
kein Kondensator war . . .

MfG
Falk

von C. H. (hedie)


Lesenswert?

Falk Brunner schrieb:
> Wie sah denn die Stromversorgung vorher aus? Sag nicht, dass dort GAR
> kein Kondensator war . . .

hehe es hatte selbstverständlich kondensatoren dort :)


Es sah etwa so aus

Schlecht Stabilisiertes Stecker netzteil -> 1uF -> 3.3V Regler -> 1uF 
Kondensator -> WireWrap Draht -> 100nF Kondensator -> DS7505

von Falk B. (falk)


Lesenswert?

Wahrscheinlich reicht es, VOR dem 3,3V Regler einen ausreichend großen 
Elko zu platzieren, so 100uF oder so, je nach Strom.

MFG
Falk

von C. H. (hedie)


Lesenswert?

Falk Brunner schrieb:
> Wahrscheinlich reicht es, VOR dem 3,3V Regler einen ausreichend großen
> Elko zu platzieren, so 100uF oder so, je nach Strom.

Problematisch ist eben, das ich die I2C Leitungen zusammen mit VCC und 
GND verdrillt habe. Somit sind Übersprecher der 333kHz SCL Leitung auf 
VCC kein Problem

Zumal die 333kHz 5V Pegel haben.

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.