Bonsoir,
Je précise que je suis assez novice pour faire du code Arduino.
Mon projet qui fonctionne en partie, est d'enregistrer dans un tableau OpenOffice Calc des temps d'injection et les avances à l'allumage d'un calculateur d'injection allumage moto très peu utilisé, et sans logiciel de communication malheureusement (j'ai cherché longtemps). Je simule grace à un Nano et ArduStim les impulsions du volant moteur (capteur vilo) et de l'arbre à cames (capteur de Phase). J'arrive avec mon logiciel et un autre Nano, par pas de régime moteur et d'ouverture des gaz, à enregistrer les temps d'injection, ainsi que le temps de charge bobine d'allumage, la tension batterie, par contre les avances à l'allumage sont totalement erronées.
Après de nombreux essais je m’aperçois qu'en utilisant micros() entre le moment d'allumage (All) et le point mort haut du cylindre Avant (PMHAvant) (0° du moteur) j'ai toujours 8 us au lieu de 540 us (vérifié à l'oscilloscope) par exemple. J'ai du coup utilisé pulseIn sur l'info et j'ai bien 540 us. L'info Allumage et PMH sont pontés pour le moment pour essai sur table avec Ardustim sans le calculateur d'injection allumage. Mais après ça sera bien 2 infos séparées indépendantes.
Donc actuellement une impulsion arrive qui dure 540 us, PulseIN la mesure bien, mais si j'utilise micros j'ai 8 us. (digitalRead(ALL) == HIGH etc.).
Très étrange pour moi !
Merci d'avance pour votre aide.
une partie du code
void CalculAvanceAllumage() { // Calcul avance à l'allumage
for (AvAllumage = 0, k = 0; k < NbBoucle ; k++) // boucle de mesures
{
// TempsPhaseOn = pulseIn(CAPTPHASE, HIGH); // Mesure la durée de l'impulsion haute du capteur de Phase
// TempsPhaseOff = pulseIn(CAPTPHASE, LOW); // Mesure la durée de l'impulsion basse du capteur de Phase
// TempsParTour = ((TempsPhaseOn + TempsPhaseOff)/2); // Calcul temps par tour avec capteur de phase = (état haut + état bas) / 2
TempsParTour = ((pulseIn(CAPTPHASE, HIGH) + pulseIn(CAPTPHASE, LOW))/2); // Calcul temps par tour avec capteur de phase = (état haut + état bas) / 2
// Serial.print(TempsParTour); // Essai Envoyer Temps par tour
// Serial.print(","); // Essai case suivante
// if (digitalRead(ALL) == LOW); // Si l'allumage passe à 0 V (début de charge bobine)
// {Allumage = 1; } // Allumage passe à 1
// if (digitalRead(ALL) == HIGH && Allumage == 1); // Si allumage est à 1 et que l'entrée ALL passe au niveau haut = moment de l'allumage
// {TempsAll = micros(); // Prise du temps écoulé au moment de l'allumage
// Allumage = 0; } // Allumage repasse à 0
// if (digitalReadFast(ALL) == HIGH); // Essai lecture rapide
if (digitalRead(ALL) == HIGH); // Essai simulation Si l'entrée ALL passe au niveau haut = moment de l'allumage
{ TempsAll = micros(); } // Prise du temps écoulé au moment de l'allumage
// delayMicroseconds(10); // Essai délai pour avoir une mesure plus juste, pas correct
// if (digitalRead(PMHAvant) == HIGH); // Si l'info PMH cylindre avant passe à l'état 1 (cas normal)
// if (digitalReadFast(PMHAvant) == LOW); // Essai lecture rapide
if (digitalRead(PMHAvant) == LOW); // Essai simulation Si l'info PMH cylindre avant passe à l'état bas on a PMH cyl avant
{ TempsPMHAV = micros(); } // Prise du temps écoulé au moment du PMH
Serial.print(TempsAll); // Essai Envoyer Temps allumage
Serial.print(","); // Essai case suivante
Serial.print(TempsPMHAV); // Essai Envoyer Temps PMH
Serial.print(","); // Essai case suivante
TempsAv = (TempsPMHAV - TempsAll); // Essai soustraction avant division
// TempsAv = pulseIn(ALL, HIGH); // Essai
Serial.print(TempsAv); // Essai Envoyer Temps PMH
Serial.print(","); // Essai case suivante
// AvAllumage += (float (TempsAv) / TempsParTour); // Calculez l'angle en degrés en fonction du temps entre Allumage et PMH point mort haut
AvAllumage += (float (TempsPMHAV - TempsAll) / TempsParTour); // Calculez l'angle en degrés en fonction du temps entre Allumage et PMH point mort haut
}
AvanceAllumage = float (AvAllumage * 360) / NbBoucle; // Moyenne sur N boucle mesures de l'avance à l'allumage 1 tour 360°
// Serial.print("AvAll="); // Pour essai Envoi texte
Serial.print(AvanceAllumage); // Envoyer l'angle d'avance à l'allumage
Serial.print(","); // case suivante
TempsPhaseOn = pulseIn(PMHAvant, HIGH); // Essai mesure du temps PMH à l'état 1
Serial.print(TempsPhaseOn); // Essai Envoyer Temps créneau PMH
Serial.print(","); // Essai case suivante
delay(Attente); // Attendre avant de mesurer la prochaine série
// TempsPhaseOn = pulseIn(CAPTPHASE, HIGH); // Mesure la durée de l'impulsion haute du capteur de Phase
// TempsPhaseOff = pulseIn(CAPTPHASE, LOW); // Mesure la durée de l'impulsion basse du capteur de Phase
// TempsParTour = ((TempsPhaseOn + TempsPhaseOff)/2); // Calcul temps par tour avec capteur de phase = (état haut + état bas) / 2
// Serial.print(TempsParTour); // Essai Envoyer Temps par tour
// Serial.print(","); // Essai case suivante
// if (digitalRead(ALL) == LOW); // Si l'allumage passe à 0 V (début de charge bobine)
// {Allumage = 1; } // Allumage passe à 1
// if (digitalRead(ALL) == HIGH && Allumage == 1); // Si allumage est à 1 et que l'entrée passe au niveau haut = moment de l'allumage
// {TempsAll = micros(); // Prise du temps écoulé au moment de l'allumage
// Allumage = 0; } // Allumage repasse à 0
// Serial.print("T_ALL="); // Essai
// Serial.print(TempsAll); // Essai Envoyer temps allumage
// Serial.print(","); // Essai case suivante
// if (digitalRead(PMHAvant) == HIGH); { // Si l'info PMH cylindre avant passe à l'état 1
// TempsPMHAV = micros(); } // Prise du temps écoulé au moment du PMH
// Serial.print("T_PMHAV="); // Essai
// Serial.print(TempsPMHAV); // Essai Envoyer Temps du PMH
// Serial.print(","); // Essai case suivante
// AvanceAllumage = (float (TempsPMHAV - TempsAll) / TempsParTour) * 36000; // Calculez l'angle en degrés en fonction du temps entre Allumage et PMH point mort haut
// // Serial.print("AvAll="); // Pour essai Envoi texte
// Serial.print(AvanceAllumage); // Envoyer l'angle d'avance à l'allumage
// Serial.print(","); // case suivante
// delay(Attente); // Attendre avant de mesurer la prochaine série
}



