Conexión del pulsador a un pin del controlador

Este problema tiene décadas de antigüedad, pero no veo una respuesta directa en este sitio. quiero lo siguiente:

ingrese la descripción de la imagen aquí

Este circuito solo permite comprobar el estado del botón desde el interior del microcontrolador. Nada sofisticado. Mis preguntas:

  1. ¿Hay algo mejor que este diseño simple?
  2. ¿El valor de la resistencia de 100 kilo ohmios es adecuado para los dispositivos CMOS de nuestros días, como dsPIC30FXXXX y no para una aplicación de alta potencia?
1) En realidad, no, a menos que esté buscando un dispositivo antirrebote de hardware. 2) Sí.

Respuestas (5)

Primero, muchos microcontroladores y controladores de señales digitales tendrán resistencias pull-up internas. Aquí hay un ejemplo, un Atmel ATMega164.Puerto GPIO ATMega164p

Por lo general, habrá un registro que permita activar y desactivar los pull ups internos. Debido a las variaciones en el proceso de fabricación, estos pullups internos vienen en una gama muy amplia y no son una buena opción si necesita un control muy estricto sobre el consumo de corriente en aplicaciones de potencia ultra baja. Si mantener bajo el número de componentes es importante, esta es una manera fácil de hacerlo. Usar pull ups internos para el rebote del hardware no sería una buena idea, ya que no es posible predecir su valor exacto.

Ya sea el 100 k Ω el valor es adecuado depende. Si es solo un interruptor que un usuario activará periódicamente, entonces 100 k Ω sería una buena opción para minimizar el consumo de energía. Para las cosas que van a cambiar más rápidamente, como los codificadores rotatorios, el proceso por el que pasaría es

  1. Encuentre la corriente de disipación máxima en la hoja de datos
  2. Calcule un valor de pull up usando la Ley de Ohm
  3. Elija una resistencia de tamaño estándar un poco más grande, dependiendo de la velocidad que realmente necesite
  4. Pruebe y vea si el tamaño de resistencia elegido da los tiempos de subida y bajada requeridos
  5. Ajustar en consecuencia

Entonces, si la corriente de sumidero máxima por pin GPIO fuera de 10 mA y operando a 5V: R = V yo = 5 V 10 metro A = 500 Ω . Mantener este valor R lo más pequeño posible permitirá los bordes más nítidos y las frecuencias de conmutación más altas.

¿Está diciendo que debido a la capacitancia del cable/traza, tendrá un circuito RC que causará retrasos en la propagación de la señal al uC, y que con una R más grande, estos retrasos en la propagación pueden causar una mala lectura de un codificador rotatorio?
Sí, las reactancias parásitas son solo un hecho de la vida que debe tratarse cada vez más a medida que aumenta la frecuencia.
¡Interesante! Sin embargo, estoy confundido: suponiendo que la capacitancia paracítica es inferior a 1 uF, dada una resistencia de 100k Ohms y asumiendo 0.1uF C parasitario, obtenemos una constante de tiempo de alrededor de 23mS (entrada = 5V, salida = 4.5V). En otras palabras, en un circuito de 5 V, el uC verá 4,5 V en la entrada en un pulso ascendente en menos de 25 ms. Para que el uC pase por alto eso (bajo el supuesto de que no está sondeando), el codificador estaría generando pulsos a 40 Hz más o menos. ¿Es algo de lo que deberíamos preocuparnos?
La capacitancia parásita suele estar en el rango de nano o picofaradios. Esto se convierte en un problema con los codificadores rotatorios a velocidades más altas. Considere un codificador óptico que emite 24 pulsos por revolución y gira a 1500 RPM. Las ondas cuadradas de salida serán de 600 Hz con un período de aproximadamente 1,2 ms. Esto todavía es lo suficientemente lento como para que el tamaño mínimo de pull up sea innecesario, pero 100 k Ω daría lugar a tiempos de subida y bajada que es poco probable que sean aceptables. Esto vale la pena una pregunta por sí solo.
Verdadero y verdadero Estaba pensando en codificadores rotatorios manuales.

Puedes ser más simple que eso.

Simplemente use una resistencia interna pull-up/pull-down en su microcontrolador.

100k es adecuado, pero los pullups internos podrían ser un poco más bajos en algunas MCU, por ejemplo, en AVR atmega8 son 30-80kOhm para reset pull-up y 20-50kOhm para todos los demás pines de E/S.

