Considérations électroniques

Compte-tours sur un rupteur

Présentation

Dans le cadre du projet de l'ordinateur de bord pour voiture de collection, j'ai du developper une entrée compte-tours sur la carte Acquisition.

Présentation d'un allumage à rupteur

schema allumage Sur le schema ci-contre (source wikipedia) on voit que la bobine est en fait un transformateur avec le primaire et le secondaire reliés à la masse (toutes les masses étant communes, bien sur !). On voit que le rupteur est au primaire de la bobine, donc sur le circuit 12V. Du coup, en théorie dans le plus beau des mondes, on devrait avoir un signal 12V carré avec quelques rebonds à cause du rupteur, mais un signal carré quand même, facile à traiter.

Le Problème

oscillo etincelle 200V Le problème, c'est que dans le vrai monde, on a un retour de l'étincelle sur le primaire de la bobine, d'environ 200~250V. L'image ci-contre est un relevé du rupteur de mon estafette au ralenti. J'ai utilisé un pont diviseur pour avoir une echelle verticale de 100V/division (soit 250V de pics). Je rappelle quand même que de l'autre coté, sur la bougie, la tension monte à 10~15 kV !
Il faut donc trouver un filtre électronique pour filtrer le 250V et sortir du signal le carré 12V qui nous interresse. Comme on aime bien le challenge, il faut penser que ça peut changer d'une voiture à l'autre…
On note que les pics sont espacés de 43 ms environ, ce qui fait 23 Hz, ce qui fait à raison de 2 étincelles par tours 697 trs/minutes… on est bien sur le ralenti de l'estafette ;-)

Question de fréquence

oscillo etincelle On va déjà observer les fréquences de tout ça. Ci contre, une sonde d'oscilloscope placée sur le rupteur de mon estafette, en direct, à 20V/division verticale (sonde à facteur 10)

  • On observe sur le signal ci-contre une fréquence à l'ouverture du rupteur (front montant 12V) de 6000 Hz environ. C'est ce phénomène qui atteind 250V
  • On observe aussi une fréquence à l'ouverture du rupteur (front descendant 12V) de 2000 Hz environ. Cette perturbation est plus modérée, environ 70V
  • Moteur : sur un 4 cylindres, à 2 étincelles par tours, on est donc à 266 impulsion/seconde à 8000 trs/minutes (ce qui est déjà beaucoup !)

Un peu de maths

courbe gain Il faut donc laisser passer le 12V à 266Hz et bloquer le 250V à 6000Hz ainsi que le 50V (frond descendant) à 2000Hz.
Un filtre passe bas du 2nd ordre avec une fréquence de coupure vers 300Hz doit faire l'affaire. Ci contre, j'ai placé dans un fichier excel les 3 valeurs de tension à leur fréquence respectives. J'ai placé la courbe de gain du filtre souhaité simulé en dessous. La courbe rouge ce sont les 3 pics en fréquence à l'entrée du filtre, et en vert à la sortie... Celui qu'on veut garder, c'est le plut petit pic, celui à 266Hz, celui que l'on souhaite conserver. Donc, ça sent bon !

Un peu de simulation

maquette adaptation eteincelle Comme je compte produire des millions de cartes ;-) Il faut bien faire les choses. Je vais donc confirmer mes calculs dans LTSpice. (un logiciel de simulation électronique). Je crée donc le schéma complet que je compte reprendre sur ma carte, en particulier avec une diode zener de protection en parallèlle de la première capacité.
Derrière le filre il y a aussi un passe haut qui permet de rabaisser le signal, sans quoi, à cause des pics à 250V notre signal ne serait pas entre 0 et 12V mais plutot entre 30 et 42V par exemple. (rappel : un passe bas est un moyenneur).

simulation avant Ci-contre, c'est la forme simulée du signal à l'entrée. C'est une supperposition d'un carré 12V à 500Hz (soit 15 000trs minutes sur un 4 cylindres ou 8000 trs/minutes pour un V8), avec une pertubation à 10kHz à 250V. (la fréquence n'est pas la bonne, on fait ce qu'on peut)

simulation filtree

Et maintenant, c'est la superpoistion du signal d'entrée avec le signal de sortie (en rouge). On voit que les perturbations sont très bien amorties, il ne reste qu'un pseudo-sinus à la fréquence du carré de 12V. Et voila.

Intégration dans la carte Acquisition

carte filtre Ici, j'ai reporté le schéma dans la carte Acquisition. La première résistance n'est pas intégrée, elle doit être le plus près possible du rupteur.

oscillo carte filtre 01Ci-contre le signal du rupteur, et celui à la sortie du filtre sur la carte pour de vrai dans l'Estafette. Le front montant ne présente aucune oscillation, et le plateau est très propre, à une valeur de 4V (le STM32 est 5V tolérant)

oscillo carte filtre 02Même chose en zoomant, le signal de sortie du filtre est très propre.

Segmentation d'un réservoir

Pour que l’ordinateur de bord puisse connaitre la quantité d’essence restante dans le réservoir, il faut connaitre la relation entre la tension V à la jauge et la quantité Q de carburant restant dans le réservoir. J’appelle cette fonction V = f(Q)
C’est je pense une des manip les plus pénibles à réaliser.

reservoir 01 J’ai appelé cette manip la calibration du réservoir. Je l’ai réalisé juste après la rénovation du réservoir (voir ce lien). Le problème, c’est qu’un réservoir n’est pas linéaire. Je veux dire par là (un peu de maths) que la tension V n’est pas du tout du type V = a*Q avec Q la quantité d’essence. Si c’était le cas, il suffirait de connaitre la tension au réservoir plein. Ce serait trop facile, voyons !

  • Lorsqu’on est à 0 V, le réservoir n’est pas vide (la jauge ne touche pas le fond) : il y a un offset.
  • La courbe n’est pas linéaire : le réservoir n’est pas carré (le dessin ci-contre montre un réservoir d’estafette) et le flotteur de la jauge (en orange ci-contre) n’a pas un mouvement droit non plus.

reservoir 02 Dans ce cas, une solution facile : La courbe par segments. Le principe est de dire que la courbe V = f(Q) est linéaire par segments. Pour connaitre ces segments, il faut remplir le réservoir par petites quantités successives et lire la tension à la jauge avec un voltmètre, ou directement l'ordinateur. Si le reservoir fait 40 litres, on mets 10 quantités de 4 litres (par exemple), et on lit le multimètre à chaque fois. Nous aurons donc 9 segments. On peut augmenter le nombre de segments, mais bon c’est un reservoir, faut pas chercher une précision millimétrique non plus.
Le mieux est évidement de partir de 0 (réservoir vide) et de pousser la voiture à une station-service. Les pompes des stations sont très précises et calibrées régulièrement, ce serait dommage de s’en priver. C’est pas la peine d’y aller aux heures de pointe non plus… On revient donc avec un tableau de valeurs, par exemple celui ci-contre.
Il faut également mesurer la tension de la batterie et que celle-ci ne bouge pas pendant toute la durée de la manip. Si elle venait à bouger, il faut noter la tension à chaque mesure et compenser par la suite.

reservoir 03 Après ça, il faut créer la courbe V en en fonction de Q. Un peu d’excel et hop : Comme ça on voit à quoi ressemble la courbe, et surtout si c’est ou non linéaire. Surprise, dans le cas de l’estafette, on est pas mal, j’aurais pensé à pire.
Pour le reste, je vous épargne les détails compliqués parce que mon programme fait le reste. En gros, chaque segments est une portion d’une droite de type y=a*x + b, ça doit vous rappeler des souvenirs d’école !

reservoir 05 Il faut créer un dernier segment qui est la tension mesurée de la batterie lors du relevé. L'algorythme va compenser par un produit en croix ses mesures pour les ramener sur la courbe. Ici, j'ai diminué le nombre de segments, et ajouté un dernier segment qui atteint la tension de la batterie lors du test (faible la baterie !). La quantité doit être la même que dans la ligne du dessus.

reservoir 04 Mais ça c’est geré dans le fichier Capteurs.py, et en créant votre objet capteur, vous passez en argument les points du tableau. Et c’est tout.
Voir les fichiers param.py et Consommation.py du programme de l'ordinateur de bord…

Et voila…

Implémentation d'une sonde PT100

Les PT100 sont des sondes de température à la plage beaucoup plus étendue que les CTN 47k que j’ai choisi par défaut. Les valeurs des PT100 oscillent entre 60 Ω à -100°C et 247Ω à 400°C (plage large pour notre besoin) et même bien au delà.

Documents liés :

pt100 sch00 Le schéma par défaut pour brancher une sonde est celui ci. Mais ici ça ne marche pas parce que la sonde varie en gros de 92Ω à 175Ω, ce qui est insignifiant devant la 47kΩ + 10kΩ Les valeurs sont :

  • Temp : LSB
  • -20 : 1304
  • 0 : 1304
  • 100 : 1303
  • 200 : 1303
  • CC : 4096 (non destructif)
  • CO : 0
Youhou, avec ça, on va aller loin.

pt100 sch01 On va donc charger en courant la sonde. Pour ce faire, il faut créer un pont diviseur avec la sonde comme sur le schéma ci contre. Le problème, c’est que la carte Acquisition ne peut lire des tensions qu’entre 0 et 3,3V. Elle tolère cependant des tensions de 5V sur le STM32. Pour ramener dans la plage 0 – 3,3V la tension sur le connecteur, j’ai mis un pont diviseur par 5,7 (47kΩ suivit de 10kΩ, R1 et R2 sur le schéma ci-contre).
Dans ce schéma avec les valeurs d’origine de R1 et R2, si la sonde est en court-circuit, on obtient une valeur importante (donc détectable) mais pas dangereuse pour l’électronique. Si la sonde est ouverte, on obtient 0.

  • Temp : LSB
  • -20 : 1142
  • 0 : 1201
  • 100 : 1441
  • 200 : 1619
  • CC : 0
  • CO : 2997
On a donc 477LSB de dynamique soit 2,17 LBS/°C. C'est pas terrible. Le STM32 fait ses mesure sur 12 bits ce serait dommage de pas en profiter un minimum ! (imaginez si c'était un arduino ;-) )
Les défaut sont détectables.
Avec ce pont diviseur R1 R2, c’est quasi impossible de brancher une PT100 en gardant une bonne précision.

pt100 sch02 Je change mon fusil d'épaule et éxamine mieux mon montage. Le plus gros risque de défaut est une déconexion de la sonde. J'opte alors pour brancher la sonde au +12V (13,8 en fait…) et place la résistance de "150Ω" en dessous. Ainsi, je me permet de modifier mon pont diviseur, je ramène R2 à 27kΩ.
Si le point VR1 venait à 14V, on a 5V sur le STM, ça tombe bien il est 5V tolérant, et de toutes manières la 47kΩ limiterai le courant. Avec cette configuration, on a la table ci contre :

  • Temp : LSB
  • -20 : 3654
  • 0 : 3530
  • 100 : 3023
  • 200 : 2654
  • CC : 4096
  • CO : 0
On a maintenant une dynamique de 1001 LSB, avec une précision de 4,55 LSB/°C. C'est beaucoup mieux !
Vous avez tout, il faut changer la résistance R2 par 27kΩ et mettre une 130Ω de charge sous la sonde. Contactez moi pour plus d'info, et contactez-moi pour faire le changement avant dans votre projet !

Dans l’avenir, je prévoirai une alimentation spécifique 5V pour alimenter des sondes 5V.

Note : je considère que la batterie n'est pas à 12V, mais à 13,8 en fonctionnement normal, et peut monter à 15 voir 18V en pic. la datasheet du STM32 indique que ses entrées sont 5V tolérant et qu'on peut envoyer 5mA dedans. Une batterie à 18V qui force une entrée à travers une résistance de 47kΩ, je vous laisse faire le calcule. On est en dessous. Il s'agit d'un cas de 2nd défaut parce que 1) on a un court-circuit batterie sur l'entrée et 2) la tension est vraiment trop élevée.

Note 2 : Attention : à l'heure où j'écrie ces lignes, je n'ai pas encore implémenté ça dans mon code, et pas encore testé, la probabilité que ça ne marche pas comme sur le papier n'est donc pas nulle ;-)

NÉNÉSite 1999-2019 by JumpifNotZero

Tout ce site et ses composants sont faits sur Mac