Metaconta:
Teniendo Arduino UNO r3, puedo detectar una entrada pulsante con este esquema.
Es un optoacoplador detector de cruces en cero, y el fototransistor conecta el pin a tierra; por lo tanto, el cruce en cero es un flanco de subida (RISING).
Metaconta:
Si me entra hasta 1023 pulsos, que ocurra estas cosas, controlar un motor dependiendo de estos valores.
Eso es relativo al tiempo de espera (periodo) entre muestras de cantidad de pulsos. Lo que serían 1023 pulsos para una frecuencia de muestreo de 1 Hz, en 2 Hz serían 511. Aquí el único valor absoluto sería calcular las RPM, independientemente de la frecuencia y acorde a este (en el cálculo también se tiene que multiplicar por un factor que es igual a la frecuencia de muestreo).
Por cierto, ¿tu método de utilizar micros() para llevar la cuenta del tiempo te funciona?
Recuerda que a 16 MHz la resolución de micros() es de 4 microsegundos, lo que nos puede llevar a resultados más imprecisos a medida que se incrementan las RPM. Si te sobra el timer1, lo podrías usar para muestreos más precisos (con una resolución de 62.5 ns en 16 MHz, para frecuencias de muestreo no menores a 250 Hz).
Ya sea con TimerOne o configurado manualmente, creas una interrupción temporizada con precisión.
Eso sí, tiene una gran desventaja frente a tu método: la "resolución" de las RPM es inversamente proporcional a la frecuencia de muestreo. Dicho en otras palabras: cuanto más rápido mandas a calcular, peor se torna su precisión en bajas velocidades.
Tu método es el más preciso pero hasta cierto punto. No solo por la resolución de micros(), sino porque al acumular el tiempo transcurrido entre cálculos, estás creando un promedio más que la frecuencia absoluta del momento (estás promediando el lapso entre pulsos aunque en realidad no sean uniformes). ¿Tienes problemas de ruido?
Lo tenía en mente que hicieras, es que inmediatamente calcularas las RPM apenas se obtenga el tiempo entre dos pulsos. Si la ISR es lo suficientemente breve, no deberías perder el próximo pulso aún al ejecutar el cálculo.
Para medir el tiempo, de momento sería conformarnos con micros(); pero sé que se puede mejorar utilizando el contador del timer1.
Metaconta:
Con ello quiero que muestra en Arduino, los rpm.
¿Hacia dónde? ¿Puerto serial u otra pantalla?