Forum: Mikrocontroller und Digitale Elektronik DS1820 Umrechnung


von Martin (Gast)


Lesenswert?

Guten Tag,

ich habe eine sicherlich eigentlich ganz einfache Frage. Ich habe noch 
ein paar alte DS1820 da und möchte die Temperatur auslesen.

Nun habe ich die hier ja bereits viel bekannte Library von Peter 
Dannegger verwendet. Leider hat sie meinen DS1820 nicht erkannt, da er 
einen alten Romcode, 0x22 hat. Dies habe ich experimentiert angepasst.

Nun habe ich mit der Temperaturumrechnung etwas experimentiert komme 
aber nicht weiter. Ich hoffe das hier wer den Fehler einfach sieht.

Es soll die aktuelle Temperatur als dreistellige Dezimalzahl ausgegeben 
werden. z.B. 22,0 = 220.

hier mal der Code ausschnitt:
1
uint16_t read_meas( void )
2
{
3
  uint16_t rueckgabe=0;
4
  uchar id[8], diff;
5
  uint temp;
6
7
  for( diff = SEARCH_FIRST; diff != LAST_DEVICE; ){
8
    diff = w1_rom_search( diff, id );
9
10
    if( diff == PRESENCE_ERR ){
11
  errormsg("No Temp Sensor"); 
12
      break;
13
    }
14
    if( diff == DATA_ERR ){
15
  errormsg("Temp Bus fail"); 
16
      break;
17
    }
18
    if( id[0] == 0x22 || id[0] == 0x10 ){  // temperature sensor DS1820 & DS1822
19
      w1_byte_wr( READ );      // read command
20
      temp = w1_byte_rd();      // low byte
21
      //temp |= (uint)w1_byte_rd() << 8;    // high byte
22
      if( id[0] == 0x10 )      // 9 -> 12 bit
23
        temp <<= 3;
24
25
        //sprintf( s, "%3d.%01d", temp >> 4, (temp << 12) / 6553 ); // 0.1øC
26
  //rueckgabe = (uint8_t) ((temp >> 1)*10) + ((temp << 8) / 66);
27
        rueckgabe = (uint8_t) ((temp*10) / 26);
28
    }
29
  }
30
return rueckgabe;
31
}

Danke schon mal,

Gruß Martin

von Wolfgang S. (wsm)


Lesenswert?

DS18B20 oder DS18S20 ??

von Martin (Gast)


Lesenswert?

Hallo Wolfgang,

es ist ein DS1820 (dieser ist nicht mehr in Produktion) er soll 
baugleich mit dem DS18S20 sein hat aber eine etwas schnellere 
Konversionszeit.


MfG Martin

von John (Gast)


Lesenswert?

Der DS1820 hat den selben Familycode wie der DS18S20 -> 10h. Der DS1822 
z.B. hat den Familycode 22h.

Die Sensoren DS1820 und DS18S20 sind auch nicht baugleich. Der DS1820 
arbeitet intern mit zwei Generatoren und Counter, und beim DS18S20 
funktioniert die Wandlung mit einen Sigma-Delta A/D-Wandler. Was zur 
Folge hat, dass der DS1820 verschiedene Werte für 'COUNT PER °C' 
liefert. Dieses Register ist beim DS18S20 aus Kompatibilitätsgründen 
noch vorhanden, und liefert immer den Wert 16 (10h).

Solange man nur mit der 9bit-Auflösung (0,5 K) arbeitet ist das kein 
Problem. Wenn man aber die volle Auflösung möchte, muss man das 
berücksichtigen.

Funktioniert ein DS18S20 in deiner Schaltung?

Gruß
John

von eProfi (Gast)


Lesenswert?

Ist ja interessant, der DS1820 hat ja noch keine Bandgap, sondern 
arbeitet mit zwei Oszillatoren mit verschiedenen 
Temperaturkoeffizienten.

Für die moderneren mit Bandgap habe ich hier einen sehr kompakten Code 
entwickelt:
Beitrag "DS18S20 - extended resolution bei Temperaturen um 0°C"

Reichen Dir 0,5°C Auflösung?, dann ist es ja sehr einfach.

