Misurare la velocità di rotazione

Ciao a tutti
devo misurare la velocità di rotazione di un albero in giri/min per tarare un variatore di velocità
Sul forum ho trovato questo link

ho costruito il disco con 12 fessure montato sull'albero che permette il passaggio di IR e cablato l'elettronica su una millefori
ho copiato e modificato il software

/*
	Author: Chris @ PyroElectro.com
	Date: 8/26/2012
	Description:
	This project is meant to capture interrupt counts from an IR breakbeam circuit
	and display them as an RPM number on a 16x2 LCD module.
	
	Full Project Details:
	http://www.pyroelectro.com/tutorials/tachometer_rpm_arduino/
*/

#include <LiquidCrystal.h>
LiquidCrystal lcd(3, 5, 9, 10, 11, 12);

volatile float time = 0;
volatile float time_last = 0;
volatile int rpm_array[5] = {0,0,0,0,0};
int rpm = 0;

void setup()
{
  //Digital Pin 2 Set As An Interrupt
 attachInterrupt(0, fan_interrupt, FALLING);

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Current RPM:");
}

void loop()
{
  
  
  while(1){    

     //Slow Down The LCD Display Updates
  delay(400);
  
  //Clear The Bottom Row
  lcd.setCursor(0, 1);
  lcd.print("                ");   
  
  //Update The Rpm Count
  lcd.setCursor(0, 1);
  lcd.print(rpm);   

  ////lcd.setCursor(4, 1);
  ////lcd.print(time);   

  //Update The RPM
  if(time > 0)
  {
    //5 Sample Moving Average To Smooth Out The Data
      rpm_array[0] = rpm_array[1];
      rpm_array[1] = rpm_array[2];
      rpm_array[2] = rpm_array[3];
      rpm_array[3] = rpm_array[4];
      rpm_array[4] = 60*(1000000/(time*12));    
    //Last 5 Average RPM Counts Eqauls....
      rpm = (rpm_array[0] + rpm_array[1] + rpm_array[2] + rpm_array[3] + rpm_array[4]) / 5;
  }
 
 }
}

void fan_interrupt()
{
   time = (micros() - time_last); 
   time_last = micros();
}

Nelle prove pratiche ottengo un valore coerente con la velocità, ma quando fermo il motore per variare la velocità ottengo valori sballati tipo -12769 e anche se riparto alla stessa velocità non riottengo valori coerenti anche premendo reset
Se interrompo l'alimentazione riottengo al primo avvio risultato buono poi sballa.

Il disco che ho preparato ha 12 fessure in maniera che il pin 2 di arduino riceve 12 impulsi a giro e genera 12 interrupt
Però il prg che ho copiato lavora su microsecondi di tra un inpulso e l'altro, se ho capito bene

cosa potri fare?
Franco

Dipende dalla velocitá di rotazione: la misura del tempo tra 2 impulsi é piú preciso e veloce che misurare il numero di impulsi in un dato tempo.

Quel codice mi lascia un po perplesso:

void loop()
{
while(1){
...
}
}

Il while non ha nessun senso. Giá il loop() da solo viene ripetuto all'infinito.

I -12769 derivano da un overflow della variabile di tipo int. metti una variabile long al posto del int. Puoi anche definire che un tempo massimo venga visualizzato come rpm zero.

rpm_array[4] = 60*(1000000/(time*12));

fai il calcolo a priori senza dover calcolare i valori costanti ogni volta.

rpm_array[4] = 5000000/time);

Non capisco perché non dovrebbe arrivare alla stessa lettura dopo uno stop del motore.

Ciao Uwe