Aller au contenu

Allumage programmable sur base Bosch TSZ-H


Recommended Posts

Il y a 12 heures, Toine5013 a dit :

Alors comment dire... 

Ce connecteur est une vraie tannée à trouver ! Indisponible sur le net, j'ai cherché partout et j'ai fini par aller en casse auto. Les golf 3 ont également ce connecteur

Bonjour Antoine,

J'ai l'impression que c'est celui ci. Comme tu en as un de golf3 chez toi en regardant les photos qu'en penses tu ?

https://fr.aliexpress.com/item/1005004541577610.html?spm=a2g0o.store_pc_groupList.8148356.24.673a3583I7aL4Y&pdp_npi=2%40dis!EUR!€ 2%2C57!€ 2%2C57!€ 2%2C57!!!!%402100bdd816621889770167892e72fd!12000029539026344!sh

Merci

 

Lien vers le commentaire
Partager sur d’autres sites

Pod,

Au delà des capacités en programmation, il peut être difficile de comprendre la logique d'un programme qui n'est pas le sien. J'ai mis pas mal de temps avant de bien comprendre les réalisations de Philippe.

Pour la modification du firmware, en effet j'en ai déjà entendu parler mais il me semble qu'une fois la modification faite, il devient impossible de reprogrammer l'Arduino, à moins de remettre le firmware avec un autre Arduino. Je crois que Philippe en parle sur sa page.

Pour la commande Serial.flush(), si je me trompe pas c'est surtout important quand l'Arduino recoit des données par le port série. A creuser.

En effet, calc_D() sert à calculer le délai pour déclencher l'étincelle au moment voulu et Davant_rech le temps avant mise en charge de la bobine pour respecter le rapport cyclique de 30% OFF 70%ON sur un cycle.

Pour le Tcor, en fait c'est assez simple: le délai D représente le temps à appliquer entre la détection de la cible et le point d'avance. Mais avant d'appliquer ce délai, il doit être calculé et ce calcul prends un certain temps (330µs dans mon programme). Ce temps "mort" est donc pris en compte et retranché de D. La méthode que j'ai utilisé pour le déterminer est la suivante: Je prends la valeur de micros() en début et en fin de calcul et je fait la soustraction.

Entre les deux graphiques oui la différence est l'utilisation du Timer. Je le lance à la fin de calc_D avec l'instruction suivante: Timer1.initialize(D); cette instruction lance un compte à rebours en tache de fond et déclenche une interruption logicielle une fois le compte à rebours terminé. Et c'est le gros avantage du Timer: il travaille en temps masqué contrairement à une attente type delay() qui met le programme principal en pause.

Pour les essais avec interruption j'ai bien utilisé un déclenchement sur front.

En effet c'est bien plus facile à visualiser avec un chronogramme, ça m'a pris un peu de temps mais une image vaut mille mots ?

Pour finir, le connecteur: bien joué !! C'est le bon, et pas cher en plus ?

Lien vers le commentaire
Partager sur d’autres sites

@Pod :

 

https://fr.aliexpress.com/item/1005001621004246.html?spm=a2g0o.order_list.0.0.1cb65e5bA3G5gj&gatewayAdapt=glo2fra

 

https://fr.aliexpress.com/item/1005001972682621.html?spm=a2g0o.order_list.0.0.1cb65e5bA3G5gj&gatewayAdapt=glo2fra

 

si ça peut t'aider ;)

 

@Toine5013

Tu verras, mais les interruptions ne fonctionnent pas toujours, et pour ma part le boitier pour lequel nous avions échangé n'a jamais fonctionné au delà de 4500tr/min avec les interruptions.

J'ai refais le code avec delay, et là c'était parfait, ça tourne d'ailleurs tout les jours depuis des mois ;) 

Alors j'ai pas tes connaissances effectivement, mais après avoir eu un gros coup de main d'experts en arduino pour essayer de comprendre pourquoi les interruptions ne fonctionnaient pas sur ton programme, ils m'ont bien confirmé que les interruptions peuvent parfois être très capricieuses...car en effet sur le papier le code que tu m'avais fait été parfait, mais en pratique il y avait ce problème de limitation de régime.

 

Une autre solution m'a été apportée avec des conditions, toujours pour le même programme, si tu veux je t'enverrai ce qui a été fait (qui fonctionne aussi pour le même programme) mais c'est une usine à gaz !

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines plus tard...

Salut à vous !

J'ai peut être (je dis bien peut être) des nouvelles intéressantes concernant les interruptions: après avoir essayé différentes pistes pour localiser un problème de programmation, j'ai fini par simuler le signal du capteur hall par le PWM d'une autre broche, connectée à la broche n°2. Les interruptions et le calcul du régime sont stables au tr/min près ! 

Ma théorie est la suivante: la détection par interruption exige pour fonctionner correctement un signal plus propre que la méthode "traditionnelle". Je pense que l'utilisation du pull-up interne à l'arduino y est pour quelque chose: avec un pull up interne, le courant de tirage est de 0,1 mA. Assez faible ce qui rend le signal plus sensible aux parasites @Pod

Voici l'extrait d'un article sur le pull-up trouvé sur le net:

Il y a toutefois d’autres considérations plus difficiles à quantifier :

  • Si la ligne est capacitive, le temps de montée du signal augmente avec la valeur de la résistance. L’effet est certainement négligeable pour un interrupteur actionné manuellement.
  • Si la résistance est trop élevée, le courant qui circule devient très faible et si sa valeur devient proche du courant de fuite le comportement n’est plus celui attendu, sachant en plus qu’un faible courant peut être plus facilement perturbé par le bruit électromagnétique présent sur la ligne

Pod, est ce que tu confirme ? 

Souvenez vous, j'avais mesuré le courant de tirage de la broche 6 du module à 3.3mA (celle qui initialement se branche au signal du capteur), ce qui veut dire que le capteur Hall supporte cette valeur. Valeur également supportée par la broche de l'arduino.

Je vais donc essayer d'utiliser un pull-up externe de 1500ohm, ce qui me donnera 3.3mA, et voir comment ça se comporte. 

A suivre... 

Lien vers le commentaire
Partager sur d’autres sites

Il y a 12 heures, Toine5013 a dit :

 

Ma théorie est la suivante: la détection par interruption exige pour fonctionner correctement un signal plus propre que la méthode "traditionnelle". Je pense que l'utilisation du pull-up interne à l'arduino y est pour quelque chose: avec un pull up interne, le courant de tirage est de 0,1 mA. Assez faible ce qui rend le signal plus sensible aux parasites @Pod

Voici l'extrait d'un article sur le pull-up trouvé sur le net:

Il y a toutefois d’autres considérations plus difficiles à quantifier :

  • Si la ligne est capacitive, le temps de montée du signal augmente avec la valeur de la résistance. L’effet est certainement négligeable pour un interrupteur actionné manuellement.
  • Si la résistance est trop élevée, le courant qui circule devient très faible et si sa valeur devient proche du courant de fuite le comportement n’est plus celui attendu, sachant en plus qu’un faible courant peut être plus facilement perturbé par le bruit électromagnétique présent sur la ligne

Pod, est ce que tu confirme ? 

Souvenez vous, j'avais mesuré le courant de tirage de la broche 6 du module à 3.3mA (celle qui initialement se branche au signal du capteur), ce qui veut dire que le capteur Hall supporte cette valeur. Valeur également supportée par la broche de l'arduino.

Je vais donc essayer d'utiliser un pull-up externe de 1500ohm, ce qui me donnera 3.3mA, et voir comment ça se comporte. 

A suivre... 

Salut Antoine,

Intéressant tes progrès avec les interruptions, je pense que le code sera bien plus performant avec.....

Oui dans un milieu perturbé un courant trop faible rend le signal plus sensible aux parasites, ces affirmations sont justes et c'est donc une bonne idée de tenter une résistance de tirage plus faible. Placer une diode zener 5v sur l'entrée et des condensateurs de filtrage pourraient améliorer la qualité du signal également.

Pour ton capteur à effet Hall il fonctionne avec ce que l'on appelle en électronique une sortie à collecteur ouvert. il utilise un détecteur de champ magnétique produit par l'aimant qui pilote ensuite un transistor bipolaire. Tu as mesuré 3.3 mA et ce courant dépend de la résistance interne de tirage du module électronique (résistance indispensable pour qu'une sortie à collecteur ouvert fonctionne justement). 

Sur l'exemple du capteur hall ci-dessous (A3144)  la sortie du transistor bipolaire peut aller jusqu'à 25 mA, sans aller si loin avec tes 3.3 mA tu es dans le bon, tu peux même tenter 5 mA par exemple voir 10 mA si nécessaire à mon avis sans avoir d'autres soucis.

image.png.ff6742796ac9f04db6722021af5dba1f.png

De mon coté j'attends toujours mes connecteurs pour réaliser le faisceau proprement afin de refaire des essais de calage de mon allumeur. A suivre également :)

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut à tous !

Grande nouvelle, le problème d'interruption capricieuse est réglé !

Bilan: ça ne venait pas d'un problème de signal mais bien un problème logiciel.

(Ca ne m'empêchera pas de passer sur un Pull-up externe à l'avenir)

En fait l'ISR n'appréciait l'appel à micros() et le lancement du Timer1 via la librairie Timerone.h.

J'ai contourné le problème en configurant manuellement le Timer.

Au passage de la cible, je calcule directement la période avec le comptage du Timer1, et le remet à zéro.

Le Timer1 peut déclencher des interruptions par comparaison avec une valeur donnée.

771873756_LogigrammeAEPLISR.thumb.png.bbaf446a29005077f658cb67ca8cd7e8.png

Sur le schéma ci desssus, la ligne rouge représente la valeur de comptage du Timer.

Finalement, c'est beaucoup plus simple ainsi et la loop() est désormais totalement indépendante. Ca va me permettre de revoir toute l'architecture du programme.

Voici le bout de code correspondant:

volatile int unsigned long overflow_count = 0;
volatile int unsigned long T = 0;
volatile bool etincelle = 0;
volatile int unsigned long D = 0;
volatile int unsigned long Davant_rech = 0;

/*
 Version d'essai pour validation fonctionnement par ISR
 Fait fonctionner le moteur avec une avance fixe

 Une ISR est déclenchée au passage de la cible:
 Le Timer 1 est remis à 0 en début de période.
 3 ISR sont configurées sur ce timer:
 -la première quand la valeur Timer atteint la valeur A correspondante à D => l'étincelle est déclenchée
 -la deuxième quand la valeur Timer atteint la valeur B correspondante à D + Davant_rech => la bobine est mise en charge
 - la troisième en cas de débordement du Timer (il peut compter jusqu'à 524ms avant de déborder)
 cette troisième ISR sert à compter les périodes T supérieures à 524ms, elle ne sert donc que pour les régimes inférieurs à 115 tr/min
 */

void setup() {
  Serial.begin(115200);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, OUTPUT);
  cli(); // désactive les interruptions
  EICRA  = 0b000000010; // Règle l'interruption broche D2 sur FALLING
  EIMSK  = 0b000000001; // Autorise les interruptions sur D2
  TCCR1A = 0b000000000; // Règle le Timer1
  TCCR1B = 0b000000011; // Règle le prediviseur Timer1 à 64 => 1 clock = 4µs
  TIMSK1 = 0b000000111; // Autorise les interruptions par comparaison registre OCR1A,  OCR1B, et overflow
  sei(); // Réactive les interruptions
}

ISR(TIMER1_COMPA_vect){ // ISR qui déclenche l'étincelle
    digitalWrite(3, HIGH);
  }
ISR(TIMER1_COMPB_vect){ // ISR qui remet en charge la bobine
  digitalWrite(3, LOW);
}

ISR(TIMER1_OVF_vect){ // ISR déclenchée par overflow Timer1 (pour calcul période T)
  overflow_count++;   // Compte le nombre de débordements
  TCNT1 = 0;          // Remet Timer 1 à 0
}
ISR(INT0_vect){ // ISR déclenchée par le passage de la cible
  T = overflow_count*65535 + TCNT1; // Calcul la période en cycles horloges
  TCNT1 = 0; // Remet le Timer à 0
  overflow_count = 0; // Remet le compteur overflow à 0 pour le prochain calcul
  T = T * 4; // Convertit les cycles d'horloge en unité de temps (un cycle = 4µs)
  D = T / 180 * 50; // Calcule le délai avant étincelle (pour respect avance allumage)
  Davant_rech = T * 3 / 10; // Calcule le délai avant recharge bobine (pour respect Dwell)
  OCR1A = (D/4-2); // Fixe le seuil d'interruption
  OCR1B = ((D + Davant_rech)/4-2);
}

void loop() {
}

 

Affaire à suivre !

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines plus tard...

Salut Antoine,

Suite à tes commentaires a propos des interruptions je me suis amusé à refaire le circuit électronique de philippe Loutrel sur un logiciel de simulation pour avoir une idées des courbes que peuvent donner ton code de test.
Voici le schéma. J'ai mis un signal de 33.3Hz sur la borne 2 de l'arduino. Si je ne me suis pas trompé ça doit correspondre à un régime de ralenti de 1000 tr/min. Sur ce signal j'ai laissé un rapport cyclique de 50/50 au lieu de 30/70 environ sur un allumeur.
Sur l'article ci-dessous j'ai trouvé les caractéristiques ( page 41) des bobines d'allumages et en relisant cet article (60 pages quand même!!) j'ai bien compris pourquoi c'est important de limiter le courant de charge dans une bobine de faible résistance(Bobines inférieures à 1 Ohm). 
http://hackerschicken.eu/electric/bobines.pdf

Voici le circuit avec uniquement le transistor IGBT. Pour retrouver les bons signaux j'ai permuté les HIGH et LOW de la D3 pour le déclenchement des interruptions comme il n'y a pas le module électronique ici.

image.thumb.png.0fbd9a48a3d682aa7388f577411e736f.png

Lien vers le commentaire
Partager sur d’autres sites

Pour les courbes voici ce que l'on obtient.

image.thumb.jpeg.8ea5b82bb02675ac8292378de6296216.jpeg

 

En jaune c'est le signal du capteur hall, en bleu le signal de commande de l'IGBT et en violet la tension sur le secondaire haute tension de la bobine d'allumage avec le pic négatif qui représente le déclenchement de l'étincelle.

Un cycle du capteur Hall représente 180° de rotation de vilebrequin (ici La période T est de 30ms car f 33.3 Hz)

J'ai un déclenchement d'étincelle à 50° du front descendant grace au calcul de D = ((T / 180) * 50). Si le capteur est calé à 70° avant PMH comme on peut le voir sur tes graphiques ça donne une avance fixe de 20°.

Sur ton code par contre j'ai pas trop compris le raisonnement de calcul des OCR1 et OCR2. OCR1A = (D/4-2) et OCR1B = ((D + Davant_rech)/4-2). Je me demande pourquoi il y a -2 à chaque fois...

TCNT1 avant reset du timer donne 7450 comme valeur. On a donc 7450 * 4 us = 29.8 ms on retrouve bien la période de mon signal de 33.3 Hz qui est de 30 ms.

Par simulation j'ai vu que OCR1A= 2076 au moment du déclenchement de ISRA (étincelle) et que OCR1B = 4328 pour ISRB (Charge de bobine) a voir si c'est cohérent avec ce que tu voulais faire sachant que pour cette fréquence de 33.3 Hz on a le timer = 7450 pour nos 180° de rotation de vilbrequin.

 

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut !

Génial ton logiciel de simulation, c'est pile poil ce qu'il me faudrait pour avancer mes projets. Où peut-on le trouver? Il est payant?

Effectivement le comportement que l'on voit sur le scope est exactement celui désiré.

Pour OCR1A, D correspond au délai à appliquer entre le passage de la cible et l'ISR pour déclencher l'étincelle au bon moment. D en microsecondes divisé par 4 donne un D en cycles horloge. Je retranche 2 cycles horloge au résultat pour faire une correction car j'ai constaté un léger décalage entre le théorique et le réel. J'ai pas vraiment d'explication pour ça.

Pour OCR1B, on doit mettre la bobine en charge 54° après l'étincelle (3 dixièmes de 180°). Du coup, dès le passage de la cible je configure le registre pour déclencher la charge bobine dans un délai correspondant à D + Davant_rech (les 50° pour l'étincelle + les 54° d'attente avant mise en charge). Je divise également ce délai par 4 pour le convertir en cycles horloge et je retranche 2 cycles pour la correction.

OCR1A = 2076, c'est cohérent: ça représente les 50° sachant que 180° font 7450

OCR1B = 4328, ça colle également: ça représente les 50° + les 54° d'attente avant mise en charge.

 

Par contre, j'ai fait des essais en peu plus poussés sur ma voiture, même si c'est mieux en configurant manuellement les Timers, j'ai toujours le problème d'interruption capricieuse... Alors peut-être qu'il pourrait être résolu en utilisant des artifices supplémentaires pour filtrer, mettre en forme le signal etc, je pense que pour ce que l'on fait le jeu n'en vaut pas la chandelle et je reviens donc pour les prochaines versions à l'ancienne méthode de détection de la cible, à savoir en pooling dans la loop().

Comme on l'avait dit, sur un 4 cylindres, à 7000tr/min ça nous laisse 4,2ms entre deux passages de cible pour exécuter des fonctions: Il y a de la marge !

C'est une petite déception mais tout ce travail a été loin d'être vain car j'y ai appris entre autres à manipuler les Timers "à la source" et ça offre bien plus de souplesse et de possibilités qu'en passant par les bibliothèques.

Par exemple, avec un seul Timer, j'ai réussi à piloter deux sorties de façon indépendantes (pour faire fonctionner deux paires d'injecteurs en semi-séquentiel), là où en passant par les bibliothèques on ne pouvait piloter qu'une seule sortie et donc faire de l'injection simultanée. J'ai également réussi à gérer en parallèle une pompe à essence électrique. Ca peut servir pour ceux qui veulent alimenter leurs carbus ainsi.

Autre chose, j'ai aussi pu valider l'utilisation de bobines jumostatiques => à suivre...

Pour ma pomme, j'avance également sur mon projet d'injection et je vais changer d'arduino pour passer sur du méga pro mini: à peine plus gros qu'un Nano, mais plus de mémoire et surtout 5 Timers dont 4 en 16bits ! Là, il y a moyen de faire de l'injection séquentielle phasée et bien d'autres choses encore.

Je reparlerai de tout ça en temps voulu ?

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois plus tard ......

Des nouvelles de mon allumeur AEPL

J'ai un peu bossé dessus ce week-end après avoir refait un faisceau propre coté capteur hall.

Pierre, Antoine , grâce à vos conseils j'ai compris comment fonctionne le calage et comment déterminer l'angle de calage du capteur pour le déclenchement d'étincelle au PMH1 etc...(Angle capteur 50° environ chez moi avec déclenchement sur front descendant )

Antoine je ne peux toujours pas utiliser ton programme en copié collé car j'ai toujours la version toute simple de Philippe avec un simple transistor IGBT et sans le module électronique TSZ-H mais je compte modifier tout ça bientôt et je resterais sans capteur à dépression pour l'instant.

J'ai fait des essais et j'ai un problème de coupure qui se produit de façon régulière toutes les 2 ou 3 secondes environ quand je suis au régime de ralenti.

Apparemment dès que j'accélère ça ne le fait plus.
ça me laisse supposer que ça pourrait venir d'une histoire de mémoire qui se réinitialise ou d'une fonction qui s'exécute dans le programme et qui fait une coupure....
En écrivant ces lignes je me dit que c'était peut-être l'ordi connecté dessus car je le laissais sur le port usb pour avoir accès au moniteur série pendant les essais
Sinon si vous avez d'autres idées........? Ce sont des essais qui ont étés fait avec plusieurs versions du programme de Philippe. La dernière et des plus anciennes aussi......

Antoine à propos de mon logiciel de simulation je t'avais écrit ici en message privé et je crois que tu ne l'as pas vu.....

A+

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an plus tard...

Bonjour !

et "pardon" de vous embêter, "suatter" etc 😉...au sujet de l'AEP duino arduino etc j'ai bien entendu lu un max de choses dont Monsieur Loutrel, car je voudrais essayer de fabriquer un tel allumage pour une SIMCA 1000 ...( aie aie aie, ils vont me jeter ...)  avec un capteur bosch comme le votre installé dans un allumeur de SIMCA 1000,  rien que cette partie n'est pas si fastoche, un pote va me donner la main) nous partirions sur un seul capteur dans l'allumeur. rien sur volant moteur etc 

VOICI ma question IDIOTE SVP .... tres idiote mais ...je n'ai vue la réponse nulle part 

que faire de l'avance centrifuge c'est à dire des ressorts et masselottes ... je n'arrive pas à comprendre comment la courbe entrée dans l'arduino fonctionne avec la courbe d'avance centrifuge mécanique .. faut il systématiquement la supprimer ( tout bloquer) OU bien l'arduino est ils capable d'ajuster et d'appliquer sa courbe malgré ces changement "mécaniques" ?? 

... et MERCI ! 

amidlamil

Lien vers le commentaire
Partager sur d’autres sites

Salut amidlamil,

 

L'allumeur électronique de Philippe Loutrel remplace l'avance centrifuge d'un allumeur d'origine donc si tu utilises le capteur dans l'allumeur il faut en effet boquer la mécanique centrifuge de ton allumeur pour que je capteur ne bouge plus de se position de calage initiale.

 

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.


  • Slide Performance

    Coxobus en Seine et Marne

    Bugs Are Us

    Initial Cox

    Speed Shop

    Feller Service

    Car Concept

    AG Syncro Boite Vitesse VW et Porsche

    Mecatechnic

    Vintage Autohaus

    Microprix Pieces VW Cox et Combi
  • Messages

    • Ne t'énerves pas , ceux qui t'on répondu sont connus et reconnus. Tu prends les choses a l'envers. Démontes ton moteur, vois ce qu'il faut faire pour le remettre en état ton carter. Ça sera peut-être rien rien ,on ne peut pas savoir. Une fois ton carter en état on pourra te dire suivant tes demandes et ton budget ce qui pourrait coller a tes attentes 
    • Ben non en tout cas pas les by-pass j’ai effectivement changé les gicleurs, les buses et autres…mais j’ai jamais touché à ça 🤔
    • ok merci  sujet bien expliqué je dois avoir on le modèle manuel ou celui commandé par les volets moteur mais il en manque une partie 
    • Le forum sert a rien si on peut pas demander des conseils de prépa ou autre... Et le problème de chauffe il a apparue plus tard car il ma mis la sonde fonctionnelle mais il avait des doute sur la chauffe du moteur mais après un appelle il m'a dis touche l'huile à la jauge si l'huile est pas chaude ton mano fonctionne mal comme celui ci était à 120 degrés Le faire moi même autant sans expérience c'est pas une bonne idée J'ai rien demandé au mécano donc il peut pas inventé une histoire qu'on viens de créer hier soir fin que moic ma dis de verifier.    
    • Moi je comprend plus rien a ton histoire. Tu as apparemment un spécialiste VW qui s occupe de toi et qui serait donc en mesure de te conseiller et de te proposer une config. Alors pourquoi ne pas d'abord discuter avec lui d une config et des interventions a prévoir sur ton moteur et le cas échéant si tu n es pas convaincu, de voir ce qui peut s améliorer....et encore. Tu vas lui dire quoi au pro quand t arriveras avec une config ?: "Fait moi ça !!! ???" Sur un bloc peut être mort ! Reprend les choses dans le bon ordre, contacte ton pro discute du sujet et du projet ensuite si ça te convient pas, cherche un autre pro ou alors fait le toi même et on sera la pour t orienter mais ca ne se fera pas sans un minimum de lecture de ta part....
  • Évènements à venir

×
×
  • Créer...