¿Cómo funcionan los pullups digitales?

1

Tengo una pregunta coja. ¿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 para 20 horas, pero aquí las señales se invierten. Entonces, ¿por qué funciona el pullups? Esquemático:  

    
pregunta Over Killer

3 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.

Eneldiagramaanterior,laresistenciade5Keslaresistenciadepullup,queestávinculadaaVdd(fuentedealimentación).MantienelalíneadeDATOSenunacondiciónalta(1)enausenciadeseñalesdesdecualquieradelosextremosdelLíneadedatos.

Cuandoelmicrocontroladordeseaenviardatosalsensor,paraun0conducelalíneaatierra(estosellama"hundimiento"), y para 1, simplemente deja la línea en un modo de alta impedancia, y permite que resistencia pullup conducir la línea alta.

Del mismo modo, cuando el sensor envía datos 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. Además, no impulsa la línea alta, sino que permite que la resistencia la levante hacia arriba.

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

    
respondido por el tcrosley
1

Se utiliza un pull-up para conducir una señal a un estado alto, por ejemplo, Vdd, cuando no hay ningún controlador capaz de conducir la señal alta en el circuito / red / dispositivo que emite 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 sea lo suficientemente débil como para que la señal pueda ser llevada hacia el estado bajo (GND en mi ejemplo) cuando es conducida por el circuito de salida. . Cuando la señal no se pone baja, 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 en este caso usted quiere reducir la señal utilizando una resistencia débil.

    
respondido por el Mattias Johansson
1

Aquí hay un poco más del código. Básicamente, el pullup no está activo durante las líneas en la pregunta porque el pin gpio está configurado como salida. Pero más tarde, el pin se establece para ser una entrada. En ese momento, el pullup está creando un estado predeterminado de 1. Pero el sensor puede y lo hace al mínimo 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 a través 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 tendría sentido volver a escribir portando el código arduino.

    
respondido por el caveman

Lea otras preguntas en las etiquetas