entrada de pulsos

buena snoches recurro a foro para solicitar una colaboracion..... mi caso es que debo recibir por el mismo pin entrada varia de pulsos y segun la cantidad de pulsos debo generar otros y la verdad no se como condicionar las 6 opciones que debo generar ejemplo

entrada 1 pulso salida 20 entrada 2 pulsos salida 40 entrada 5 pulsos salida 100 entrada 10 pulsos salida 200 entrada 20 pulsos salida 400 entrada 50 pulsos salida 1000

de antemano muchas gracias x la atencion prestada..

Multiplica por 20 todo lo que recibas y genera una frecuencia múltiplo de la de entrada. Como lo haces? Con Timers o usando alguna librería que genere frecuencias simplemente indicandole lo que tenga a la entrada.

Puedes contar pulsos en una unidad de tiempo determinada, digamos 1 segundo. Si en 1 segundo tienes 1 o N pulsos, esa será tu frecuencia de entrada. Luego eso debes traducirlo a algo que tenga 20 veces mas repeticiones. Entonces si tienes una Frecuencia X de entrada. Te manejas con el periodo que es su inversa. Una frecuencia de 1 pulso x segundo o 1 pulso/seg es 1 Hertz y su período es de 1/F o 1 segundo.

una frecuencia de 20 Hertz el multiplo para tu primer caso tendrá un T (período) de = 1/20 hertz = 0.05 seg = 50 mseg ahora en 50 mseg debes tener un pulso HIGH y otro low asi que nada mejor que dividir a la mita y tener 25mseg en HIGH y 25 mseg en LOW.

Y ahi tienes tu frecuencia de 20 Hz. Eso lo haras asi

digitalWrite(pin, HIGH)
micros(25000); // uso micros y no millis porque las siguientes serán cada vez números menores
digitalWrite(pin, LOW);
micros(25000);

Este fragmento de código generará 20Hz a tu salida.

Si la entrada fuera de 50 pulsos debes generar algo de 1000 Hz con periodo 1mseg o sea un pulso high durante 500 useg y otro LOW durante 500 useg

digitalWrite(pin, HIGH)
micros(500); // uso micros y no millis porque las siguientes serán cada vez números menores
digitalWrite(pin, LOW);
micros(500);

con esto lo harías.

El código para todo esto no permite que existan delay() y ya la generación de esto se verá afectada por la necesidad de que en algun momento debes dedicar tiempo a que lea que esta entrado como frecuencia de entrada. Si miras en un osciloscopio lo realizado verás que tu señal no será perfectamente como te acabo de decir pero si aproximada. Podrías compensar el tiempo que involucre leer que frecuencia esta entrando y dejar por ejemplo mas corto el tiempo en LOW que es el ultimo que se realiza.

Estas cosas se resuelven usando TIMERS que trabajan sin prestarle atención a los demás eventos. El TIMER es un dispositivo disponible en un Arduino (tiene 3 como minimo) y puedes lograr las frecuencias con mayor precisión independiente del proceso de lectura de la frecuencia de entrada.