¿Es posible usar solo un capacitor para hacer rebotar un botón?

Me he estado preguntando: ¿por qué no puedes simplemente conectar un condensador a un botón para que rebote? He estado averiguando cómo reducir el trabajo que tiene que hacer mi microprocesador, pero tengo un espacio muy limitado en una PCB que estoy diseñando, así que no quiero hacer un circuito de rebote completo que complicaría el diseño.


esquemático

simular este circuito : esquema creado con CircuitLab


Ese es un circuito de ejemplo; perdón por cualquier error (no soy bueno diseñando circuitos con capacitores). ¿Funcionaría esto? Para el cambio de dirección, no pude encontrar uno que coincida con lo que es en la vida real, pero funciona para esta situación. El botón es como el que se encuentra aquí . D10significa Digital Pin 10, pero no importa; solo significa la entrada de Arduino. Tampoco sé qué tamaño de condensador necesitaría, así que si este circuito funciona, ¿qué tamaño necesito?


Una vez más, solo estoy tratando de simplificar esto para que sea más fácil de construir sin tener que eliminar el rebote del software. Al observar cómo funcionan los condensadores, parece que funcionaría, pero también podría hacer que el botón se presione más tiempo/retraso si la capacitancia es demasiado grande. Se usan comúnmente para "suavizar" el ruido en las fuentes de alimentación, entonces, ¿no es algo similar donde "suaviza" el rebote? Cualquier modificación del circuito para que funcione (si es necesario) también sería apreciada.

Aquí es donde lo hemos discutido antes: electronics.stackexchange.com/questions/6884/…
¿Se da cuenta de que puede eliminar el rebote de una entrada simplemente sondeándola con un intervalo de al menos 50 ms? Menos trabajo que hacer para tu aduino :)
50 milisegundos serían suficientes - buen punto Sr. O
@Andyaka Vi eso, pero era si usar hardware o software, no cómo usar las partes mínimas, pero hay algunos puntos buenos allí.
@WoutervanOoijen Entonces, ¿quiere decir que cuando detecta un "alto", luego hace delay()50;y luego hace lo que necesita hacer? (Iluminar LED, etc.)
No, me refiero a sondear con un intervalo de al menos 50 ms y hacer lo que sea necesario según el nivel que detecte.
@AnnonomusPerson: un retraso () en un entorno de un solo subproceso significa que no puede suceder nada más. Si bien esa es una opción, otra es hacer otro trabajo útil hasta que llegue el momento de verificar nuevamente.
Estoy de acuerdo con la respuesta de Wouter: solo verifique el interruptor cada ~ 50 ms. Sin embargo, creo que su circuito anterior funcionaría mejor si la resistencia estuviera entre el interruptor y el capacitor, entonces es un circuito RC y puede calcular la constante de tiempo para obtener un buen rebote.

Respuestas (3)

Depende de cuál sea el estado predeterminado del interruptor. Un capacitor solo se cargará cuando le des un voltaje positivo. Por lo general, en un entorno integrado, usamos un pull-up para dar a un pin un estado alto predeterminado y vincular el interruptor a tierra. Agregar un capacitor no ayudará aquí, porque no "almacenará" el estado fundamental.

Sin embargo, también puede utilizar un menú desplegable. Esto significaría que el pin es bajo por defecto. Ponerlo alto presionando el interruptor, cargará el capacitor. Después de soltarlo, el capacitor mantendrá el pin alto por un tiempo, así que sí, esto funcionaría. No estoy seguro de si 1uF es suficiente, muy poco o demasiado, te recomiendo que mires con un visor y lo pruebes un poco.

Entonces, si cambié el +y el -¿funcionaría?
@AnnonomusPerson depende. ¿Cuál es el estado predeterminado del interruptor?
¿Quiere decir que cuando no se presiona si conduce la electricidad? Si eso es lo que quiere decir, puedo hacerlo de cualquier manera debido a la naturaleza del interruptor que estoy usando. Mirando el enlace en mi pregunta, cuando no se presiona, el botón conduce desde top left to the bottom lefty the top right to the bottom right. Cuando se presiona, conduce desde top left to the bottom right, y top right to the bottom left.
Bueno. Esto significará que, de forma predeterminada, desea que el pin sea bajo. El interruptor debe hacer contacto con +, de modo que el condensador se cargue antes de soltar el botón.
Lo siento, estoy confundido ahora. ¿Dijiste que quieres que el pin esté bajo de forma predeterminada (lo cual entiendo cuando no se presiona) pero debería hacer contacto con + (lo que significa que debería salir alto cuando no se presiona)? ¿No son dos declaraciones diferentes o estoy leyendo esto mal? Una cosa más: ¿están la resistencia y el condensador en el lugar correcto? Esa era una de mis mayores dudas de por qué esto no funcionaría.
@AnnonomusPerson No, el interruptor debe hacer contacto con +. Es un poco la jerga de a qué se conectará el interruptor cuando se presione . El condensador está en el lugar correcto. La resistencia estaría mejor conectada desde tierra al pin IO directamente.
¿Cuál sería el problema de usar una resistencia entre la salida del interruptor y el capacitor? Cuando se presiona el interruptor, cargará lentamente el capacitor, cuando no se presione, lo descargará lentamente. El efecto de los rebotes de corta duración estaría limitado por la resistencia.

Creo que la respuesta aceptada decía que solo puede usar un truco RC para eliminar el rebote de un interruptor que está atado a bajo, pero creo que eso no es cierto. Puedes hacerlo por alto también. Aquí están los esquemas. Existe una verdadera Biblia antirrebote que recomendaba los siguientes esquemas:

RC antirrebote, R1 conectado a alto, accionando el interruptor lo pone a tierra.  Sin embargo, hay un capacitor paralelo al interruptor a tierra y un R2 que conecta el interruptor al capacitor y la puerta lógica que desea alimentar.  Aquí se muestra un inversor, pero podría ser un búfer o cualquier entrada de puerta lógica.

RC antirrebote, R1 conectado a alto, accionando el interruptor lo pone a tierra. Sin embargo, hay un capacitor paralelo al interruptor a tierra y un R2 que conecta el interruptor al capacitor y la puerta lógica que desea alimentar. Aquí se muestra un inversor, pero podría ser un búfer o cualquier entrada de puerta lógica.

Cuando C está completamente cargado y acciona el interruptor, la carga se drenará a través de R2, con suerte hasta que el interruptor se haya asentado antes de alcanzar el nivel bajo lógico en la entrada.

Cuando C está completamente descargado y abre el interruptor, C se cargará a través de R1+R2 hasta que se alcance el nivel lógico alto.

Dado que el nivel alto lógico TTL normal a 2 V es relativamente bajo en comparación con el nivel bajo lógico de 0,8 V, tiene sentido que R1+R2 haga que el tiempo de carga sea más largo que el tiempo de descarga solo a través de R2.

El uso de una entrada de disparador Schmitt llevaría la lógica a un nivel alto de 4 V (que algunas fuentes podrían ni siquiera alcanzar de manera confiable, pero un interruptor lo haría).

Probaré esto ahora en mi tablero y mi alcance (analógico). Espero poder ver los rebotes en el canal 1 para disparar, y espero poder verlo sin que sea un alcance de almacenamiento. Pero también puedo usar un contador de 4 bits 74LS161 para capturar rebotes. Y he aquí que tengo tanto el inversor hexagonal 74LS04 TTL como el inversor hexagonal 74LS14 Schmitt-trigger a mano para jugar.

Actualización: resultados experimentales

Como no tengo un osciloscopio de almacenamiento digital, no podría usarlo en absoluto. En su lugar, utilicé un contador 74LS161 con 4 LED y solo me aseguro de que cada accionamiento del interruptor cuente exactamente un incremento.

Puedo ver claramente el rebote del interruptor. Entonces, la línea de base es positiva, lo que significa que podré saber cuándo serán efectivas mis contramedidas.

No pude encontrar una combinación de R1, R2 y C que funcionara cuando tengo una entrada TTL normal en el 74LS04. Sin embargo, con una entrada de disparador Schmitt del 74LS14, tengo una configuración bastante buena cuando R1 y R2 tienen 1 kΩ y C = 1 μF o mejor, incluso 4,7 μF. Obviamente, también depende del interruptor.

Encontré algunos interruptores de botón de goma que tenían una resistencia interna demasiado alta para que no bajaran el voltaje de entrada lo suficiente. Con dos interruptores de calidad moderada, conté varias ejecuciones de 16 y solo tuve algunos fallos con 100 nF, 1 μF y ninguno con 4,7 μF.

Con la entrada TTL normal no pude hacerlo funcionar.

Sin embargo, si su entrada es un Arduino, es posible que desee volver a verificar que, de hecho, sus entradas digitales pueden ser disparadores Schmitt, por lo que podría hacerlo bien con R1 y R2 son 1 kΩ y C = 1 μF y posiblemente incluso 100 nF.

Finalmente, después de una mayor experimentación e investigación frustrantes, concluyo que en niveles normales de TTL es simplemente imposible usar el método RC para eliminar el rebote. Y no importa si atas tu interruptor alto o bajo.

Necesita un disparador Schmitt para hacer esto. Dudo que incluso CMOS funcione.

Aquí hay un video corto de TI (deberían saberlo) que dice que necesita el inversor de activación Schmitt aquí.

Y aquí hay un circuito alternativo con un disparador Schmitt , que es aún más interesante ya que no requiere ningún condensador.

ingrese la descripción de la imagen aquí

Sin embargo, lo probé y descubrí que no funciona. Simplemente no funciona.

El mismo libro blanco también ofrece una solución con dos inversores y sin resistencia ni condensador de ningún tipo, solo requiere un botón de dos posiciones.

ingrese la descripción de la imagen aquí

Lo he probado y tampoco funciona de esta forma mágica. Casi funciona, pero sigo teniendo doble actuación con mucha más frecuencia que con el disparador RC 1k/1k/100nF y Schmitt. Además, si utilizo esta configuración de doble inversor con el inversor disparador Schmitt 74LS14, no funciona mejor. Así que simplemente no funciona, punto.

Buena actualización. Estoy usando un interruptor de botón para controlar un contador de 4 bits 74HC393 y la única forma en que he podido eliminar el rebote correctamente del interruptor hasta ahora es usando un inversor disparador Schmitt (74HC14) con un capacitor de 100 nF en el interruptor.

"así que no quiero hacer un circuito antirrebote en toda regla que complicaría el diseño".

Realmente no entiendo por qué lo hiciste tan complicado o crees que es tan complicado. No menciona qué tipo de MCU está usando, sin embargo, puedo ver que es un Arduino. Puedes hacerlo por software input( pin, INPUT_PULLUP );(para que no necesites ningún componente externo) o puedes usar una resistencia pullup o pulldown (SMD es muy pequeña) de 10K a GND o 5V, es lo que prefieras usar.

Lo único que tiene que hacer es leer un valor de la entrada con una tasa de rebote en ms, usar millis()para esto (¡no usar delay()!) y usarlo en la función loop(). Esto es maní para cada Arduino.

Por ejemplo:

circuito

#define BTM_PIN_BTN_BT_POWER               10 // Tactile switch to power on/off/
#define BTM_POW_BTN_DEBOUNCE               200 // in ms
//#define BTM_POW_BTN_NO_WAIT              // uncomment if you don't want to wait for a release   

bool getPowerButtonPressed() // I dunno if your button is power, this is just an example
{
  static uint32_t iDebounceTime = millis();
  bool bResult = false;

  if( millis()-iDebounceTime >= BTM_POW_BTN_DEBOUNCE )
  {
    #ifndef BTM_POW_BTN_NO_WAIT 
    while( digitalRead( BTM_PIN_BTN_BT_POWER ) == HIGH )
    {
      bResult = true;
    }
    #else
      bResult = ( digitalRead( BTM_PIN_BTN_BT_POWER ) == HIGH ); 
    #endif
    
    iDebounceTime = millis();
      
}  
  
  return bResult;
}


void loop()
{
  if( getPowerButtonPressed() )
  {
    // do something
    
  } 

  // other code
  .....
  .....
}

¡Eso es!