Duda sobre RPM

Hola a todos, me estoy liando con un medidor de rpm. Tengo un alternador que tiene una salida que me tira pulsos. Lo tengo conectado en el pin 5 como entrada y utilizo el comando pulseIn para leer los pulsos y mostrarlos en la tv.
El problema que tengo es que tira valores muy erráticos cuando supera una cierta velocidad, el motor cuando prende va a 800 RPM que más o menos muestra ese resultado, pero cuando voy acelerando el motor comienza a fallar, muestra 1200, 0, 7 y así todos números random.
como el programa es muy grande dejo para descargar.
mas o menos el codigo de pulsos es asi:

unsinged long Valor_1
unsinged long valor_t
unsinged long RPM

void setup(){
pinMode(5,INPUT);

void loop(){
Valor_1 pulseIn(5,HIGH);
valor_t=valor_1*2;
RPM=(2.0*2400)/(Valor_1);
}

prueba_para_finalizar_4.ino (8.13 KB)

Deberías tener un osciloscopio o algo, porque la verdad no tengo idea si con medir el ancho de un pulso se puede calcular la frecuencia (y por ende las RPM).

Si tan solo supiera exactamente cómo funciona dicha señal, quizá te podría dar una idea de cómo mejorar las mediciones.
Mi duda es si la señal es una onda cuadrada de frecuencia o ciclo de trabajo variable, o si es simplemente una onda senoidal semi-rectificada.

PD: obtener las RPM de un motor mediante su alternador, podría no ofrecer la mejor precisión

Yo lo haría con interrupciones. Ten en cuenta que el Arduino tiene muchas más cosas que hacer, a parte de esperar por el pulso. Puede que "llegue tarde" a leer el pulso y lo pille "ya empezado", con lo que medirá menos tiempo del debido. Mejor una interrupción que salte cuando pasa a nivel alto la señal y lo que haces es medir el tiempo entre flancos de subida. Y si te da uno por revolución ya tienes el tiempo que tarda en cada vuelta. Mides los micros() que han pasado desde la interrupción anterior (para ello guarda siempre el valor que te dio micros() la vez anterior), calculas las RPM y la guardas en una variable y a esperar a que vuelva a saltar la interrupción. Ten en cuenta que si el motor se para, se quedará con el último valor calculado y puede que sea una o más RPM en lugar de cero.

Si decides hacerlo con interrupciones, no te olvides de declarar volatile las variables que uses dentro de la interrupción.

Acá tienes como hacerlo, Reading FAN RPM

acá otro hilo muy util

Todo aparece si buscas : Arduino RPM interrupts