Probleme mit MAX31820 (ESP Micropython und Raspi)

OP #8102315
Lesenswert?
• ▲
▼

Der MAX31820 wird ja ausdrücklich als software-kompatibel zum DS18B20 beworben, nach meiner Erfahrung stimmt das zumindest für den MAX31820PAR nicht (dass er nur für 3.0 bis 3.7 Volt spezifiziert ist, ist klar). Der MAX31820 ist für 3-Pin-Anschluss gedacht, der MAX31820PAR für 2-Pin parasitic-power.

Ich bekomme bei einem MAX31820PAR in parasitic-power Anschluss sowohl an einem Raspberry Pi mit RaspiOS Trixie, ESP32 und ESP32-C3 (letztere mit Micropython) immer nur die Ausgabe 127.9375 Grad, ich habe auch den pullup-Widerstand mal verkleinert. Der MAX stammt von Mouser, alle 5 Exemplare haben das selbe Verhalten.

#8102325
Lesenswert?
• ▲
▼

Stephan S. schrieb:

ich habe auch den pullup-Widerstand mal verkleinert.

Niedrig genug?

However, when the device is performing temperature conversions or copying data from the scratchpad memory to EEPROM, the operating current can be as high as 1.5mA. This current can cause an unacceptable voltage drop across the weak 1-Wire pullup resistor and is more current than can be supplied by C PP . To ensure that the device has sufficient supply current, it is necessary to provide a strong pullup on the 1-Wire bus whenever temperature conversions are taking place, or data is being copied from the scratchpad to EEPROM. This can be accomplished by using a MOSFET to pull the bus directly to the rail, as shown in Figure 1. The 1-Wire bus must be switched to the strong pullup within 10μs (max) after a Convert T [44h] or Copy Scratchpad [48h] command is issued, and the bus must be held high by the pullup for the duration of the conversion (t CONV ) or data transfer (t WR = 10ms). No other activity can take place on the 1-Wire bus while the pullup is enabled.

Also nach Command den Ausgang mit Totempole auf High (nicht einfach nur open collector sperren)

Vor dem Auslesen dann wieder zurück.

Nur so als erster Gedanke, habe so'n Ding hier nicht zur Verfügung.

OP #8102377
Lesenswert?
• ▲
▼

Das die kaputt oder gefälscht sind glaube ich eher nicht, die sind von Mouser. Ich denke eher, dass die Routinen beim Raspi oder Micropython einfach nicht passend für den MAX31820(PAR) sind.

Vielleicht liest ja jemand mit, der den MAX31820 schon ausprobiert hat.

Ich jedenfalls werde zum Original DS18B20 zurückkehren (habe auch ein paar "chinesische" gehabt, hatte aber Glück).

#8102387
Lesenswert?
• ▲
▼

Stephan S. schrieb:

Ich denke eher, dass die Routinen beim Raspi oder Micropython einfach nicht passend für den MAX31820(PAR) sind.

Daß der Raspi von sich aus keinen 'Strong-Pullup', wie im Datenblatt Fig.1 und Fig.5 gefordert ist, kann sollte sich langsam rumgeschwiegen haben. DS18x20 funktionieren meist auch ohne den und die dürften die Hauptanwendung beim Pi und µPython-Anwendungen sein. Du mußt wohl einen Transistor dazu bauen und die Routinen anpassen.

OP #8102388
Lesenswert?
• ▲
▼

Ich habe mich jetzt mal doch aufgerafft und einen Aufbau mit beiden ICs gemacht.

Das Verhalten des MAX18B20PAR ist schon auffällig, auch die Sekunde mit dem mittleren Pegel nach der Messung mit read_temp().

Pullup war 4k7, also habe ich nochmal niedrigere Pullups probiert.

Bis runter zu 1k2 gab es immer die Ausgabe 127.9375 Grad,
bei 1k0 war der Kippunkt, mal 127.9375, mal die korrekte Temperatur,
unter 1k (680R bzw 820R) gab es immer die richtige Temperatur.

-->> Ein niedriger Pullup unter 1k muss rein. Es lebe das Oszi!

Angehängte Dateien:
: Bearbeitet durch User
OP #8102392
Lesenswert?
• ▲
▼

Norbert schrieb:

Stephan S. schrieb:

