DS1820 Umrechnung

Gast #2157631
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
Gast #2157736
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
Gast #2157744
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).
Gast #2157899
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
Gast #2157946
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
Gast #2158100
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.

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