/* Allumage Programme d'allumage cartographique Pour moteur monocylindre 4 temps, un allumage tous les 2 tours */ // Entrées et sorties unsigned char capteur = 2; // Rupteur câblé en Digital 2 unsigned char bobine = 3; // Bobine câblée en Digital 3 unsigned char led = 13; // Led de la carte unsigned char SW1 = 9; unsigned char SW2 = 8; unsigned char SW3 = 7; unsigned char SW4 = 6; // Mode Test si 1, Allumage si 0 unsigned char alimSW = 5; // pin en sortie pour alim 0V du microswitch unsigned char RefPotar = A0; // Alimentation 0V du potentiomètre en A0 unsigned char potentiometre = A1; // Potentiomètre de réglage fin de l'avance en A1 unsigned char AlimPotar = A2; // Alimentation 5V du potentiomètre en A2 // Tableaux de cartographie moteur unsigned int Courbe1[97]={130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,130,250,260,266,272,277,282,287,291,296,300,304,307,310,313,316,320,321,323,324,325,328,331,334,337,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}; unsigned int Courbe2[97]={100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,260,270,280,290,300,310,320,330,340,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,350,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,}; unsigned int Courbe3[97]={70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,80,90,101,111,122,132,142,153,163,174,184,194,205,215,226,236,246,257,267,278,288,298,309,319,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,} ; unsigned int Courbe4[116]={100,100,100,100,100,100,100,105,115,125,136,146,156,167,177,187,198,208,218,229,239,249,260,270,280,291,301,311,322,332,342,353,363,373,384,394,404,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,410,409,409,408,408,407,407,406,406,405,405,404,404,403,403,402,402,401,401,400,401,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,} ; unsigned int Courbe5[97]={70,70,70,70,70,70,70,75,85,95,106,116,126,137,147,157,168,178,188,199,209,219,230,240,250,261,271,281,292,302,312,323,333,343,354,364,374,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,380,379,379,378,378,377,377,376,376,375,375,374,374,373,373,372,372,371,371,370,371,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,} ; unsigned int Courbe6[97]={20,20,20,20,20,20,32,44,56,68,80,92,104,116,128,140,152,164,176,188,200,212,224,236,248,260,262,264,267,269,271,274,276,278,281,283,285,288,290,292,295,297,299,302,304,306,309,311,313,316,318,320,323,325,327,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,330,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,} ; unsigned int Courbe7[97]={80,80,80,80,80,80,80,80,80,80,80,88,97,106,115,124,133,142,151,160,169,178,187,196,205,214,223,232,241,250,259,268,277,286,295,304,313,322,331,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,} ; unsigned int Courbe8[97]={80,80,80,80,80,80,90,98,105,112,120,127,134,142,149,156,164,171,178,186,193,200,208,215,222,230,237,244,252,259,266,274,281,288,296,303,310,318,325,332,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,340,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,} ; /* * SW1 * SW2 * SW3 * * ON * ON * ON * Courbe 1 (Allumage Bosch) * ON * ON * OFF * Courbe 2 (V50 rupteurs) * ON * OFF * ON * Courbe 3 (V65 rupteurs) * ON * OFF * OFF * Courbe 4 (V35 Motoplat) * OFF * ON * ON * Courbe 5 (V65 V75 Motoplat) * OFF * ON * OFF * Courbe 6 (850 T3 1000 SP) * OFF * OFF * ON * Courbe 7 (850 Le Mans) * OFF * OFF * OFF * Courbe 8 (V7 sport) */ // Constantes programme unsigned int regimeMaxi = 7900 ; // Régime de coupure de l'allumage // Déclaration de variables int correction ; // variable pour la c orrection électronique de l'avance unsigned long debutCycle ; // variable pour stocker le top 60° avant PMH unsigned long finCycle ; // variable pour stocker le top 60° avant PMH du cycle suivant unsigned long dureeCycle ; // variable pour stocker la durée du cycle unsigned long debutCharge ; // variable pour stocker le top de début de charge de la bobine unsigned long etincelle ; // variable pour stocker le top étincelle unsigned int regime ; // variable pour stocker le régime moteur byte regimeLow ; int index ; // variable pour stocker l'index dans le tableau unsigned char choixCourbe ; // variable pour le choix de la courbe d'avance unsigned int avance1 ; // variables pour le mappage de l'avance unsigned int avance2 ; unsigned int avance ; // variable pour stocker la valeur de l'avance en décidegrés unsigned int retard ; // variable pour stocker la valeur du retard en décidegrés // Routine d'initialisation: void setup() { /*configuration des entrées / sorties */ pinMode(capteur, INPUT); pinMode(SW1, INPUT_PULLUP); pinMode(SW2, INPUT_PULLUP); pinMode(SW3, INPUT_PULLUP); pinMode(SW4, INPUT_PULLUP); pinMode(bobine, OUTPUT); pinMode(led, OUTPUT); pinMode(RefPotar, OUTPUT); pinMode(AlimPotar, OUTPUT); pinMode(alimSW, OUTPUT); digitalWrite(RefPotar,LOW) ; // alimentation du potentiomètre digitalWrite(AlimPotar,HIGH) ; // alimentation du potentiomètre digitalWrite(alimSW,LOW) ; // alimentation du microswitch } // Programme principal: void loop() { index06 : if (digitalRead (SW4) == LOW) { goto index03 ; // Passer directement au programme principal } else if (digitalRead (SW1) == LOW) { // mise au point neutre du potentiomètre correction = analogRead ( potentiometre ) ; // Lecture du potentimètre correction = map(correction, 0, 1023, -100, 100) ; // transformation en + ou - 100 décidegrés if (correction == 0) { digitalWrite (led, HIGH) ; // allume la led } else { digitalWrite (led, LOW) ; // éteindre la led } } else { digitalWrite (led, !digitalRead (capteur)) ; } goto index06 ; // Attente de la première impulsion index03 : while (digitalRead (capteur) == HIGH ) {} // Attendre que la lumière du disque passe devant le capteur debutCycle = micros () ; // Enregistrer le timer au début du cycle // Début du cycle pour régime inférieur à 500 tr/mn index01 : digitalWrite (bobine, HIGH) ; // mettre la bobine en charge digitalWrite (led, HIGH) ; // allume la led while (digitalRead (capteur) == LOW ) { // Attendre le top PMH if ((micros () - debutCycle) > 10000000) { digitalWrite (bobine, LOW) ; // Couper la charge de la bobine au bout de 10 secondes sans rien digitalWrite (led, LOW) ; // éteindre la led } } digitalWrite (bobine, LOW) ; // Etincelle digitalWrite (led, LOW) ; // éteindre la led while (digitalRead (capteur) == HIGH ) {} // Attendre que la lumière du disque passe devant le capteur finCycle = micros () ; // Enregistrer le timer au fin du cycle dureeCycle = finCycle - debutCycle ; // Calculer la durée du cycle debutCycle = finCycle ; // transforme la fin du cycle précédent en début du nouveau cycle etincelle = debutCycle ; // pour le premier cycle supérieur à 500 tr/mn correction = analogRead ( potentiometre ) ; // Lecture du potentimètre correction = map(correction, 0, 1023, -100, 100) ; // transformation en + ou - 100 décidegrés index04 : if (dureeCycle > 240000) { // Si le régime moteur est inférieur à 500 tr/mn goto index01 ; // reprendre avec un allumage au PMH } else { index02 : debutCharge = etincelle + (dureeCycle / 2 ) ; // calcule le top de mise en charge de la bobine while (micros () < debutCharge) ; // attendre jusqu'au top de début de charge digitalWrite (bobine, HIGH) ; // mettre la bobine en charge while (digitalRead (capteur) == HIGH ) { // Top PMH - 60° if ((micros () - debutCycle) > 3000000) { digitalWrite (bobine, LOW) ; // Couper la charge de la bobine au bout de 3 secondes sans rien } } finCycle = micros () ; // Top de fin du cycle dureeCycle = finCycle - debutCycle ; // Cakculer la durée du cycle regime = 120000000 / dureeCycle ; // Caluculer le régime du moteur if (regime > regimeMaxi) { goto index05 ; } regimeLow = regime / 100 ; index = (regime - 500) / 100 ; // Calcul l'index pour chercher la valeur de l'avance dans le tableau if (index <0) { // supprime les valeurs négatives de l'index index = 0 ; } choixCourbe = (4 * digitalRead (SW1)) + 2 * digitalRead (SW2) + digitalRead (SW3) ; switch (choixCourbe) { case 0 : avance1 = Courbe1[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 1 avance2 = Courbe1[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 1 break ; case 1 : avance1 = Courbe2[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 2 avance2 = Courbe2[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 2 break ; case 2 : avance1 = Courbe3[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 3 avance2 = Courbe3[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 3 break ; case 3 : avance1 = Courbe4[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 4 avance2 = Courbe4[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 4 break ; case 4 : avance1 = Courbe5[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 5 avance2 = Courbe5[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 5 break ; case 5 : avance1 = Courbe6[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 6 avance2 = Courbe6[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 6 break ; case 6 : avance1 = Courbe7[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 7 avance2 = Courbe7[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 7 break ; case 7 : avance1 = Courbe8[index] ; // trouve la valeur de l'avance en décidegrès dans le tableau 8 avance2 = Courbe8[(index +1)] ; // trouve la valeur de l'avance en décidegrès dans le tableau 8 break ; } avance = map(regime, 100 * regimeLow, 100 *(regimeLow + 1), avance1, avance2); avance = avance + correction ; retard = 600 - avance ; // calcule le retard en décidegrés etincelle = finCycle + ( dureeCycle * retard / 7200) ; // calcul du top étincelle while (micros () < etincelle) { } // attendre le top etincelle digitalWrite (bobine, LOW) ; // Etincelle correction = analogRead ( potentiometre ) ; // Lecture du potentimètre correction = map(correction, 0, 1023, -100, 100) ; // transformation en + ou - 100 décidegrés } index05 : debutCycle = finCycle ; // transforme la fin du cycle précédent en début du nouveau cycle goto index04 ; }