Compter les RPM Fan Noctua

Bonjour, j'ai fait l'acquisition d'une carte Einsy Rambo pour une de mes imprimantes 3D.
Je voulais intégrer la lecture des comptes tour ventilo d'un Noctua 5V dans le FW Marlin qui ne le contient pas, et pouvoir avoir un retour du bon fonctionnement de ce ventilo silencieux qui est indispensable.
J'arrive à lire les comptes tours "sans soucis" à plein régime en ayant copié des bouts de code dans le FW Prusa et en les modifiants:

int fan_edge_counter;
int fan_rpm;
#define FAN_PULSE_WIDTH_LIMIT ((SpeedFan > 100) ? 3 : 4) //Marlin_main.cpp
int PinFan = 6;
int SpeedFan = 255;
unsigned long t_fan_rising_edge;
unsigned long timeold;

void setup() {
	  pinMode(PinFan , OUTPUT); 
     Serial.begin(9600);

//Marlin_main.cpp	 
//INT7
  DDRE &= ~(1 << 7); //input pin
  PORTE &= ~(1 << 7); //no internal pull-up

  //start with sensing rising edge
  EICRB &= ~(1 << 6);
  EICRB |= (1 << 7);

  //enable INT7 interrupt
  EIMSK |= (1 << 7);
  
}
void loop(){
   analogWrite(PinFan,SpeedFan);

//Temperature.cpp
if (fan_edge_counter >= 100){
  //fan_rpm = (fan_edge_counter* (float(250) / (millis() - timeold))); // Prusa FW Float(250) ???
  fan_rpm = 30*1000/(millis() - timeold)*fan_edge_counter; // Playground Arduino 30*1000 > Half = Moitié, donc un demi tour, 30 est la moitié d'une seconde....millis = 1000 seconde > OK
  //fan_rpm = (60*fan_edge_counter)/(millis() - timeold); // Fonctionne pas ? 

  timeold = millis();
  fan_edge_counter = 0;
  Serial.println(fan_rpm);
}

//Serial.println(fan_edge_counter,DEC);
}
// The fan interrupt is triggered at maximum 325Hz (may be a bit more due to component tollerances),
// and it takes 4.24 us to process (the interrupt invocation overhead not taken into account).

//Marlin_main.cpp
  ISR(INT7_vect) {
  //measuring speed now works for fanSpeed > 18 (approximately), which is sufficient because MIN_PRINT_FAN_SPEED is higher

  if ((1 << 6) & EICRB) { //interrupt was triggered by rising edge
    t_fan_rising_edge = millis();
  }
  else { //interrupt was triggered by falling edge
    if ((millis() - t_fan_rising_edge) >= FAN_PULSE_WIDTH_LIMIT) {//this pulse was from sensor and not from pwm
      fan_edge_counter += 1; 
    }
  } 
  EICRB ^= (1 << 6); //change edge
}

Le soucis c'est que quand je descend le ventilo en PWM les RPM descendent drastiquement et j'ai pas l'impression que les tours soient bons, donc je pense que le calcul des impulsions fausses n'est pas bien faite (ou bien convertis...).
Donc comment calculer ça:

#define FAN_PULSE_WIDTH_LIMIT ((SpeedFan > 100) ? 3 : 4)

car pour moi c'est ça qui fausse les calculs...

Einsy Rambo Schematic

j'ai pas regardé en détail mais:

  • il ne me semble pas une bonne idée que d'utiliser des int. partez sur des unsigned int, voire des unsigned long pour éviter d'éventuels problèmes de débordement lors des calculs

  • je vois des interruptions mais pas de variable volatile donc ça peut introduire aussi des soucis