¿Cómo calculo el valor requerido para una resistencia pull-up?

Hay muchos tutoriales que usan una resistencia pull-up o pull-down junto con un interruptor para evitar una tierra flotante, por ejemplo

http://www.arduino.cc/en/Tutorial/button

Muchos de estos proyectos usan una resistencia de 10K, simplemente comentando que es un buen valor.

Dado un circuito en particular, ¿cómo determino el valor apropiado para una resistencia desplegable? ¿Se puede calcular o se determina mejor mediante la experimentación?

Encontré este tutorial de sparkfun como una buena introducción a las resistencias pull-up y pull-down. Sparkfun Pull-up Resistors y las respuestas proporcionadas a su excelente pregunta publicada son excelentes.

Respuestas (3)

Respuesta rápida: la experiencia y la experimentación es la forma de averiguar el valor adecuado de pullup/pulldown.

Respuesta larga: La resistencia pullup/down es la R en un circuito de temporización RC. La velocidad a la que su señal transitará dependerá de R (su resistencia) y C (la capacitancia de esa señal). A menudo, C es difícil de saber exactamente porque depende de muchos factores, incluido cómo se enruta ese rastro en la PCB. Como no conoces C, no puedes descifrar cuál debería ser R. Ahí es donde entran la experiencia y la experimentación.

Aquí hay algunas reglas generales para adivinar un buen valor de resistencia pullup/down:

  • Para la mayoría de las cosas, 3.3k a 10k ohmios funciona bien.
  • Para circuitos sensibles a la potencia, utilice un valor más alto. 50k o incluso 100k ohmios pueden funcionar para muchas aplicaciones (pero no todas).
  • Para circuitos sensibles a la velocidad, use un valor más bajo. 1k ohmios es bastante común, mientras que valores tan bajos como 200 ohmios no son desconocidos.
  • A veces, como con I2C, el "estándar" especifica un valor específico para usar. Otras veces, las notas de aplicación de chips pueden recomendar un valor.
200 ohmios para un pullup? Wow, eso es un montón de corriente de reposo.
@ 0x6d64: asume que el bus está bajo cuando está inactivo.
Texas Instruments tiene una muy buena referencia que explica no solo cómo calcular el valor de una resistencia pull-up I2C, sino también cómo se deriva realmente la fórmula. Consulte el Informe de aplicación de cálculo de resistencia de arranque de bus I2C en ti.com/lit/an/slva689/slva689.pdf .

Use 10 kΩ, es un buen valor.

Para más detalles, tenemos que ver lo que hace un pullup. Digamos que tiene un botón que desea leer con un microcontrolador. El botón pulsador es un interruptor momentáneo SPST (Single Pole Single Throw). Tiene dos puntos de conexión que están conectados o no. Cuando se presiona el botón, los dos puntos están conectados (el interruptor está cerrado). Cuando se sueltan, no están conectados (el interruptor está abierto). Los microcontroladores no detectan inherentemente la conexión o desconexión. Lo que sí detectan es un voltaje. Dado que este interruptor tiene solo dos estados, tiene sentido usar una entrada digital, que después de todo está diseñada para estar solo en uno de dos estados. El micro puede detectar en qué estado se encuentra una entrada digital directamente.

Un pullup ayuda a convertir la conexión abierta/cerrada del interruptor a un voltaje bajo o alto que el microcontrolador puede detectar. Un lado del interruptor está conectado a tierra y el otro a la entrada digital. Cuando se presiona el interruptor, la línea se fuerza a nivel bajo porque el interruptor esencialmente hace un cortocircuito a tierra. Sin embargo, cuando se suelta el interruptor, nada conduce la línea a ningún voltaje en particular. Simplemente podría permanecer bajo, recoger otras señales cercanas mediante acoplamiento capacitivo o, finalmente, flotar a un voltaje específico debido a la pequeña fuga de corriente a través de la entrada digital. El trabajo de la resistencia pullup es proporcionar un alto nivel positivo garantizado cuando el interruptor está abierto, pero aún así permitir que el interruptor cortocircuite la línea a tierra de manera segura cuando está cerrado.

Hay dos requisitos principales en competencia sobre el tamaño de la resistencia pullup. Tiene que ser lo suficientemente bajo para jalar sólidamente la línea hacia arriba, pero lo suficientemente alto para que no fluya demasiada corriente cuando el interruptor está cerrado. Ambos son obviamente subjetivos y su importancia relativa depende de la situación. En general, usted hace que el pullup sea lo suficientemente bajo para asegurarse de que la línea esté alta cuando el interruptor esté abierto, teniendo en cuenta todas las cosas que podrían hacer que la línea sea baja de lo contrario.

