Problema a mas de 32000 rpm.... SOLUCIONADO

Buenas a todos....
Estoy haciendo un cuentarrevoluciones para motores brushless con sensor, aprovechando los sensores hall que trae incorporados..
he aprovechado parte de un código que he encontrado por la red y he añadido la librería servo para controlar la velocidad del motor... y mostrar las rpm y los "grados" del servo en un LCD...
Todo funciona de forma correcta, pero al superar las 32000rpm mas o menos, el valor se vuelve negativo y empieza a restarse...
pense que era por el tamaño de las variables y creo haber solucionado eso pero me sigue pasando....

alguna idea?? pongo el código a continuación ...
Gracias...

#include <Servo.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(4,5,6,7,8,9);
Servo myservo;
const int hallPin=2;
const unsigned long sampleTime=1000;
int potpin = 0;
int val;

void setup()
{
pinMode(hallPin,INPUT);
myservo.attach(3);
Serial.begin(9600);
lcd.begin(16, 2);
lcd.print("initializing");
delay(3000);
lcd.clear();
}

void loop()
{
delay(100);
float rpm=getRPM();
lcd.clear();
displayRPM(rpm);
val = analogRead(potpin);
val = map(val, 0, 1023, 85, 160);
myservo.write(val);

}

int getRPM()
{
long int kount=0;
boolean kflag=LOW;
long int currentTime=0;
long int startTime=millis();
while (currentTime<=sampleTime)
{
if (digitalRead(hallPin)==HIGH)
{
kflag=HIGH;
}
if (digitalRead(hallPin)==LOW && kflag==HIGH)
{
kount++;
kflag=LOW;
}
currentTime=millis()-startTime;
}
float kount2rpm = float(120000./float(sampleTime))*kount;
kount2rpm = kount2rpm/2;
return kount2rpm;
}

void displayRPM(int rpm)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(rpm,DEC);
lcd.setCursor(7,0);
lcd.print("RPM");
lcd.setCursor(12,0);
lcd.print(val);
lcd.setCursor(15,0);
lcd.print((char)223);
}

Efectivamente, parece problema de tamaño de variables, y es que por mucho que hagas las operaciones con float, en la declaración de la función int getRPM() estás diciendo claramente que va a devolver un int. Osea, que estás calculando un float, lo conviertes a int, y después de enviarlo como int lo recibes en otro float (float rpm=getRPM()).
Yo, personalmente trabajaría todas las variables como long. A grandes rasgos:

long rpm=getRPM();
....
long getRPM() {
......
long kount2rpm = 60000 * kount / sampleTime;
// ¿poniendo 60000 en lugar de 120000 no tendria que dividir luego por 2, no?
return kount2rpm;
}

Tienes toda la razón .... Me había ofuscado....
Muchísimas gracias
SOLUCIONADO. ahora funciona perfecto...