Jump to content

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

 

Link to comment
Share on other 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 👍

Link to comment
Share on other 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 !

Link to comment
Share on other sites

  • 2 weeks later...

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... 

Link to comment
Share on other 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 :)

 

 

Link to comment
Share on other 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 !

Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other 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.

 

 

 

Link to comment
Share on other 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 😁

Link to comment
Share on other sites

  • 1 month later...

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 modifié tout ça bientôt mais 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+

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


  • Vintage Autohaus

    Coxobus en Seine et Marne

    Microprix

    Slide Performance

    AG Syncro Boite Vitesse VW et Porsche

    Serial Kombi

    Initial Cox

    Speed Shop

    Feller Service

    Mecatechnic

    Bugs Are Us

    Car Concept
  • Posts

    • Le 1300 F fait 40 ch soit 29,42 kW
    • Bonjour .   Tape ta réference 02816010......... quelque chose, sur ta photo on ne voit pas la fin de la ref. Mais en tapant le début, sur ebay il y en a ... à voir...
    • Salut ca y est les pièces carrosserie on été commandé hier . Maintenant il faut que j'attaque le chassis pour pouvoir continuer la caisse . Car j'ai les deux longerons col de signe et traverse arrière.......  
    • Bonjour, Avec le kit 96mm, la cylindrée augmente évidemment et avec le volume sur les pistons réduits. Ces deux changements augmentent le rapport volumétrique de manière conséquente et si c'est pour monter avec un refroidissement d'origine sur un bus en boite longue il faut retarder le moment où la soupape d'admission se ferme pour aller de paire avec le rapport volumétrique élevé Les soupapes sont petites pour la cylindrée ce qui limite le couple maxi surtout avec une carburation centrale. Avec cette carburation centrale il faut éviter d'avoir trop de croisement c'est à dire le temps pendant lequel les soupapes d'admission et d'échappement sont ouvertes en même temps, cela va limiter le couple maxi et la puissance maxi mais surtout cela va permettre d'avoir un ralenti stable et une progression jusqu'à 2000 tr/mn propre avec une plage d'utilisation large et une courbe de couple assez stable en évitant de trop faire chauffer les culasses à cause du rapport volumétrique élevé. Pour d'autant plus sur un T2 lourd il faudrait acquérir chez webcam un modèle #62 en 110° d'angle entre cames - sur commande directe avec un bon mois de délai  >> avec ce montage je te conseille le montage de ressorts renforcés simples de T1 ,les poussoirs mécaniques webcam avec des coupelles chromoly de T1>. Si le moteur est en poussoirs hydrauliques il faut également changer les tiges de culbuteurs qui vont devenir trop courtes, pourquoi par des modèles alu d'origine de moteurs à poussoirs mécaniques (1.7, 1.8 et 2.0L première génération) Avec cette distribution il faudra surveiller le jeu entre les écrous de la pompe d'origine et les vis d'arbre à cames, sinon le reste est simple à monter. Le moteur sera nettement plus puissant qu'avec l'arbre à cames d'origine et acceptera un peu plus de tour/ minutes sans sacrifier le ralenti et les bas régimes et surtout cela permettra d'utiliser le rapport volumétrique qui va passer de 7.3:1 à plus de 8:1  
    • Ok merci En fait quand je décélère un sifflement est audible dans l’habitacle qui correspond à cette soupape de décélération. du coup ça ne se trouve pas en neuf ? ça ne peux pas se réparer ? si tu as un plan ou me dire où je peux en trouver ça m’intéresse ci joint des photos de ma soupape   
  • Upcoming Events

×
×
  • Create New...