Digitaler Temperatur Sensor Ungenau? DS7505

#1943969
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
#1944029
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
#1944043
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...
#1944047
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.
#1944059
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.
#1944152
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 :)
#1944299
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.
#1944308
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.
#1944679
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...)
#1944750
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 :)
#1944759
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)
#1944780
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.
#1945731
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..
Gast #1946344
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
#1946364
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
}
#1946805
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...
Gast #1947745
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?
#1948303
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 :)
#1949279
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren