Tengo una línea tirada a + 5V. Cuando se presiona un botón, debe conectar a tierra la línea después de un retraso de 100 ms. ¿Cómo implementaría tal retraso?
Tengo una línea tirada a + 5V. Cuando se presiona un botón, debe conectar a tierra la línea después de un retraso de 100 ms. ¿Cómo implementaría tal retraso?
OA1 es un comparador de drenaje abierto cuya salida es su línea que se eleva a 5V. El valor de R1 determinará la duración del retraso con valores más grandes que resulten en mayores retrasos. El retraso se puede calcular como t = -ln (.5) * R1 * C1.
Si hay problemas de desaceleración, use un comparador con histéresis (disparador de Schmitt).
Otra forma, quizás mejor, de cambiar el tiempo es cambiar el voltaje en la entrada no inversora. Esto podría hacerse con un DAC para el control digital del tiempo.
Aquí está el circuito:
El resto es firmware.
El pullup pasivo en el pin GP3 está habilitado. Por lo tanto, el pasador baja cuando se presiona el botón y alto cuando no se presiona. El firmware anula esto y pone el resultado en el pin OUT. Dado que el debouncing incluye un retraso, simplemente haga que este retraso sea de los 100 ms deseados.
Normalmente uso 50 ms de demora de rebote, porque es casi el máximo donde los humanos aún sienten que la acción es inmediata. Si desea una demora deliberada, haga que la demora en la eliminación de rebotes sea necesaria.
Mire el botón en cada iteración de un bucle temporizado. Si el estado instantáneo del botón es el mismo que el estado de rebote, reinicie el contador de rebote al máximo.
Disminuye el contador de rebote en cada bucle. Si llega a 0, entonces el último estado de la línea de entrada se convierte en el nuevo estado abonado. Restablecer el contador al máximo.
Ajuste el valor máximo del contador de rebote según las iteraciones de bucle que realice en el tiempo de retraso deseado de 100 ms.
Por ejemplo, digamos que ejecuta el bucle cada desbordamiento del temporizador de ejecución libre 0. Eso es cada 256 ciclos de instrucción, que es cada 256 µs. Se necesitarían 391 iteraciones para llegar a 100 ms. Dado que sería más fácil usar un contador de 8 bits, podría dividir los desbordamientos del temporizador 0 entre 2 (ejecutar el bucle cada segunda vez). Ahora se requieren 195 iteraciones por 100 ms, lo que se ajusta muy bien a una variable de 8 bits.
Como no se proporcionó información de fondo, parece que estamos limitados a un botón, una línea de tierra, un suministro de 5 V y una resistencia de pull-up no especificada. Suponiendo que el circuito se utilizará en la Tierra, podemos usar la gravedad y la distancia para proporcionar un temporizador preciso.
Desde \ $ h = \ frac {1} {2} gt ^ 2 \ $ donde h es la altura, g es la aceleración debida a la gravedad y t es tiempo, y \ $ v = gt \ $, donde v es la velocidad final, podemos calcular que un cuerpo en caída libre viajará 0.04903325m en 100 ms.
Figura 1. Temporizador de gravedad. Al pulsar, la línea de SALIDA se bajará después de 100 ms.
El circuito requiere un reinicio manual.
Puedes usar un circuito monoestable. Por ejemplo, un temporizador 555 se puede configurar en un circuito monoestable. Una vez que se active el disparador, la salida será alta durante un período de tiempo determinado (por ejemplo, 100 ms). Esto se puede utilizar para desarrollar un circuito para sus necesidades. Aparte del temporizador 555, se puede realizar la misma operación utilizando un microcontrolador o dos transistores o puertas lógicas, etc. Se pueden dar más ideas, dependiendo de su interés.
¿Cómo implementaría este retraso?
Dependiendo de su nivel de comodidad.
Un temporizador lo haría todo el día, por ejemplo.
Ese tipo de temporizador se puede hacer con un 555 o su equivalente moderno, un opamp, una puerta lógica o incluso un transistor ...
La otra ruta es una solución digital. Como un mcu.
Una vez más, todo depende de lo que tengas disponible.