Aller au contenu

Allumage programmable sur base Bosch TSZ-H


Recommended Posts

Salut,

Bravo pour ce 1er démarrage réussi.......

à suivre sur la route ou sur un banc de puissance peut-être :)

Sympa toute la liste de matériel bien détaillée aussi.

Je suis curieux de voir quel code arduino tu as pris dans le groupe Panhard, j'avais été faire un tour sur leur drive suite à ton 1er post et j'étais un peu perdu sur les différentes versions....

A+

 

Lien vers le commentaire
Partager sur d’autres sites

Merci!

Les essais se feront sur route plate avec Powerdyn, à défaut d'avoir accès à un banc pas loin de chez moi...

Pas de souçi pour la liste, si mes nombreuses heures de recherches peuvent servir à d'autres ça me va très bien ?

Pour le code j'ai utilisé le M6_M8N_24B mais je l'ai énormément dégraissé de toutes les fonctions qui ne me sont pas utiles.

Je le publierai le plus vite possible mais là je suis encore ennuyé avec mes souçis de ratés à bas régime et tant que je suis pas sûr que ça vienne du code je préfère m'abstenir.

 

D'ailleurs si tu as une idée à ce sujet je suis preneur:

L'auto fait des ratés en dessous de 2000-2500trs/min (chose qu'elle ne faisait pas avec l'allumage d'origine, j'exclus donc tout problème du moteur en lui-même ou de la carburation).

J'ai branché ma lampe stroboscopique en mode compte tour et j'ai repéré que l'info régime était instable, prise sur le fil de bougie n°2. Ces ratés sont d'ailleurs visibles sur le compte tour (qui prend le signal au négatif bobine).

J'ai essayé une autre bougie, pas d'amélioration.

J'ai interverti les fils de bougies et les bougies n°2 et n°3 pour voir si le problème se déplaçait: toujours le cylindre n°2.

J'ai remis mon ancienne tête de delco, pas mieux.

Peut-être un bug logiciel mais je ne pense pas: Le programme ne fait aucun distinguo entre les cylindres, le phénomène serait donc aléatoire d'un cylindre à un autre.

J'ai peut-être une hypothèse: serait-il possible que l'arc électrique se fasse entre le doigt et le bâti du distributeur (un mauvais isolement à cet endroit précis par exemple) au lieu de se faire entre le doigt et le plot n°2. Le fait d'avoir plus d'avance à haut régime aurait pour effet que le doigt ne soit plus à la même place au moment de l'étincelle et empêcherai ce phénomène d'avoir lieu.

Qu'en penses tu?

Ca pourrait expliquer autre chose: quand je branche une bougie à l'air libre sur le fil n°2, tout va bien. Je sais qu'en l'absence de compression l'arc se fait plus facilement il n'aurait donc pas besoin de chercher un autre chemin dans le delco.

Seul hic: Je ne vois aucune trace d'arc électrique dans ma tête de delco et le fait que les ratés se voient au compte tour m'amènent à croire que le problème est en amont de la bobine.

C'est assez frustrant, mis à part ça, tout fonctionne à merveille!

A suivre...

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Je pense à plusieurs problèmes possibles:

En premier des parasites. Tu avais du voir que Philippe Loutrel indique qu'il faut des fils HT anti parasites sinon la carte arduino nano ne fonctionne pas bien. Peut-être que le problème vient de là. D'ailleurs il utilise un boitier métal pour pouvoir le mettre à la masse et faire un blindage facilement de tout le circuit électronique arduino.

Si tu as un oscilloscope il faudrait faire quelques mesures sur D1 (entrée hall) et D2 (sortie pilotage module) en même temps (oscillo 2 voies) pour voir si les signaux sont propres...

Il faudrait voir à utiliser des câbles blindés pour D1 et D2 si les signaux sont parasités

Il faudrait bien contrôler si l'allumeur, le module électronique et ton circuit électronique sont bien reliés à la même masse.

