Hi
I am trying to output the speed for my motor.
When my motor runs at a higher speed , I get the Speed output as 'inf' once and then continuous 'nan' after around 8000 rpm .
Could you tell me why the Serial is outputting 'nan ' instead of a proper value please.
Please find my code below :
//Arduino master device
#include <Wire.h>
#define TEN (float)10
int sectorFromHall(int hall1, int hall2, int hall3);
int rawHall1 =0 ;
int rawHall2=0;
int rawHall3 = 0;
int h1=3;
int h2=4;
int h3=5;
int previousSector = 6;
int hallSector = 6;
unsigned long time1 = 0;
unsigned long time2 = 0;
float MotorTime = 0;
float motorSpeed = 0.0;
int t=0;
int debugCounter = 0;
float speedFltrd = 0.0;
void setup()
{
Serial.begin(38400);
pinMode(h1, INPUT);
pinMode(h2, INPUT);
pinMode(h3, INPUT);
digitalWrite(h1, HIGH);
digitalWrite(h2, HIGH);
digitalWrite(h3, HIGH);
Wire.begin(); // join i2c bus (address optional for master)
rawHall1=digitalRead(h1);
rawHall2=digitalRead(h2);
rawHall3=digitalRead(h3);
hallSector = sectorFromHall(rawHall1, rawHall2, rawHall3);
previousSector = hallSector;
delay(500);
Wire.beginTransmission(80); // transmit to slave device F2837 #0x50 (decimal is 80)
Wire.write(hallSector);
Wire.endTransmission(); // stop transmitting
}
void loop()
{
previousSector = hallSector;
rawHall1=digitalRead(h1);
rawHall2=digitalRead(h2);
rawHall3=digitalRead(h3);
if(t==0){
t=1;
time1 = millis();
}
hallSector = sectorFromHall(rawHall1, rawHall2, rawHall3);
if(previousSector != hallSector){
time2 = millis();
Wire.beginTransmission(80); // transmit to slave device F2837 #0x50 (decimal is 80)
Wire.write(hallSector);
Wire.endTransmission(); // stop transmitting
MotorTime = (((float)(time2 - time1))) * 0.001; //time in sec
motorSpeed = TEN / MotorTime; //convert to rpm
speedFltrd += (motorSpeed - speedFltrd) * 0.01; //0.01 is filter coefficient
Serial.println(speedFltrd);
t = 0;
}
}
int sectorFromHall(int hall1, int hall2, int hall3)
{
int sector;
if ((hall1 == 0) && (hall2 == 1) && (hall3 == 1))
{
sector = 0;
}
else if ((hall1 == 0) && (hall2 == 1) && (hall3 == 0))
{
sector = 1;
}
else if ((hall1 == 1) && (hall2 == 1) && (hall3 == 0))
{
sector = 2;
}
else if ((hall1 == 1) && (hall2 == 0) && (hall3 == 0))
{
sector = 3;
}
else if ((hall1 == 1) && (hall2 == 0) && (hall3 == 1))
{
sector = 4;
}
else if ((hall1 == 0) && (hall2 == 0) && (hall3 == 1))
{
sector = 5;
}
else
{sector = 6;
}
return sector;
}