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);
}