Veamos lo que se necesita para levantar la línea. Mirando solo el requisito de CC, se descubre la corriente de fuga de la línea de entrada digital. La entrada digital ideal tiene una impedancia infinita. Los reales no, por supuesto, y la medida en que no son ideales generalmente se expresa como una corriente de fuga máxima que puede salir o entrar en el pin. Digamos que su micro está especificado para una fuga máxima de 1 µA en sus pines de entrada digital. Dado que el pullup tiene que mantener la línea alta, el peor de los casos es asumir que el pin parece un sumidero de corriente de 1 µA a tierra. Si tuviera que usar un pullup de 1 MΩ, por ejemplo, entonces ese 1 µA causaría 1 voltio en la resistencia de 1 MΩ. Digamos que este es un sistema de 5V, lo que significa que solo se garantiza que el pin sea de hasta 4V. Ahora debe mirar la especificación de entrada digital y ver cuál es el requisito de voltaje mínimo para un nivel lógico alto. Eso puede ser el 80% de Vdd para algunos micros, que serían 4V en este caso. Por lo tanto, un pullup de 1 MΩ está justo en el margen. Necesita al menos un poco menos que eso para garantizar un comportamiento correcto debido a las consideraciones de DC.

Sin embargo, hay otras consideraciones, y estas son más difíciles de cuantificar. Cada nodo tiene algún acoplamiento capacitivo con todos los demás nodos, aunque la magnitud del acoplamiento disminuye con la distancia, de modo que solo los nodos cercanos son relevantes. Si estos otros nodos tienen señales, estas señales podrían acoplarse a su entrada digital. Un pullup de valor más bajo hace que la línea tenga una impedancia más baja, lo que reduce la cantidad de señal perdida que captará. También le brinda un nivel de CC mínimo garantizado más alto contra la corriente de fuga, por lo que hay más espacio entre ese nivel de CC y donde la entrada digital podría interpretar el resultado como un nivel lógico bajo en lugar de un nivel lógico alto previsto. Entonces, ¿cuánto es suficiente? Claramente, el aumento de 1 MΩ en este ejemplo no es suficiente (una resistencia demasiado alta). Es casi imposible adivinar el acoplamiento a señales cercanas, pero yo d quiere al menos un margen de orden de magnitud sobre el caso mínimo de CC. Eso significa que quiero un pullup de 100 kΩ o menos, aunque si hay mucho ruido, me gustaría que fuera más bajo.

Hay otra consideración que hace que el pullup baje más, y es el tiempo de subida. La línea tendrá alguna capacitancia perdida a tierra, por lo que decaerá exponencialmente hacia el valor de suministro en lugar de ir allí instantáneamente. Digamos que toda la capacitancia parásita suma 20 pF. Eso multiplicado por el pullup de 100 kΩ es 2 µs. Se necesitan 3 constantes de tiempo para llegar al 95% del valor de asentamiento, o 6 µs en este caso. Eso no tiene ninguna consecuencia en el tiempo humano, por lo que no importa en este ejemplo, pero si se tratara de una línea de bus digital que quisiera ejecutar a una velocidad de datos de 200 kHz, no funcionaría.

Ahora veamos la otra consideración en competencia, que es la corriente desperdiciada cuando se presiona el interruptor. Si esta unidad se está quedando sin energía de línea o está manejando una cantidad considerable de energía, unos pocos mA no importarán. A 5V se necesitan 5 kΩ para consumir 1 mA. Eso es en realidad "mucha" corriente en algunos casos, y mucho más de lo necesario debido a otras consideraciones. Si se trata de un dispositivo alimentado por batería y el interruptor podría estar encendido durante una fracción sustancial del tiempo, entonces cada µA puede importar y debe pensar en esto con mucho cuidado. En algunos casos, puede probar el interruptor periódicamente y solo encender el pull-up por un corto tiempo alrededor de la muestra para minimizar el consumo de corriente.

Aparte de las consideraciones especiales como el funcionamiento de la batería, 100 kΩ es una impedancia lo suficientemente alta como para ponerme nervioso por captar ruido. 1 mA de corriente desperdiciada cuando el interruptor está encendido parece innecesariamente grande. Entonces, 500 µA, lo que significa que la impedancia de 10 kΩ es correcta.

Como dije, usa 10 kΩ. Es un buen valor.

