Pierdo resolucion al medir rpm

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
// **************

Ese código, así como lo has copiado no compila y no se entiende porque está traducido al español. :grin:

MaximoEsfuerzo muchas gracias.

ya corregi.
I already corrected.
por favor diganme todos los foros debe estar en ingles?
Please tell me all the forums should be in English?


    // 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
// **************

En el foro en español, solo español, por favor.

Las sentencias del código siempre están en ingles porque el lenguaje C así fue diseñado, sea el foro que sea.

Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.