Wenn nicht, musst Du die Formel mit dem CountRemain verwenden, die im 
Datenbuch angegeben ist. Dabei aufpassen: wenn Du mit signed-Variablen 
arbeitest, stimmt das Ergebnis evtl. nicht.
Hier im Forum sind mehrere Codes gepostet.

Was mich interessiert: welchen Wert hat CountsPerDegree bei 
verschiedenen Temperaturen? Der ist nämlich nicht konstant, sondern von 
der Temperatur abhängig. Kannst Du mal bitte ein paar Werte posten?

Wenn Du Dir die Division sparen willst, reicht es evtl. für die 
Genauigkeit aus, den festen Wert 128 CountsPerDegree zu verwenden (>>7).

von eProfi (Gast)


Lesenswert?

John: nette Überschneidung!

Martin:
in der AppNote105 app105.pdf ist es nochmal genau beschrieben:
Beitrag "DS18S20 hohe Auflösung berechnen"

Tatsächlich hat der DS1820 den FamilyCode 10.
Hast Du wirklich einen DS1820 oder einen DS1822?

von Martin (Gast)


Lesenswert?

Nabend,

es ist wirklich ein DS1820. Habe davon noch ein paar und würde sie 
deswegen gerne noch einsetzen. Die Schaltung hat keine Hochgenauen 
Ansprüche. Es ist eine Temperaturüberwachung von Akkus für den 
Modellbau.

Es reichen 0.5 °C. Das mit der Variablen 'COUNT PER °C' wuste ich ja gar 
nicht, interessant.

Leider hat Maxim ja das alte Datenblatt auch nicht mehr online und hier 
im Forum ist auch das von DS18S20 für den DS1820 drin.

Dann muss ich mir wohl doch nochmal genauer angucken wie er 
funktioniert. Ich hatte mich bis jetzt am DS18B22 orientiert und über 
die komischen Werte gewundert.
Interessanter weise kommt meine empirisch ermittelte Umrechnung recht 
gut hin.


MfG Martin

von John (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist das Datenblatt des DS1820

Gruß
John

von eProfi (Gast)


Lesenswert?

Finde ich auch schade, dass man auf deren HP das Datenblatt nicht mehr 
findet, genauso wenig die app105.

Trau der Beschriftung nicht! Ich habe von Pollin welche, auf denen 
DALLAS DS1820 1022C4 +824AJ steht, aber sicher keine DS1820, sondern 
DS18S20 sind (countPerDegree ist immer 16).

Kannst Du mal die Seriennummer auslesen und mit dem exakten Aufdruck 
posten?

Meine: 0008020b798c und 0008020b76e0
Scanning-Bus-for-DS18X20
2-DS18X20-Sensor(s)-available:
#-in-Bus-:1-:-FC:10-(18S)SN:-8C-79-0B-02-08-00-CRC:5F--CRC-O.K.-
#-in-Bus-:2-:-FC:10-(18S)SN:-E0-76-0B-02-08-00-CRC:8E--CRC-O.K.-
Sensor#-1-is-a-DS18S20/DS1820-which-is-parasite-powered
Sensor#-2-is-a-DS18S20/DS1820-which-is-parasite-powered

DS18B20 hat FC 0x28

von Martin (Gast)


Lesenswert?

Nabend,

also auf meinem steht:

Dallas
DS1820
0708C3
+369AA

den ROMCODE lese ich nachher mal aus.

Danke für das PDF.


Wie macht ihr die Umrechnung den ?



Gruß Martin

von Klaus (Gast)


Lesenswert?

So ein misst hab es doch glatt im falschen Tread gepostet.

Vielleicht hilft euch das hier weiter:

 Temp_read = (scratchpad[0]) * 0.5 ;

    Count_Remain = scratchpad[6];
    Count_PER_C = scratchpad[7];
    temp = (float)Temp_read -0.25 + ((Count_PER_C - Count_Remain) /
Count_PER_C)  ;

Für negative Temperaturen müsste man scratchpad[1] einer Variablen zu
weisen und prüfen ob FFh drinne steht.

Wenn FFh ein Flag setzen für die Ausgabe des minus Zeichen.
Dann das Zweierkomplement bilden mit scratchpad[0]) und
denn Rest normal weiter rechnen lassen.

Die Berechnung oben löst die Temperatur in 0,1 °C schritten auf.

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.