il faudrait vérifier que le 5v continu en sortie du 7805 n'est pas parasité.....

 

Aussi ce qui m'intrigue c'est que tu dis que ça marche bien avec la bougie 2 à l'air libre.....

Peut être que ta bobine est HS ou alors que toute l'électronique de limitation de courant et d'angle de came ne fonctionne plus bien aux régimes moteur ou tu as des problèmes.

C'est peut être à cause de la tension vce du BC237 car dans le circuit électronique du module on ne sait pas trop ce qu'il y a derrière la borne 6. Peut-être que le temps de charge de la bobine n'est plus bon et qu'elle n'arrive pas à se charger suffisamment. (constante de temps L/R)

Pareil pour voir ça il faudrait mesurer toujours à l'oscillo la tension borne 6 du module électronique et en même temps la tension sur la borne - bobine pour voir si ça se passe bien entre le signal d'entrée du module (borne 6) et le signal de sortie qui pilote la bobine (borne 1).

 

Pour être sur du module seul + bobine rebranche le capteur hall directement sur la borne 6 du module et enlève tout le circuit électronique arduino pour voir si ça fonctionne avec la bougie 2 dans le cylindre.

ça te permettra de vérifier que le module et que la bobine fonctionnent bien.

 

A+

 

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Voilà qui met de l'eau à mon moulin, merci!

-Mon faisceau HT est bien antiparasité, pas de souçi de ce côté.

-Effectivement il faudrait voir si les signaux sont propres, malheureusement je n'ai pas d'oscilloscope, je vais voir ce que je peut faire, j'ai peut-être du monde qui peut m'arranger la dessus.

-Pour le 7805, à priori la carte Arduino est équipée de condensateurs de filtrage internes, mais c'est une possibilité aussi.

Peut être que ta bobine est HS ou alors que toute l'électronique de limitation de courant et d'angle de came ne fonctionne plus bien aux régimes moteur ou tu as des problèmes.

j'y ai pensé également, à voir. Ce qui me pose problème, et c'est là que je bloque: c'est pourquoi toujours le cylindre n°2 et pas les autres ?

Pour être sur du module seul + bobine rebranche le capteur hall directement sur la borne 6 du module et enlève tout le circuit électronique arduino pour voir si ça fonctionne avec la bougie 2 dans le cylindre.

C'est un test assez facile à réaliser et qui me permettrai d'écarter plusieurs pistes.

 

Affaire à suivre, encore merci!

 

Lien vers le commentaire
Partager sur d’autres sites

J'avance! C'est toujours pas résolu mais j'ai une piste sérieuse:

C'était toujours le cylindre n°2 qui était en cause, malgré mes échanges de faisceau, de bougies et de tête de delco.

Je me suis légèrement planté dans mon diagnostic: j'ai cru qu'avec une bougie à l'air libre le phénomène n'avait pas lieu, j'ai eu tord. On voit bien les ratés au ralenti et en accelérant un peu plus d'étincelle du tout jusqu'à 2000-2500trs.

J'ai retourné le distributeur d'un demi tour et le problème s'est déplacé du cylindre n°2 vers le n°3.

Je peut désormais dire avec certitude que c'est lui qui est en cause et écarter toutes les autres pistes, ce qui est très bien.

Du coup, je suis presque sûr qu'il s'agit d'une fuite d'étincelle du doigt vers le bâti du distributeur.

J'y suis presque ?

Lien vers le commentaire
Partager sur d’autres sites

salut,

 

Une idée sur nos allumeur il y a un capot plastique entre le doigt d'allumeur et le corps d'allumeur pour éviter ce phénomène. Il n'y pas la même chose sur l'allumeur de 205 et qui serait manquant sur le tiens?

A+

Lien vers le commentaire
Partager sur d’autres sites

C'est précisément à cette pièce que je pense. Il y en a bien une fournie avec le distributeur mais elle respire pas la qualité (adaptable oblige...)

