Hello,
Je suis débutant en code et en arduino depuis qques mois.
J'ai parcourus longuement divers forum et blog et particulièrement celui ci.
Pour commencer sur un arduino uno et me familiariser avec le language (et les subtilités)
Bref, j'ai créé un programme et pas à pas j'ai débuggué à l'aide de l'écran LCD
Je bute sur un problème de synchronisation du pilotage des bobines.
Pour donner un ordre de grandeur la précision de l'allumage est du degré (soit 1/360 tour moteur)
A un régime moteur de 6000 trs/min il s'écoule 28microsecondes entre 2 degrés.
J'espère trouver de l'aide dans le forum pour comprendre ce que je ne vois pas.
Le but:
Faire un système d'allumage pour une voiture en utilisant :
-> En entrée un capteur Hall qui donne le top pour un tour moteur et un capteur de pression (pour la pression de l'admission du moteur).
-> En sortie deux Mosfet de type IGBT (spécifique allumage) pour piloter deux bobines.
Le principe :
S'affranchir d'un allumage mécanique (y compris du distributeur d'étincelle) en utilisant des bobines jumo-statiques.
L'arduino doit capter le top tour du moteur (et donc la position angulaire du capteur qui servira de référence)
Il devra calculer l'avance en fonction du régime moteur et de la pression de l'admission
Il devra enfin piloter précisément les bobines d'allumage.
Pour la partie Hard :
J'ai simuler mon moteur avec un ventilateur sur lequel j'ai greffé un capteur à effet HALL.
Ensuite tout installé provisoirement sur une platine avec qques fiches BNC.
Actuellement, j'utilise un GBF pour le signal régime moteur (le ventilo est bruyant) et un oscillo pour valider la synchronisation entre le signal du régime moteur et le signal de pilotage des bobines d'allumage.
Voici un aperçu du code (incomplet puisque je ne trouve pas solution pour la synchro allumage)
// DECLARATIONS
// include the library code:
// Declaration Entree/Sortie
int broche10 = 10; // Sortie Allumage bobine pour cylindre 1 et 4
int broche11 = 11; // Sortie Allumage bobine pour cylindre 2 et 3
int capteurP = A1; // Entree capteur pression
// variables régime moteur
unsigned long rpm;
volatile unsigned long tmpActuel = 0;
volatile unsigned long tmpPreced = 0;
volatile unsigned long tmpTour = 0;
// variables pression collecteur
unsigned long sensorPcol = 0;
unsigned long rawPcol = 0;
unsigned long rawPcolFilt = 0;
int filtrePcol =0;
// variables calcul avance allumage
unsigned long stopsecu = 0;
volatile unsigned long tmpdegr = 0;
unsigned long PositCapteur = 90;
volatile unsigned long ALL = 0;
unsigned long Avance = 10;
unsigned long degreRpm = 0;
unsigned long degrePcol = 0;
// XXXXXXXXXXXXXXXXXXX SETUP XXXXXXXXXXXXXXXXXXXXXXX
void setup() {
// Initialisation Sorties / Entrees
pinMode(broche10, OUTPUT); // met la borche 10 en mode OUT
pinMode(broche11, OUTPUT); // met la borche 11 en mode OUT
// déclaration de l'interruption pour le capteur regime
attachInterrupt(0, capteurHall, RISING);
}
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX LOOP xxxxxxxxxxxxxxxxxxxxx
void loop() {
// FONCTION Pression collecteur
sensorPcol = analogRead(capteurP); // Mesure pression brute
if (filtrePcol > 20) { // filtrage pression sur 2000 mesure => A ajuster en fonction de temps de récurrence de mesure
rawPcolFilt = rawPcol/20;
filtrePcol =0;
rawPcol = 0;}
else {
rawPcol = rawPcol + sensorPcol; // Mesure de la sortie du capteur
filtrePcol = filtrePcol+1;}
// FONCTION de cartographie des avances fonction du regime et pression admisssion
if (rawPcolFilt<40) { degrePcol = 0; }
else if (rawPcolFilt>540) { degrePcol = 9; }
else {
degrePcol = 0.024 * rawPcolFilt - 0.96; // vecteur d'avance pression : 0.15bar a 0.6bar soit 40dec a 540dec
}
if (tmpTour > 120000) { Avance = 20; } // AVANCE de la plage de regime de 0 a 500 trs => tmpTour > 119880 microsecondes
else if (tmpTour > 75000) { Avance = 10; } // AVANCE de la plage de regime de 500 a 800 trs
else if (tmpTour >= 17143) { // AVANCE de la plage de regime de 800 a 3500 trs
degreRpm = (-0.0004321 * tmpTour + 42.4);
Avance = degreRpm + degrePcol; }
else { // AVANCE de la plage de regime a superieur a 3500 trs
Avance = 35 + degrePcol;}
ALL = PositCapteur-Avance;
}
// xxxxxxxxxxxxxxxxxxxxxxxx ISR xxxxxxxxxxxxxxxxxxxxxxxxx
// Fonction interruption sur detection capteur hall
void capteurHall()
{
tmpPreced = tmpActuel; // mémorise la valeur de temps du tour précédent
tmpActuel = micros(); // mémorise la valeur du temps actuel
tmpTour = tmpActuel-tmpPreced; // calcul le temps entre chaque tour moteur
tmpdegr = tmpTour/360; // calcul du temps entre chaque degre vilebrequin
}