cordial saludo, ya he consultado sobre temas de rpm pero ahora estoy tratando de realizar la lectura "RPM" cambiando el numero de ranuras del disco que lee el control optico (creeria que si mas ranuras mejor resolucion).
cuando lo hago con 1 ranura(1pulso) funciona perfecto pero al hacerlo con 2 ranuras (2 pulsos ) la lectura varía demasiado, el disco ranurado tiene originalmente 8 ranuras (8pulsos) pero asi mas se enloquece la lectura. ¿Qué podría estar pasando, influye la velocidad del puerto serie para leer rpm? la coloco a 9600 ya 115200 y trabaja igual tambien cambia el retardo y tampoco cambia. gracias de antemano por las sugerencias.
el codigo de este ejemplo es original de Autor: Nick Gammon
// Frequency timer
// Author: Nick Gammon
// Date: 10th February 2012
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// variables para lectura RPM
volatile boolean first;
volatile boolean triggered;
volatile unsigned long overflowCount;
volatile unsigned long startTime;
volatile unsigned long finishTime;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// here on rising edge
void isr ()
{
unsigned int counter = TCNT1; // quickly save it // guardalo rapidamente
// wait until we noticed last one
if (triggered) // si es true sale de la funcion - si es false sigue
return;
if (first)// si es true toma la lectura actual y lo pone a falso para que no vuelva a entrar y sale de la funcion / si es false sigue
{
startTime = (overflowCount << 16) + counter; //guarda el primer valor
first = false;
return;
}
finishTime = (overflowCount << 16) + counter; // guarda el ultimo valor
triggered = true; // lo pone a true para garantizar que (triguered) no vuelva a entrar a la interrupcion y que entre al loop
detachInterrupt(0); //detiene las interrupciones
}
// end of isr
// timer overflows (every 65536 counts)
ISR (TIMER1_OVF_vect)
{
overflowCount++; //cada que TIMER1 llegue a 65535 overflowCount++ aumenta 1
} // end of TIMER1_OVF_vect
void prepareForInterrupts ()
{
// get ready for next time - prepárate para la próxima vez
EIFR = _BV (INTF0); // clear flag for interrupt 0
first = true; // habilita la primera lectura
triggered = false; // re-arm for next time //permite que entre a la interrupcion
attachInterrupt(0, isr,RISING); // habilita la interrupcion - lee sensor hall de 1 a 0 (pull up)
}
// end of prepareForInterrupts
void setup ()
{
Serial.begin(115200);
//Serial.println("Frequency Counter");
//pinMode(MOSFET, OUTPUT); // Asigna el pin del led como salida
//pinMode(led, OUTPUT);
//pinMode(encendido, INPUT);
// reset Timer 1
TCCR1A = 0;
TCCR1B = 0; // timer1 sin preescaler 0 - 65536
// Timer 1 - interrupt on overflow
TIMSK1 = _BV (TOIE1); // enable Timer1 Interrupt // habilita interrupcion
// zero it
TCNT1 = 0;
// start Timer 1
TCCR1B = _BV (CS10); // coloca a 1 CS10
// set up for interrupts
prepareForInterrupts ();
}
// end of setup
void loop ()
{
//Serial.println ("in loop ");
//xxxxxx DISPARO DEL SENSOR HALL xxxxx
if (!triggered) // no pasa hasta que no sea true, y sigue preguntando hasta que haga la segunda lectura
return;
unsigned long elapsedTime = finishTime - startTime;
float freq = 4.0 / ((float (elapsedTime) * 62.5e-9)); // each tick is 62.5 nS
// Serial.print ("Took: "); //tics
// Serial.print (elapsedTime); // tiempor transcurrido: finishTime - startTime;
// Serial.print (" counts. ");
// Serial.print ("Frequency: ");
Serial.println (freq /2* 60, 0);
Serial.println (freq* 60);
// Serial.println (freq);
// Serial.println (" Hz. ");
// so we can read it //para que podamos leerlo
delay (500);
prepareForInterrupts ();
}
// end of loop
// **************