Y un requisito adicional es que algunos interruptores, por ejemplo, los interruptores de tipo 'táctil' comunes, se especifican solo para una corriente muy baja, por ejemplo, 1 mA. Tenga en cuenta que 10k (a 5 V o menos) satisface este requisito, pero debe tenerse en cuenta cuando se consideran valores de resistencia más bajos.
@Wouter: mis interruptores táctiles favoritos no solo tienen un máximo de 50 mA (1 mA me parece bajo), sino también un mínimo. Para mantener los contactos limpios, coloco un capacitor en paralelo al interruptor, la idea es que el pico de corriente de cortocircuito al cambiar mantenga los contactos limpios. A pesar de que en las pruebas se especifica una vida útil de solo 100 000 ciclos, no tuvimos problemas para usarlos hasta los 200 000 ciclos.
@stevenvh ¿Podría explicar más sobre el capacitor en paralelo con el interruptor? ¿Por qué hacer que la corriente de cortocircuito inicial sea alta mantiene los contactos limpios?
Esta situación en la que podría ver un acoplamiento capacitivo excesivo que afecta el valor de una resistencia pull-up. Parece una locura, pero no lo es. Tengo una salida de tres estados desagradable, que estoy leyendo con un ADC. Una placa, un pull-up de 220k es suficiente para que el ADC pueda leer todos los tres estados. En otra (tabla más apretada), necesito una dominada de 100k. Pensé que estaba tomando pastillas locas persiguiendo esto toda la mañana.

En primer lugar, este tipo de tutoriales no sirven para nada, no te enseñarán electrónica. Tienes que aprender a dibujar un esquema , el cableado viene después.
Entonces, al carecer del esquema, tuve que derivarlo yo mismo del diagrama de cableado. Bien, eso no fue tan difícil, pero cuando dibujas el esquema, ves que falta algo: ¿a qué se conecta el interruptor táctil? Tienes que saber eso para responder a tu pregunta. Supongo que es una entrada digital del microcontrolador, pero no hay forma de saberlo.

Hay dos situaciones: interruptor táctil abierto e interruptor cerrado.

En el estado cerrado, la entrada del microcontrolador está conectada a tierra, por lo que verá un nivel bajo. También fluirá una corriente a través de la resistencia. Un buen esquema le hubiera dicho que un extremo de la resistencia está conectado a +5V, el interruptor táctil conecta el otro extremo a tierra. A ver si un 10k Ω la resistencia servirá. Entonces la corriente a través de la resistencia es igual 5 V 10 k Ω = 500 m R. Eso parece razonable. Veamos si eso también está bien cuando el interruptor está abierto.

En el estado de interruptor abierto, podemos ignorarlo y pretender que solo hay una resistencia entre V+ y la entrada del microcontrolador. Sabemos por experiencia, o mejor, porque lo buscamos en la hoja de datos que cuando aplica un voltaje a la entrada de un microcontrolador, solo fluirá muy poca corriente, a menudo menos de 1 m A. Digamos que es 1 m A. Entonces la caída de voltaje a través de la resistencia será 1 m A × 10k Ω = 10 mV. El voltaje en la entrada será entonces 4.99V. Probablemente esté bien, pero hagamos nuestro trabajo correctamente. Si tuviera un esquema (creo que ya lo tiene, ¿no?) sabría de qué tipo es el microcontrolador. Sé que Arduino es AVR, así que elegiré una hoja de datos de AVR al azar . Las características eléctricas dicen que un nivel de entrada alto debe ser de al menos 0,6 × V D D (página 320). Eso es 3V, por lo que 4.99V es seguro.

¿Y si hubiéramos elegido un valor de resistencia diferente? Un valor más bajo significaría una menor caída de tensión y la tensión de entrada sería incluso superior a 4,99 V. Pero luego habría más corriente a través de la resistencia cuando el interruptor está cerrado, y eso es algo que no desea.
Un valor de resistencia más alto estaría bien cuando el interruptor esté cerrado, ya que habría menos corriente, pero el voltaje de entrada en el microcontrolador será inferior a 4,99 V. Aquí tenemos algo de margen, por lo que un valor un poco más alto podría estar bien.

conclusión

  1. los 10k Ω está bien tanto para situaciones de interruptor abierto como cerrado.
  2. Aprenda a dibujar esquemas y leer hojas de datos
No estoy de acuerdo en que sea inútil, de hecho, los diagramas de cableado hechos con Fritzing probablemente ahora sean más comunes que los esquemas cuando se trata de Arduino. La audiencia debe ser tenida en cuenta.