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

98

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

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

Muchos de estos proyectos usan una resistencia de 10K, simplemente señalando 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 por experimentación?

Mark Harrison
fuente
Este tutorial de sparkfun me pareció una buena introducción a las resistencias pull-up y pull-down. Las resistencias pull-up de sparkfun y las respuestas proporcionadas a su pregunta publicada más excelente son excelentes.
Richard Chambers

Respuestas:

82

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

Respuesta larga: La resistencia pullup / down es la R en un circuito de temporización RC. La velocidad de transición de su señal dependerá de R (su resistencia) y C (la capacidad de esa señal). Muchas veces, C es difícil de saber exactamente porque depende de muchos factores, incluyendo cómo se enruta ese rastro en la PCB. Como no conoces a C, no puedes descubrir qué debería ser R. Ahí es donde entran la experiencia y la experimentación.

Aquí hay algunas reglas generales al 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 energía, use 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.

fuente
10
200 ohmios para un pullup? Wow, eso es mucha corriente de reposo.
0x6d64
44
@ 0x6d64: está asumiendo que el autobús está bajo cuando está inactivo.
Connor Wolf
3
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 la fórmula. Consulte el informe de la aplicación de cálculo de resistencia de pullup de bus I2C en ti.com/lit/an/slva689/slva689.pdf .
JamieVer
77

Use 10 kΩ, es un buen valor.

Para más detalles, tenemos que mirar lo que hace un pullup. Digamos que tiene un botón que desea leer con un microcontrolador. El botón 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 liberan, no están conectados (el interruptor está abierto). Los microcontroladores no detectan inherentemente la conexión o desconexión. Lo que sí perciben 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 los 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 la baja porque el interruptor esencialmente lo cortocircuita a tierra. Sin embargo, cuando se suelta el interruptor, nada está impulsando la línea a ningún voltaje en particular. Podría permanecer bajo, captar otras señales cercanas mediante acoplamiento capacitivo o eventualmente flotar a un voltaje específico debido a la pequeña corriente de fuga 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 acorte de forma segura la línea a tierra cuando está cerrado.

Hay dos requisitos principales en competencia sobre el tamaño de la resistencia pullup. Tiene que ser lo suficientemente bajo como para jalar firmemente la línea hacia arriba, pero lo suficientemente alto como para no hacer que fluya demasiada corriente cuando el interruptor está cerrado. Ambos son obviamente subjetivos y su importancia relativa depende de la situación. En general, el pullup es lo suficientemente bajo como para asegurarse de que la línea es alta cuando el interruptor está abierto, dado todo lo que podría hacer que la línea sea baja de lo contrario.

Veamos qué se necesita para levantar la línea. Al observar solo el requisito de CC, se descubre la corriente de fuga de la línea de entrada digital. La entrada digital ideal tiene impedancia infinita. Las 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 1 µA causaría 1 voltio a través de la resistencia de 1 MΩ. Digamos que este es un sistema de 5V, lo que significa que el pin solo tiene una garantía de hasta 4V. Ahora tiene que mirar las especificaciones 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 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 en ellos, estas señales podrían acoplarse a su entrada digital. Un pullup de menor valor hace que la línea tenga una impedancia más baja, lo que reduce la cantidad de señal parásita 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 una lógica baja en lugar de la lógica lógica alta. Entonces, ¿cuánto es suficiente? Claramente, el pullup de 1 MΩ en este ejemplo no es suficiente (una resistencia demasiado alta). Es casi imposible adivinar el acoplamiento a señales cercanas, pero me gustaría al menos un margen de orden de magnitud sobre el caso mínimo de DC. Eso significa que quiero un pullup de 100 kΩ o menos al menos, aunque si hay mucho ruido alrededor, me gustaría que fuera más bajo.

Hay otra consideración que reduce el pullup, y ese es el tiempo de subida. La línea tendrá una capacitancia parásita a tierra, por lo que se desintegrará exponencialmente hacia el valor de suministro en lugar de ir allí instantáneamente. Digamos que toda la capacitancia parásita suma 20 pF. Eso multiplica por 100 kΩ pullup es 2 µs. Se necesitan 3 constantes de tiempo para llegar al 95% del valor de establecimiento, 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 quisieras ejecutar a una velocidad de datos de 200 kHz, no funcionaría.

Ahora veamos la otra consideración competitiva, que es el desperdicio actual cuando se presiona el interruptor. Si esta unidad se está quedando sin energía de la línea o de otra manera está manejando una energía considerable, unos pocos mA no importarán. A 5V, se necesitan 5 kΩ para extraer 1 mA. En realidad, eso es "mucha" corriente en algunos casos, y mucho más de lo requerido 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 ser importante y debe pensar en esto con mucho cuidado. En algunos casos, puede muestrear el interruptor periódicamente y solo activar el pullup durante un corto tiempo alrededor de la muestra para minimizar el consumo de corriente.

Además 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 la correcta.

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

Olin Lathrop
fuente
1
Y un requisito adicional es que algunos interruptores, por ejemplo, los interruptores comunes de tipo 'táctil', se especifican solo para una corriente muy baja, por ejemplo 1 mA. Tenga en cuenta que 10k (a 5V o menos) satisface este requisito, pero debe tenerse en cuenta cuando se consideran valores de resistencia más bajos.
Wouter van Ooijen
1
@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 limpios los contactos, coloco un condensador en paralelo al interruptor, la idea es que el pico de corriente de cortocircuito al cambiar mantiene limpios los contactos. A pesar de que la vida útil de solo 100 000 ciclos se especifica en las pruebas, no tuvimos problemas para usarlos en 200 000 ciclos.
stevenvh
@stevenvh ¿Podría explicar más sobre el condensador en paralelo con el interruptor? ¿Cómo es que hacer que la corriente de cortocircuito inicial sea alta mantiene limpios los contactos?
Abdullah Kahraman
Esta situación en la que se puede ver un acoplamiento capacitivo excesivo que afecta el valor de una resistencia pull-up Parece una locura, pero no lo es. Tengo una desagradable salida de tres estados, que estoy leyendo con un ADC. Una placa, un pull-up de 220k es suficiente para que el ADC pueda leer todos los tri-estados. En otro (tablero más apretado), necesito un pull-up de 100k. Pensé que estaba tomando pastillas locas persiguiendo esto toda la mañana.
Leroy105
23

Primero, este tipo de tutoriales es inútil, 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. OK, 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 y interruptor cerrado.

Ω5V10kΩμ

μμμ×Ω× VDD

¿Qué pasaría si hubiéramos elegido un valor de resistencia diferente? Un valor más bajo significaría una menor caída de voltaje y el voltaje de entrada sería incluso más alto que 4.99V. Pero entonces 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.99V. Tenemos algo de margen aquí, por lo que un valor algo mayor podría estar bien.

conclusión

  1. Ω
  2. Aprenda a dibujar esquemas y leer hojas de datos
stevenvh
fuente
77
No estoy de acuerdo con que sea inútil, de hecho, los diagramas de cableado hechos con Fritzing probablemente ahora sean comunes a los esquemas cuando se trata de Arduino. La audiencia debe ser tomada en consideración.
Dave Newton