No se puede decir que 100k es adecuado. No hay un recibo universal, debe calcular el valor de acuerdo con la MCU y el dispositivo que impulsa el pin en el otro lado.
La persona que hizo la pregunta especificó un botón pulsador. No veo ningún problema con esta respuesta.
  1. ¿Hay algo mejor que este diseño simple?


    Mejor no se puede responder sin criterios específicos para medir, que no ha proporcionado. En la mayoría de los casos, la topología que muestra está bien. Dos variaciones pueden ser "mejores" dependiendo de la situación:

    Muchos microcontroladores tienen pullups internos en algunos de sus pines. Estos están destinados exactamente para este tipo de situación. La resistencia es entonces interna al micro y configura un poco en algún lugar para habilitarlo. La única parte externa requerida es solo el botón pulsador.

    Otra variante útil a tener en cuenta es para diseños de baja potencia en los que el botón puede ser un interruptor que se puede cerrar durante largos períodos de tiempo. En ese caso, desea minimizar la corriente promedio a largo plazo a través de la resistencia pullup. Lo haces lo más grande posible, pero hay límites y desventajas por hacerlo demasiado grande. En su lugar, enciende el pull-up durante unos pocos µs a la vez para tomar una lectura de botón. Si comprueba el botón cada 1 ms y el pullup está activado durante 10 µs, la corriente de pullup promedio se reduce 100 veces. Con una resistencia externa, usa otro pin para impulsar el lado superior del pullup. Con un pullup interno, lo habilita/deshabilita en el firmware según sea necesario.

  2. ¿El valor de la resistencia de 100 kilo ohmios es adecuado para los dispositivos CMOS de nuestros días, como dsPIC30FXXXX y no para una aplicación de alta potencia?


    Ya he respondido esto extensamente aquí .

¿Mejor que ese diseño simple? Sí. Ponga una tapa en él y tendrá un interruptor de rebote de hardware simple.

ingrese la descripción de la imagen aquí

El condensador sería una tapa de cerámica común de 0,1 uf. La resistencia sería de 10k. Este sitio tiene todos los detalles sobre por qué. En resumen, un circuito de rebote evita que el microcontrolador registre falsamente múltiples pulsaciones cuando presiona el botón. La configuración de resistencia/condensador suaviza el rebote mecánico del botón para que sea una transición constante.

A las tapas electrolíticas no les gusta que se les cortocircuite. Usualmente uso 100nF que funciona bien para mis aplicaciones.
@jippie el símbolo era lo que tenía la imagen, pero lo que se necesita es una cerámica de 100nf o 0.1uf.
Este no es un buen circuito antirrebote. Primero, esto solo rebota una ruptura, no una marca. Cuando se presiona el botón, la tapa se cortocircuita inmediatamente. En segundo lugar, la constante de tiempo de 1 ms es demasiado corta para ser de mucha utilidad. En tercer lugar, esto solo debe alimentarse a una entrada de disparador Schmidt. A las entradas normales no les gustan las señales que aumentan lentamente. Simplemente deje la tapa y haga el antirrebote en el firmware, lo que tendría que hacer de todos modos, incluso con la tapa.
Sí, al hacer que la tapa se cortocircuite inmediatamente, pero cualquier recarga debido al rebote se filtra con un filtro de paso bajo, lo que elimina cualquier efecto del rebote. Quizás más exactamente, el rebote al hacer es un mecanismo muy diferente al rebote al romper. Sin embargo, un ms es demasiado rápido. No me gusta usar este circuito por varias razones. Sin embargo, si está provocando una interrupción con el pin en cuestión, la eliminación de rebotes en el firmware a menudo no es la mejor solución. Pasar a un DPST y eliminar el rebote con un flip-flop SR es un método bastante bueno para ese caso.

EDITAR: el comentario que hice a continuación tenía la intención de hacer un seguimiento de lo que Olin había dicho más tarde sobre el circuito con un condensador para supuestamente agregar rebote. Lo siento, parece que aparece en el lugar equivocado. ¡Tal vez alguien pueda arreglar esto porque obviamente soy demasiado ciego o estúpido para ver cómo debería haberlo hecho!

Estoy de acuerdo con Olin: no proporciona un buen rebote. También agregaría que hacer un cortocircuito en el capacitor puede causar un gran aumento de corriente que puede reiniciar el microprocesador si el diseño de PCB no es realmente bueno. Algunos interruptores necesitan una corriente de humectación para funcionar de manera correcta y confiable y 100k puede ser demasiado alto para algunos interruptores (especialmente los interruptores de membrana).