Digitaler Temperatur Sensor Ungenau? DS7505

OP #1943969
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
OP
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
OP
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...
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.
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.
OP
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 :)
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.
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.
OP
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...)
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)
OP
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 :)
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)
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.
OP
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..
Gast
>> 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
OP
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
}
OP
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...
Gast
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
Gast
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?
OP
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 :)
OP
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
Angehängte Dateien:
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.