Ich denke eher, dass die Routinen beim Raspi oder Micropython einfach nicht passend für den MAX31820(PAR) sind.

Initialisation, ROM command, Function Command Das ist doch gerade mit MicroPython in ein paar Minuten weg gefrühstückt.

Micropython hat die 1-wire-Routinen in der Grundausstattung.
https://docs.micropython.org/en/latest/esp8266/tutorial/onewire.html

OP #8102422
Lesenswert?
• ▲
▼

Oliver schrieb:

Damit liegst Du schon sehr nahe an den maximalen 4mA Sink-Current und hast eine unnötig hohe Eigenerwärmung die Dir die Messergebnisse versaut.

Danke für den Hinweis, werde ich demnächst beobachten, habe den ganzen Kram gerade wieder abgebaut.

Die Lösung mit dem MOSFET im Datenblatt des PAR ist halt für Raspis nicht umsetzbar, das Timing macht die im RaspiOS eingebaute Routine. Für die ESP wäre es denkbar, wenn man eine eigene Routine dafür schreibt.

Edit:

Wenn ich mir das Bild DS1Z_QuickPrint3.png ansehe, dann ist das evtl nur die eine Sekunde NACH der Messung relevant, für die Messung selbst wohl nicht.

: Bearbeitet durch User
#8102440
Lesenswert?
• ▲
▼

Oliver schrieb:

und hast eine unnötig hohe Eigenerwärmung die Dir die Messergebnisse versaut.

Die entsteht aber im Widerstand, nicht im Sensor. Der nimmt sich nur was er braucht und lädt seinen kleinen Ko auf. Seltsam finde ich allerdings, dass im Datenblatt mehrmals von 4.7kΩ gesprochen wird. Vielleicht ist ja die vorgefertigte Implementierung der Ansteuerung, hmmm, sagen wir mal grenzwertig schlecht und hält sich so gar nicht an das im Datenblatt vorgegebene Timing. Ansonsten kann ich mir die Diskrepanz von <1kΩ zu 4.7kΩ nicht erklären.

#8102456
Lesenswert?
• ▲
▼

Stephan S. schrieb:

das Timing macht die im RaspiOS eingebaute Routine.

Du nutzt die Kernel-Treiber?

w1-therm hat eine Option "strong_pullup", damit kannst du einstellen dass der Bus bei parasitärer Versorgung kurz mehr Strom kriegt.

1
/*
2
 * Allow the strong pullup to be disabled, but default to enabled.
3
 * If it was disabled a parasite powered device might not get the require
4
 * current to do a temperature conversion.  If it is enabled parasite powered
5
 * devices have a better chance of getting the current required.
6
 * In case the parasite power-detection is not working (seems to be the case
7
 * for some DS18S20) the strong pullup can also be forced, regardless of the
8
 * power state of the devices.
9
 *
10
 * Summary of options:
11
 * - strong_pullup = 0  Disable strong pullup completely
12
 * - strong_pullup = 1  Enable automatic strong pullup detection
13
 * - strong_pullup = 2  Force strong pullup
14
 */

implementiert in https://github.com/torvalds/linux/blob/master/drivers/w1/masters/w1-gpio.c

1
static u8 w1_gpio_set_pullup(void *data, int delay)
2
{
3
  struct w1_gpio_ddata *ddata = data;
4

5
  if (delay) {
6
    ddata->pullup_duration = delay;
7
  } else {
8
    if (ddata->pullup_duration) {
9
      /*
10
       * This will OVERRIDE open drain emulation and force-pull
11
       * the line high for some time.
12
       */
13
      gpiod_set_raw_value(ddata->gpiod, 1);
14
      msleep(ddata->pullup_duration);
15
      /*
16
       * This will simply set the line as input since we are doing
17
       * open drain emulation in the GPIO library.
18
       */
19
      gpiod_set_value(ddata->gpiod, 1);
20
    }
21
    ddata->pullup_duration = 0;
22
  }
23

24
  return 0;
25
}

Bei meinen letzten Bastelleien in der Richtung hab ich aber einfach einen DS2482-100 an i2c gehängt,

1
modprobe ds2482
2
echo ds2482 0x18 > /sys/bus/i2c/devices/i2c-0/new_device
3
modprobe w1_therm
4

5
cat /sys/bus/w1/devices/28-000005db2013/w1_slave

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