La partie entourée m'a l'air d'être une zone de faiblesse

196548872_2964960843781138_6306051712984564952_n.thumb.jpg.e3ab342f203e3e7eb30812e00d74c439.jpg

Mon idée est que les ratés ne se produisent pas à un régime donné mais plutôt à une avance donnée.

J'ai repéré la position du doigt et sur des faibles avances on est plus proche de cette zone qu'à des avances plus grandes. Ca expliquerai qu'à haut régime il n'y a pas de souci.

Ca expliquerai aussi pourquoi ça se produit que sur un cylindre: Cette zone est celle où le doigt est en position pour l'allumage du cylindre n°2.

J'ai essayé d'isoler avec du ruban d'électricien , ça n'a rien changé mais c'est peut-être insuffisant.

J'ai retrouvé un couvercle en plastique d'origine Bosch, ça sera surement mieux mais il va falloir attendre demain, il est un peu tard pour faire ronfler le moteur dans le garage ?.

 

Si c'est vraiment ça, c'est vicelard comme panne...

Lien vers le commentaire
Partager sur d’autres sites

Bon j'ai essayé ce matin, toujours pas bon...

Faut se rendre à l'évidence, ça ne vient pas d'une fuite de courant, néanmoins, ça vient forcément du distributeur.

Du coup, je me suis penché sur la partie signal de celui-çi.

J'ai observé le signal de sortie avec la prise que j'ai dédié à Powerdyn, ce qui m'a permis au passage de tester cette fonction

Voilà ce que j'en ai tiré avec Audacity:

196525901_497163398194019_7606090259143778983_n.thumb.jpg.efd16546b7b2bbc3d074667d3e745934.jpg

Visiblement, on a bien les 4 cylindres mais on peut observer des irrégularités (3 temps courts 1 temps long)

J'ai mis à poil mon distributeur et j'ai localisé le coupable: la roue phonique!

195982927_810459986244950_6404728826837791531_n(1).thumb.jpg.8a2872cc8fec2bdcdd04373c74aad56d.jpg197886912_1105997183221227_4958553998553288446_n.thumb.jpg.72e1203fab6079fcde4bc07e080eca65.jpg

On voit clairement qu'une encoche est décalée...

Après un petit coup de lime, c'est beaucoup mieux:

196137192_3303882746505090_2721304613550900533_n.thumb.jpg.924fd6bae236ec91a331139a13801ec9.jpg

 

J'ai tout remonté et miracle, tout est rentré dans l'ordre !!!! Quel bonheur ?

Les 4 cylindres sont bien présents à tout les régimes et logique, le ralenti est devenu bien stable ?

On peut voir que le signal est maintenant bien régulier:

197522131_183989450306034_8397572562932451510_n.thumb.jpg.d4ae6b12d73a3a222751fb5c883eaa62.jpg

J'aurai dû m'en douter: il faut être un peu naïf (ou c*n, c'est comme on veut!) pour penser qu'une pièce adaptable à 47 balle serait aussi bien faite que l'original Bosch à 250e...

 

A suivre...

 

Lien vers le commentaire
Partager sur d’autres sites

Maintenant que je suis sûr du code, le voici:

 

#include <TimerOne.h>

// Philippe Loutrel pour l'AEPL original
// Christophe Dedessus les Moutiers pour la version Panhard avec prise en compte de la dépression
// Antoine Zorgati pour la version Peugeot avec sortie Powerdyn, prise en compte de la dépression et utilisation du module Bosch TSZ-H à la place de l'IGBT14C40L

 

//Courbe d'avance à dépression à renseigner de la façon suivante:
//int xhigh = 604;// Dépression correspondant à l'avance maxi, convertie en bits
//int xlow = 320;// Dépression correspondant à l'avance mini, convertie en bits
//int yhigh = 12;// Avance à dépression maxi, en degrés vilebrequin
//int ylow = 0;// Avance mini de départ, toujours égale à zéro

//Formule à appliquer pour la conversion dépression(mmHg) en bits: Nbits = 1,0912 x Dep(mmHg)+102,3
//Valable pour le capteur FAE réf 16111

//Courbe d'avance centrifuge à renseigner de la façon suivante:
//int N[] = {0, 1300, 2000, 3500, 7000, 0};
//int Ang[] = {0, 0, 12, 24, 21, 0};
//const int Avancestatique = 10;

//Chaque couple N Ang correspond à un point de la courbe centrifuge
//L'avance statique est à ajouter à la courbe
//Exemple ici: à 2000trs/min, l'avance centrifuge sera de 12°+10° d'avance statique soit 22° au vilebrequin

//Courbe dépression à renseigner
int xhigh = 604;// valeur ADC haute pour conversion de la valeur mmHg haute
int xlow = 320;// valeur ADC basse pour conversion de la valeur mmHg basse
int yhigh = 12;// valeur de la limite en degré haute
int ylow = 0;// valeur de la limite en degré basse soit 0 degré

//Courbe centrifuge à renseigner
int N[] = {0, 1300, 2000, 3500, 7000, 0};
int Ang[] = {0, 0, 12, 24, 21, 0};
const int Avancestatique = 10;


//Valeurs à renseigner selon les caractéristiques de votre moteur
int Ncyl = 4;//Nombre de cylindres
const int AngleCapteur = 60;//Avance statique de calage du capteur, en degrés vilebrequin
const int CaptOn = 0;  //CapteurOn = 1 si le signal est donné par un passage 0=>5V (front montant), CapteurOn = 0 si front descendant
const int Nplancher = 1000; // vitesse en t/mn jusqu'a laquelle l'avance à dépression  = 0°, utile si la prise de dépression est en aval du papillon des gaz (pour ne pas perturber le ralenti)


//Valeurs à renseigner selon la façon dont est cablé votre Arduino
const int Module = 3;    //Sortie D3 vers Module
const int Powerdyn = 4;    //Sortie D4 vers prise Jack (pour exploitation Powerdyn)
const int Cible = 2;  //Entrée D2 du capteur à effet Hall


//Les valeurs suivantes n'ont pas lieu d'être modifiées
int unsigned long D = 0;
int unsigned long Ddep = 0;
int unsigned long Dsum = 0;
int milli_delay = 0;
int micro_delay = 0;
float Tplancher = 0;
const int tcor = 380; //correction en µs  du temps de calcul pour D 120µs + 120µs de lecture de dépression + 140µs de traitement
int unsigned long Davant_rech = 0;
int unsigned long Tprec = 0;
int unsigned long prec_H = 0;
int unsigned long T = 0;
int unsigned long Tant = 0;
int N1 = 0;
int Ang1 = 0;
int N2 = 0;
int Ang2 = 0;
int*  pN = &N[0];
int*  pA = &Ang[0];
float k = 0;
float C1[20];
float C2[20];
float Tc[20];
int Tlim = 0;
int j_lim = 0;
int unsigned long NT = 0;
int AngleCibles = 0;
int UneEtin = 1;
float uspardegre = 0;
int Dep = 0;
float Degdep = 0;
int unsigned long Vitesse = 0;
float Delaideg = 0;
unsigned long Stop_temps;
unsigned long Tempsecoule = 0;
const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

 


//********************LES FONCTIONS*************************


void  CalcD ()
{
  for (byte j = 1; j <= j_lim; j++)
  {
  if  (T >=  Tc[j]) {    
    D = float(T * C1[j]  + C2[j]);
    Ddep = (Degdep * Delaideg ) ;
//if (T > Tplancher){Ddep=0}; //Pour activer cette fonction, enlever les // en début de ligne
    Dsum = D - Ddep - tcor ;
  break;
    }
  }
}


void  Etincelle ()
{
  if (Dsum < 14000) {
    delayMicroseconds(Dsum);
  }
  else {
    milli_delay = ((Dsum / 1000) - 2);
    micro_delay = (Dsum - (milli_delay * 1000));
    delay(milli_delay);
    delayMicroseconds(micro_delay);
  }
    digitalWrite(Module, 1);
    digitalWrite(Powerdyn, 1);
    Stop_temps = micros();
    Davant_rech = T * 3 /10;
    Timer1.initialize(Davant_rech);
    UneEtin = 1;
}


void  Init ()
{   
    AngleCibles = 720 / Ncyl;
    NT  = 120000000 / Ncyl;
    Tplancher = 120000000 / Nplancher / Ncyl;
    Prep_courbe();  
    Serial.print("Tc = "); for (int i = 1 ; i < 8; i++)Serial.println(Tc);
    Serial.print("Tlim = "); Serial.println(Tlim);
    Serial.print("C1 = "); for (int i = 1 ; i < 8; i++)Serial.println(C1);
    Serial.print("C2 = "); for (int i = 1 ; i < 8; i++)Serial.println(C2);
    Timer1.attachInterrupt(isr_GestionIbob);
}


void Prep_courbe()
{
    N1  = 0; Ang1 = 0; //Toute courbe part de  0
  int i = 0;    //locale mais valable hors du FOR
    pN++; pA++; //sauter le premier element de tableau, toujours =0
  for (i  = 1; *pN != 0; i++)//i pour les C1,C2 et Tc.Arret quand regime=0.
    //pN est une adresse (pointeur) qui pointe au tableau N.Le contenu pointé est *pN
  { N2 = *pN; Ang2 = *pA;//recopier les valeurs pointées dans N2 et Ang2
    k = float(Ang2 - Ang1) / float(N2  - N1);
    C1 = float(AngleCapteur - Avancestatique - Ang1 + k * N1) / float(AngleCibles);
    C2 = -  float(NT * k) / float(AngleCibles);
    Tc = float(NT / N2);
    N1 = N2; Ang1 = Ang2; //fin de ce segment, début du suivant
    pN++; pA++;   //Pointer à l'element suivant de chaque tableau
  }
    j_lim = i - 1; //Revenir au dernier couple entré
    Tlim  = Tc[j_lim]; //Ligne rouge
}


void  isr_GestionIbob()
  { Timer1.stop();
  if (UneEtin == 1) {
    digitalWrite(Module, 0);  
    digitalWrite(Powerdyn, 0);
  }
    UneEtin = 0;
}


void setup()
{
  Serial.begin(115200);
  if (Ncyl < 2)Ncyl = 2;
  pinMode(Cible, INPUT_PULLUP);
  pinMode(Module, OUTPUT);
  pinMode(Powerdyn, OUTPUT);
 
  ADCSRA &= ~PS_128;
  // you can choose a prescaler from above.
  // PS_16, PS_32, PS_64 or PS_128
  ADCSRA |= PS_64;
  // set our own prescaler to 64
  Init();
}


void loop()
{
  while (digitalRead(Cible) == !CaptOn);
    T = micros() - prec_H;
    prec_H = micros();
    Dep = analogRead(A0);
    Degdep = map(Dep, xhigh, xlow, yhigh, ylow);
  if (Degdep < 0) {
    Degdep = 0;
  }
  else if (Degdep > yhigh) {
    Degdep = yhigh ;
  }
  else ;
    Vitesse = NT / T;
    Delaideg = NT / Vitesse / float(AngleCibles);
  if (T > Tlim) {
    CalcD();
    Etincelle();
  }
  if (T < Tlim) {
    T = Tant;
    CalcD();
    Etincelle();
    Vitesse = NT / Tant;
  }
  while (digitalRead(Cible) == CaptOn);
    Tempsecoule = Stop_temps - prec_H ;
    Tant = T;
}

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

Pas sûr que ce soit un défaut de la pièce. Sur nos moteur (1600CT), on a une lumière différence sur le cylindre 3 pour limiter la chauffe car il est a la peine en refroidissement.

Il est possible de commander des plateaux avec lumière identiques que l ont monte dans nos allumeurs.

Pod saura te répondre mieux que moi car vous parlez un language d une autre planète lol.

A vérifier si la ref n est pas d'origine decalleée.

En tout cas, sacré sujet et beau dossier bien alimenté et riche en info. 

Merci a toi

Lien vers le commentaire
Partager sur d’autres sites

lebriiice,

Sur nos moteur (1600CT), on a une lumière différence sur le cylindre 3 pour limiter la chauffe car il est a la peine en refroidissement.

Intéressant, du coup je suppose que le décalage diminue l'avance du cylindre 3. Astucieux, je ne connaissait pas ! C'est bon à savoir si jamais j'ai l'occasion de bosser sur un Flat4 ?

Dans mon cas, je pense plus à une piètre qualité de fabrication, le distributeur étant à l'origine prévu pour une Golf.

En tout cas, sacré sujet et beau dossier bien alimenté et riche en info.

Merci ! Ca fait toujours plaisir de recevoir des compliments quand on a bossé dur sur un sujet, et si ça peut vous servir, c'est tout bénéf !

 

Pod,

ça va être sympa de voir comment fonctionne la partie capteur à depression :)

Oui, autant pour une conduite On/Off la dépression est inutile, autant on y trouve un intéret en utilisation routière.

Sur mon auto,  la capsule à dépression était HS depuis un moment, je l'ai achetée et toujours conduite ainsi. Avec le nouvel allumage, je suis pour l'instant en courbe d'origine et j'ai senti la différence au niveau souplesse. Preuve de l'utilité de la chose ?

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

  • 3 semaines plus tard...

Salut à tous !

Quelques nouvelles:

Pour l'instant tout fonctionne correctement. Avec seulement 150kms de parcourus il est un peu tôt pour se prononcer, mais ça a l'air fiable ?.

J'ai apporté quelques modifications au code, notamment pour extraire des données via le port série.

519739042_Capturetinkercad.thumb.png.69be4599887b1d48abd3c4569b7b3060.png

On y retrouve le régime moteur, l'avance à l'allumage (centrifuge+dépression), la valeur de dépression à l'admission pour en déduire la charge (en millimètres de mercure), et la valeur AFR de ma sonde lambda large bande.

Il reste à faire un beau fichier Excel pour transformer ces valeurs en courbes.

Le code:

//Mr Philippe Loutrel pour l'AEPL original
//Mr Dedessus les Moutiers Christophe pour la version Panhard avec prise en compte de la dépression
//Mr Zorgati Antoine pour la version Peugeot avec sortie Powerdyn, prise en compte de la dépression et utilisation du module Bosch TSZ-H à la place de l'IGBT14C40L

 

//Courbe d'avance à dépression à renseigner de la façon suivante:
//int xhigh = 0;// Dépression correspondant à l'avance maxi, convertie en bits
//int xlow = 0;// Dépression correspondant à l'avance mini, convertie en bits
//int yhigh = 0;// Avance à dépression maxi, en degrés vilebrequin
//int ylow = 0;// Avance mini de départ, toujours égale à zéro

//Formule à appliquer pour la conversion dépression(mmHg) en bits: Nbits = 1,0912 x Dep(mmHg)+102,3
//Valable pour le capteur FAE réf 16111

//Courbe d'avance centrifuge à renseigner de la façon suivante:
//int N[] = {0, 1300, 2000, 3500, 7000, 0};
//int Ang[] = {0, 0, 12, 24, 21, 0};
//const int Avancestatique = 10;

//Chaque couple N Ang correspond à un point de la courbe centrifuge
//L'avance statique est à ajouter à la courbe
//Exemple ici: à 2000trs/min, l'avance centrifuge sera de 12°+10° d'avance statique soit 22° au vilebrequin

//Courbe dépression à renseigner
int xhigh = 604;// valeur ADC haute pour conversion de la valeur mmHg haute
int xlow = 320;// valeur ADC basse pour conversion de la valeur mmHg basse
int yhigh = 12;// valeur de la limite en degré haute
int ylow = 0;// valeur de la limite en degré basse soit 0 degré

//Courbe centrifuge à renseigner
int N[] = {0, 1200, 2000, 3500, 7100, 0};
int Ang[] = {0, 0, 12, 24, 20, 0};
const int Avancestatique = 10;


//Valeurs à renseigner selon les caractéristiques de votre moteur
const int AngleCapteur = 60;  //Avance statique de calage du capteur, en degrés vilebrequin
const int CaptOn = 0;  //CapteurOn = 1 si le signal est donné par un passage 0=>5V (front montant), CapteurOn = 0 si front descendant


//Valeurs à renseigner selon la façon dont est cablé votre Arduino
const int Module = 3;  //Sortie D3 vers Module
const int Powerdyn = 4;  //Sortie D4 vers prise Jack (pour exploitation Powerdyn)
const int Cible = 2;  //Entrée D2 du capteur à effet Hall
const int Injection = 5;  //Sortie D5 vers Nano injection


//Les valeurs suivantes n'ont pas lieu d'être modifiées


int unsigned long T = 0;
int unsigned long prec_H = 0;
int unsigned long Tant = 0;


int Dep = 0;
int unsigned long D = 0;
int unsigned long Ddep = 0;
int unsigned long Dcent = 0;


int milli_delay = 0;
int micro_delay = 0;
int milli_delay_avant_rech = 0;
int micro_delay_avant_rech = 0;
int unsigned long Davant_rech = 0;


int N1 = 0;
int Ang1 = 0;
int N2 = 0;
int Ang2 = 0;
int*  pN = &N[0];
int*  pA = &Ang[0];
float k = 0;
float C1[20];
float C2[20];
float Tc[20];
int Tlim = 0;
int j_lim = 0;


const int Tcor = 340; //correction en µs  du temps de calcul pour D 120µs + 120µs de lecture de dépression + 140µs de traitement
byte compteur_Signal_injection = 0;
byte compteur_Send_data = 0;
int Regime = 0;

 


const unsigned char PS_16 = (1 << ADPS2);
const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0);
const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1);
const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0);

 


//********************LES FONCTIONS*************************


void  CalcD ()//////////////////

{ Dep = analogRead(A0);  // Mesure de la dépression
  float Degdep = map(Dep, xhigh, xlow, yhigh, ylow);  // Détermination de l'avance à dépression
  if (Degdep < 0) {
    Degdep = 0;
  }
  else if (Degdep > yhigh) {
    Degdep = yhigh ;
  }
  else ;
  Ddep = T / 180 * Degdep;  // Conversion de l'angle d'avance en délai
 
  for (int j = 1; j <= j_lim; j++)
  {
    if  (T >=  Tc[j]) {     
      Dcent =  float(T * C1[j] + C2[j]) ;  // Détermination de l'avance centrifuge
      D = Dcent - Ddep - Tcor;  // Détermination du délai à appliquer pour, temps de calcul pris en compte
      break;  //Sortir, on a D
    }
  }
}


void  Etincelle ()
{
  if (D < 14000) {
    delayMicroseconds(D);
  }
  else {
    milli_delay = ((D / 1000) - 2);
    micro_delay = (D - (milli_delay * 1000));
    delay(milli_delay);
    delayMicroseconds(micro_delay);
  }
    digitalWrite(Module, 1);
    digitalWrite(Powerdyn, 1);
    Davant_rech = T * 3 /10;
    if (Davant_rech < 14000) {
    delayMicroseconds(Davant_rech);
  }
  else {
    milli_delay_avant_rech = ((Davant_rech / 1000) - 2);
    micro_delay_avant_rech = (Davant_rech - (milli_delay_avant_rech * 1000));
    delay(milli_delay_avant_rech);
    delayMicroseconds(micro_delay_avant_rech);
  }
    digitalWrite(Module, 0);  
    digitalWrite(Powerdyn, 0);
}

 


void setup()
{
  Serial.begin(115200);
 
  pinMode(Cible, INPUT);
  pinMode(Module, OUTPUT);
  pinMode(Powerdyn, OUTPUT);
  pinMode(Injection, OUTPUT);
 
  ADCSRA &= ~PS_128;
  ADCSRA |= PS_64;

  N1  = 0; Ang1 = 0;
  int i = 0;
    pN++; pA++;
  for (i  = 1; *pN != 0; i++)
  { N2 = *pN; Ang2 = *pA;
    k = float(Ang2 - Ang1) / float(N2  - N1);
    C1 = float(AngleCapteur - Avancestatique - Ang1 + k * N1) / 180;
    C2 = -  float(30000000 * k) / 180;
    Tc = float(30000000 / N2);
    N1 = N2; Ang1 = Ang2;
    pN++; pA++;
  }
    j_lim = i - 1;
    Tlim  = Tc[j_lim];
}


void loop()
{
  while (digitalRead(Cible) == !CaptOn);
    T = micros() - prec_H;
    Regime = 30000000 / T;
    
    prec_H = micros();
  if (T > Tlim) {
    CalcD();
    Etincelle();
  }
  if (T < Tlim) {
    T = Tant;
    CalcD();
    Etincelle();
  }
  if (Regime<=6500){
    Send_data();}  
    Signal_injection();
    Tant = T;
  while (digitalRead(Cible) == CaptOn);
}


void Send_data()
{
  if (compteur_Send_data >=9) {
  float AFR = analogRead(A1)/10+100 ;
  int Dep_mmHg = (Dep-102)*9/10;  
  byte AA = AngleCapteur-(180*(Dcent-Ddep)/T);
  String Message = ("N"+String(Regime)+(",AA")+String(AA)+(",mmHg")+String(Dep_mmHg)+(",AFR")+String(AFR));
  Serial.println(Message);
    compteur_Send_data =0;
  }
  else {
    compteur_Send_data++;
  }
}

void Signal_injection()
{
  if (compteur_Signal_injection >= 3) {

    digitalWrite (Injection, 1);
    delayMicroseconds(50);
    digitalWrite (Injection, 0);
    compteur_Signal_injection = 0;
  }
  else {  
  compteur_Signal_injection++;
  }
}

La fonction Signal_injection() sert à envoyer un signal à chaque cycle (soit 2 tours vilo). Pour un autre projet <em><em><em>?</em></em></em>

Lien vers le commentaire
Partager sur d’autres sites

Aujourd'hui j'ai un peu bossé: J'ai fait un graphique Excel avec la macro PLX - DAQ, disponible sur le net. C'est une macro qui permet d'extraire les données envoyées via le port série et de les mettre dans des colonnes Excel, j'ai juste eu à créer et mettre à l'échelle le graphique.

Le code que j'ai mis plus haut ne fonctionne pas, à oublier, je publierai bientôt le code fonctionnel.

Le résultat me plaît bien et c'est une grande aide pour celui qui veut affiner les réglages de son moteur.

Un petit lien youtube :

A suivre...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Antoine,

 

C'est vraiment sympa les comptes-rendus de tes essais ça me fait découvrir des outils que je ne connaissais pas comme la macro PLX justement :).

Merci

Lien vers le commentaire
Partager sur d’autres sites

Rejoins la discussion ...

Tu peux poster maintenant et t'inscrire plus tard Si tu as déjà un compte connecte-toi pour poster sous ton pseudo !

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.


×
×
  • Créer...