Medir frecuencia con Arduino

Buenas noches. Soy nuevo en el tema de arduino y programación.
Estoy intentando medir la frecuencia generada por la señal de tacómetro de un ventilador de PC a modo de prueba para luego encarar un proyecto más complicado.
Estoy usando el pin D3 para tomar la señal a través de las interrupciones y calculo el tiempo que transcurre entre una interrupción y otra y con ese valor calculo la frecuencia.
El problema que se me presenta es que al variar la frecuencia frenando el ventilador, esta en el monitor lo hace en saltos de 4 Hz y no entiendo por qué.
La frecuencia obtenida es de alrededor de los 60 Hz.
La placa es Arduino uno.
Les adjunto un print de pantalla del monitor serial.

Estoy usando CHANGE en la interrupción para obtener un valor mas próximo al que voy a utilizar en el proyecto final. La frecuencia real seria la mitad de la obtenida en el monitor.

Desde ya, muchas gracias.
C++:
int sensor = 3;
volatile long tActual= 0;
volatile long tAnterior = 0;
volatile long difTiempo = 0;
int frec = 0;

void setup() {
pinMode(sensor, INPUT);
attachInterrupt(digitalPinToInterrupt(sensor), interrupcion, CHANGE);
Serial.begin(9600);
}

void loop() {
frec = 1000/difTiempo;
Serial.println(frec);
}

void interrupcion(){
tActual = millis();
difTiempo = tActual - tAnterior;
tAnterior = tActual;
}

Sin título.jpg
 
Los ventiladores de PC no dan un pulso por vuelta sino 2 (o eso creo recordar) y por usar change como disparo de la interrupción te multiplica por dos (uno por flanco)....y 2 x 2 es 4 que es el salto que tenes en la medición de frecuencia.

Y si no es así....será parecido (@Scooter dixit)

PD: has mirado la señal del tacómetro??

PD2: estas alimentando el ventilador con tensión baja? No me cierran ninguna de las dos velocidades...
 
Última edición:
Estas leyendo el intervalo en milisegundos y eso te da una resolucion pobre.

Si pasaron 16ms , pues int frec=1000/difTiempo= 62
Si pasaron 17ms , pues int frec=1000/difTiempo= 58
 
Usa micros para tener más resolución.
O cuenta el número de pulsos en un intervalo de tiempo, si no, puede estar fluctuando todo el rato
 
Los ventiladores de PC no dan un pulso por vuelta sino 2 (o eso creo recordar) y por usar change como disparo de la interrupción te multiplica por dos (uno por flanco)....y 2 x 2 es 4 que es el salto que tenes en la medición de frecuencia.

Y si no es así....será parecido (@Scooter dixit)

PD: has mirado la señal del tacómetro??

PD2: estas alimentando el ventilador con tensión baja? No me cierran ninguna de las dos velocidades...

Si, es verdad son 4 flancos por vuelta, esta alimentado con 5 volt para no hacer adaptaciones con la señal ya que era solo para probar.
No tengo acá osciloscopio pero lo tengo con un led y una resistencia pull up y se ve bien el pulso
sacando el calculo de rpm esta girando a 900 rpm aprox.
¿Sabes si la señal es cuadrada? A lo mejor estás captando cosas raras si son pulsos finos.

No tengo el osciloscopio acá en casa pero parecería que si, aunque puede que haya ruido en la señal.
Estas leyendo el intervalo en milisegundos y eso te da una resolucion pobre.

Si pasaron 16ms , pues int frec=1000/difTiempo= 62
Si pasaron 17ms , pues int frec=1000/difTiempo= 58
Usa micros para tener más resolución.
O cuenta el número de pulsos en un intervalo de tiempo, si no, puede estar fluctuando todo el rato


Tienen razón, ahí pruebo y les digo.
 
Última edición:
No tengo acá osciloscopio pero lo tengo con un led y una resistencia pull up y se ve bien el pulso
Pero es que importa la forma de onda por la manera en la que estás contando. Si las ondas no tienen un ciclo de trabajo del 50% las diferencias entre los tiempos van a estar cambiando permanentemente. YO contaría con los flancos de subida o los de bajada, por que tengo la "certeza" de que ocurren dos por vuelta y que el tiempo entre ellos es constante. Entonces ahí si podés estar midiendo tiempo por que no vá a importar que intervalo tomes para la diferencia ya que los dos son iguales.
Si no tenés que actualizar la velocidad en forma constante, podrías medir la diferencia de tiempo entre 10, 20 o 100 y luego dividir. De esa forma estás promediando los errores sobre la cantidad de flancos elegida...
 
Estuve haciendo las pruebas que hablamos y llegue a la conclusión de que el problema esta en que son pocos pulsos por vuelta, al ser tan baja la frecuencia no hay forma de que el calculo de bien. no me sirve el ventilador de pc para la prueba que necesito hacer.
Voy a revolver los cajones a ver si encuentro para adaptar algún otro sensor.

Pero es que importa la forma de onda por la manera en la que estás contando. Si las ondas no tienen un ciclo de trabajo del 50% las diferencias entre los tiempos van a estar cambiando permanentemente. YO contaría con los flancos de subida o los de bajada, por que tengo la "certeza" de que ocurren dos por vuelta y que el tiempo entre ellos es constante. Entonces ahí si podés estar midiendo tiempo por que no vá a importar que intervalo tomes para la diferencia ya que los dos son iguales.
Si no tenés que actualizar la velocidad en forma constante, podrías medir la diferencia de tiempo entre 10, 20 o 100 y luego dividir. De esa forma estás promediando los errores sobre la cantidad de flancos elegida...


Si, es buena observacion, obviamente sin el osciloscopio no hay forma de saber bien pero lo que hice fue frenar el ventilador y girarlo a mano y lo que se ve es que durante 90° el led permanece encendido, 90° apagado, otros 90° encendido y otros 90° apagado. por lo que creo que el ciclo de trabajo esta bastante aproximado al 50%.
 
Atrás
Arriba