¿Cómo funcionan los pullups digitales?

Tengo una pregunta tonta. ¿Cómo funcionan los pullups digitales? Lo pregunto porque no entiendo el código del controlador DHT11. Código de muestra:

bcm2835_gpio_write(pin, HIGH); usleep(500000); // 500 ms bcm2835_gpio_write(pin, LOW); usleep(20000); Enviará la señal de inicio a DHT11, pero debe ser BAJA durante 500 ms y luego ALTA durante 20 us, pero aquí las señales están invertidas. Entonces, ¿por qué funcionan los pullups? Esquemático:

¿Estás seguro de que tienes el código de controlador correcto? No veo el código del controlador que mencionas aquí: github.com/adafruit/DHT-sensor-library
En ese código, cambian explícitamente el modo del controlador a Entrada cuando dejan que el pull-up lo suba, y a Salida cuando quieren anularlo.
@caveman Este es el código arduino. Necesito el código de Raspberry Pi.

Respuestas (3)

El DHT11 es un sensor de humedad y temperatura que utiliza una comunicación de un solo cable entre el microcontrolador y el sensor.

ingrese la descripción de la imagen aquí

En el diagrama anterior, la resistencia de 5K es la resistencia pull-up, que está vinculada a Vdd (fuente de alimentación). Mantiene la línea de DATOS en una condición alta (1) en ausencia de señales de cualquiera de los extremos de la línea de DATOS.

Cuando el microcontrolador quiere enviar datos al sensor, para un 0 lleva la línea a tierra (esto se llama "hundimiento"), y para un 1, simplemente deja la línea en un modo de alta impedancia y deja que la resistencia pullup funcione. la línea alta.

Asimismo, cuando el sensor envía datos de regreso al microcontrolador, el microcontrolador tendrá la línea de E/S configurada como una entrada de alta impedancia. Esto permite que el sensor envíe datos pulsando la línea baja según sea necesario para un 0. Tampoco eleva la línea, pero permite que la resistencia la suba.

Entonces, el estado "normal" para cada extremo de la línea de DATOS es que tanto el microcontrolador como el sensor tengan sus pines en un estado de alta impedancia, y solo lleven la línea a tierra según sea necesario para enviar al otro extremo.

Un pull-up se utiliza para llevar una señal a un estado alto, por ejemplo, Vdd, cuando no hay disponible ningún controlador capaz de llevar la señal a un nivel alto en el circuito/red/dispositivo que genera la señal. Un ejemplo de tal salida sería una salida de drenaje abierto.

La idea es usar una resistencia entre la señal y Vdd donde el valor de la resistencia es lo suficientemente débil para que la señal pueda ser atraída hacia el estado bajo (GND en mi ejemplo) cuando el circuito de salida la reduce. Cuando la señal no se reduce, se eleva a su estado alto utilizando la resistencia débil. Tiendo a usar valores de resistencia de 10k o 47k.

El mismo razonamiento es para los menús desplegables, pero allí desea reducir la señal usando una resistencia débil.

Aquí hay un poco más del código. El pullup básicamente no está activo durante las líneas de la pregunta porque el pin gpio está configurado como salida. Pero luego, el pin se configura para ser una entrada. En ese punto, el pullup está creando un estado predeterminado de 1. Pero el sensor puede bajarlo y lo hace para proporcionar datos al procesador.

  // Set GPIO pin to output
  bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);  <<----OUTPUT, so pullup doesn't really do anything.
  bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_OUTP);  // Why twice?  Probably just sloppy coding.

  bcm2835_gpio_write(pin, HIGH);
  usleep(500000);  // 500 ms
  bcm2835_gpio_write(pin, LOW);
  usleep(20000);

  bcm2835_gpio_fsel(pin, BCM2835_GPIO_FSEL_INPT); <<---- INPUT, pullup is significant now.

  data[0] = data[1] = data[2] = data[3] = data[4] = 0;

  // wait for pin to drop?
  while (bcm2835_gpio_lev(pin) == 1) {
    usleep(1);
  }

  // read data!
  for (int i=0; i< MAXTIMINGS; i++) {
    counter = 0;
    while ( bcm2835_gpio_lev(pin) == laststate) {
        counter++;
        //nanosleep(1);         // overclocking might change this?
        if (counter == 1000)
          break;
    }

Como nota al margen, una lectura rápida de este código muestra que está un poco más pirateado que el controlador del sensor arduino en su árbol git. Si esto no funciona, probablemente tenga sentido volver a escribir transfiriendo el código de arduino.