beaucoup plus simple.
Tu récupères le signal PMH ( impulsion entre +-4 et +-12). Tu redresses avec une diode, puis un pont de résistances pour amener la tension en dessous de 5V.
Tu conditionnes avec un transistor pour avoir un beau signal carré. et tu rentres dans la broche D2 sous interruption, montante ou descendante.
Il te reste à mesurer le temps sur quelques déclenchements ( j'en prends 8), et tu as tes tr/mn.
// variables pour la routine d'interruption & le calcul des tr/mn (RPM)
volatile unsigned long front_precedent_uS = 0;
volatile float temps_entre_fronts_descendants_uS= 0.0;
volatile int tick=0;
float RPM = 700.0, previous_RPM = 700.0; // cette valeur basse permet de détecter l'absence d'info compte-tour.
//à mettre dans "setup"
front_precedent_uS = micros(); // on initialise ici la référence de "temps zéro" utilisée par la routine d'interruption -> 0 = broche D2
attachInterrupt(0, falling, FALLING); // MISE en ROUTE de la routine d'interruption qui calculera les tr/mn
// à mettre dans "loop"
// CALCUL des TR/MN (RPM) dont on a besoin pour corriger le MAF. en micro-secondes donc pour 750tr/mn = 12,5Hz = 50 /4. 50Hz = 20ms donc RPM = (15 000 000 / temps micros)
v = double ( (15000000.0 / temps_entre_fronts_descendants_uS) ); // temps_entre_fronts_descendants_uS donne le temps en micro-secondes entre deux interruptions
if (v > 6000.0) v = 750.0; // il y a eu une erreur de mesure ( et donc des IT très rapprochées !) .On affiche un RPM de 750 juste sur le graphe
else if (v<600.0) v = 600.0; // et on ne modifie donc pas la variable RPM, qui contient donc l'ancienne mesure. Ainsi, pas de souci avec le MAF
else
{
previous_RPM = RPM; // on retient la valeur précédente,
RPM = float (v); // et on met à jour la mesure courante
}
// Et enfin ... la routine sous interruption
void falling() {
// sur front descendant à 750tr/mn (12,5Hz) avec 4 bossages, la fréquence lue est donc de 50Hz, soit une récurrence de 20ms.
// à 3000tr/mn (50 Hz ) avec 4 bossages, la fréquence lue est donc de 200Hz, soit 5ms. assez rapide donc
// 8 déclenchements représentent donc entre 40ms(3000RPM) 60ms(2000RPM) et 160ms(750 RPM) Cela suffit. On garde le CPU pour autre chose....
unsigned long x = micros(); // on prend note, en premier, du temps courant, correspondant à l'IT
tick++; // et donc, nous avons eu un front de plus
// pas besoin de masquer l'interruption. Car le calcul suivant est très rapide... Mais on aurait pu...
if (tick>=8) // 8 fronts, alors le moment est venu de calculer les RPM. Attendre 8 fronts successifs permet de lisser la mesure. un peu bruitée au ralenti...
{ unsigned long duree;
if (x> front_precedent_uS ) duree = x - front_precedent_uS; // attention, micros() revient à zéro toutes les 70 minutes. on le prend en compte juste dessous
else duree = 4294967295 - front_precedent_uS + x;
temps_entre_fronts_descendants_uS = float ( (duree*1.0) / (tick*1.0)) ; // on calcule le temps moyen entre chaque déclenchements de l'IT, soit 7,5ms environ à 2000tr/mn.
front_precedent_uS = x; // on retient le temps du dernier front pour le prochain calcul
tick=0; // et enfin on ré-initialise le compteur de fronts
}
}
Dernières choses :
1/ ATTENTION DE LAISSER LA BUTEE, même dévissée, car elle empêche les aubes de toucher les parois en cas de problème de vide.
2/ la meilleure gestion de la GV n'est PAS LINEAIRE.
On ouvre les aubes lentement au début, pour permettre à la turbine de prendre de la vitesse.
On ouvre ensuite plus rapidement jusque environ mi-ouverture, car c'est avec une demi-ouverture que le turbo GV a la meilleure efficacité
A l'approche de la pression max de consigne, on ouvre les aubes plus rapidement pour réguler sur la pression max
Enfin, oui, l'ECU gère les aubes en haut des tours pour avoir 4V max d'air sur le débitmètre. C'est aussi pour cela qu'il faut s'en affranchir.