Conectar el botón a un pin del controlador

8

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 verificar 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 nuestros dispositivos CMOS actuales, como dsPIC30FXXXX y no para una aplicación de alta potencia?
Kirill Kobelev
fuente
2
1) En realidad no, a menos que esté buscando un rebote del hardware. 2) sí.
NickHalden

Respuestas:

6

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

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

Si el valor de 100 es adecuado depende. Si se trata solo de un interruptor que un usuario activará periódicamente, entonces 100 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 rotativos, el proceso que seguiría eskΩkΩ

  1. Encuentre la corriente de sumidero máxima en la hoja de datos
  2. Calcule un valor de extracción usando la Ley de Ohm
  3. Elija una resistencia de tamaño estándar de unos tamaños más grandes, dependiendo de la velocidad realmente necesaria
  4. Pruebe y vea si el tamaño de resistencia elegido proporciona 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 funcionara a 5V: R=Vyo=5 5V10metroUNA=500Ω. Mantener este valor R lo más pequeño posible permitirá los bordes más agudos y las frecuencias de conmutación más altas.

Matt Young
fuente
¿Está diciendo que debido a la capacitancia de alambre / traza tendrá un circuito RC que causará demoras en la propagación de la señal a la uC, y que con una R mayor, estas demoras en la propagación pueden causar una lectura errónea de un codificador rotatorio?
angelatlarge
Sí, las reactancias parasitarias son solo un hecho de la vida que debe tratarse cada vez más a medida que aumenta la frecuencia.
Matt Young
¡Interesante! Sin embargo, estoy confundido: suponiendo que la capacitancia paracítica sea inferior a 1 uF, dada una resistencia de 100k Ohmios y suponiendo 0.1uF C parásito, 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 uC pierda eso (bajo el supuesto de que no está sondeando), el codificador generaría pulsos a 40Hz más o menos. ¿Es eso algo de lo que deberíamos preocuparnos?
angelatlarge
La capacitancia parasitaria está típicamente en el rango nano o pico Farad. Esto se convierte en un problema con los codificadores rotativos 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 600Hz con un período de aproximadamente 1.2ms. Esto sigue siendo lo suficientemente lento como para que la extracción de tamaño mínimo sea innecesaria, pero 100kΩgeneraría tiempos de subida y bajada que probablemente no sean aceptables. Esto vale una pregunta por sí solo.
Matt Young
Verdadero y verdadero. Estaba pensando en codificadores rotativos manuales.
angelatlarge
4

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 es 30-80kOhm para reinicio pull-up y 20-50kOhm para todos los demás pines de E / S.

miceuz
fuente
No se puede decir que 100k es adecuado. No hay recibo universal, debe calcular el valor de acuerdo con la MCU y el dispositivo que conduce el pin en el otro lado.
Blup1980
1
La persona que hizo la pregunta especificó un botón. No veo un problema con esta respuesta.
mjh2007
1
  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 a exactamente este tipo de situación. La resistencia es interna al micro y se configura un poco en algún lugar para habilitarla. La única parte externa requerida es solo el botón en sí.

    Otra variante útil a tener en cuenta es para diseños de baja potencia donde el botón podría ser un interruptor que se puede cerrar por 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 para hacerlo demasiado grande. En cambio, enciende el pullup por solo unos pocos µs a la vez para tomar la lectura de un botón. Si marca el botón cada 1 ms y el pullup está activado durante 10 µs, la corriente de pullup promedio se reduce en 100x. Con una resistencia externa, usa otro pin para conducir 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 nuestros dispositivos CMOS actuales, como dsPIC30FXXXX y no para una aplicación de alta potencia?


    Ya he respondido esto extensamente aquí .

Olin Lathrop
fuente
0

¿Mejor que ese diseño simple? Si. Agréguele una tapa y tendrá un simple interruptor de rebote de hardware.

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 un 10k. Este sitio tiene todos los detalles sobre por qué. En resumen, un circuito antirrebote evita que el microcontrolador falsifique el registro de múltiples prensas 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.

Transeúnte
fuente
A las tapas electrolíticas no les gusta estar en cortocircuito. Regularmente uso 100nF, que funciona bien para mis aplicaciones.
jippie
1
@jippie el símbolo era lo que tenía la imagen, pero se necesita una cerámica de 100nf o 0.1uf.
Passerby
3
Este no es un buen circuito antirrebote. Primero, esto solo rebota un descanso, no una marca. Cuando se presiona el botón, la tapa se acorta de inmediato. En segundo lugar, la constante de tiempo de 1 ms es demasiado corta para ser muy útil. En tercer lugar, esto solo debe introducirse en una entrada de disparo Schmidt. A las entradas normales no les gustan las señales de aumento lento. Simplemente deje la tapa y elimine el rebote en el firmware, lo que necesitaría hacer de todos modos incluso con la tapa.
Olin Lathrop
Sí, al hacer que la tapa se acorte de inmediato, pero cualquier recarga debido al rebote se filtra de paso bajo, eliminando cualquier efecto del rebote. Quizás más exactamente, el rebote en make es un mecanismo muy diferente al rebote en break. Sin embargo, un ms es demasiado rápido. No me gusta usar este circuito por varias razones. Sin embargo, si está conduciendo una interrupción con el pin en cuestión, a menudo, la eliminación de errores en el firmware no es la mejor solución. Pasar a un DPST y eliminar el rebote con un flipflop SR es un método bastante bueno para ese caso.
Scott Seidman
0

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. Lamento que parezca aparecer 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 rechazo. También agregaría que el cortocircuito del condensador puede causar una gran oleada de corriente que puede reiniciar el microprocesador si el diseño de la PCB no es realmente bueno. Algunos interruptores necesitan una corriente de humectación para funcionar de manera correcta y confiable y 100k pueden ser demasiado altos para algunos interruptores (especialmente los interruptores de membrana).

Andy alias
fuente