Thermo digital digital de 1 cable de Dallas - problema con un fuerte pullup

1

Tengo 2 termómetros digitales Dallas / Maxim DS18b20 conectados en modo de energía parásita. Si incluyo un fuerte pull-up como se muestra en la página 6 de la hoja de datos , el dispositivo más cercano da buenos resultados. datos; el que sigue lee 85C (== el valor de reinicio). Si desconecto el pullup fuerte, obtengo lecturas de temperatura válidas en ambos dispositivos.

Omití el interruptor MOSFET en el pullup y conecté el pin de i / o strong-pullup directamente al bus de un solo cable, flotando al hacer que el pin sea una entrada sin pullup.

¿Por qué el pullup fuerte no funciona como se esperaba? ¿Por qué funcionan bien los dispositivos sin uno?


simular este circuito : esquema creado usando CircuitLab

Función de lectura del sensor:

 int8_t DSSensorsSample(TempSens_t t[SENSORS_REQD], uint8_t nsens){
   for( TempSens_t *p = t;  nsens-- > 0;  ++p ){

      p->type = p->addr[0];

      ds.reset();
      ds.select(p->addr);
      ds.write(0x44, 1);        // start conversion, with parasite power on at the end
      pinMode(DSSTRONGPULLUPPIN, OUTPUT);
      digitalWrite(DSSTRONGPULLUPPIN, HIGH);

      delay(1000);     // maybe 750ms is enough, maybe not
      // we might do a ds.depower() here, but the reset will take care of it.

      pinMode(DSSTRONGPULLUPPIN, INPUT);
      digitalWrite(DSSTRONGPULLUPPIN, LOW);

      p->is_present = ds.reset();
      ds.select(p->addr);
      ds.write(0xBE);         // Read Scratchpad

      for ( uint8_t j = 0; j < 9; j++) {           // we need 9 bytes
         p->data[j] = ds.read();
      }
   }
   return( 0 );
}
    
pregunta JRobert

1 respuesta

4

¿Por qué cambias DSSTRONGPULLUPPIN high / low cada vez? Solo déjelo alto todo el tiempo y cambie solo el modo de pin. Incluso si esto deja habilitado el pullup interno de 20kΩ de ATMEGA, esto es insignificante con respecto al pullup fijo de 4.7kΩ que tienes.

En particular, la secuencia

pinMode(DSSTRONGPULLUPPIN, OUTPUT);
digitalWrite(DSSTRONGPULLUPPIN, HIGH);

está causando que el pin sea un fuerte tirón abajo brevemente. Probablemente esté creando los errores que está recibiendo.

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas