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.
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, 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 ;-)
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)
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 !
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).
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)
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.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.
Ci-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)
Même chose en zoomant, le signal de sortie du filtre est très propre.
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.
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 !
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.
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 !
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.
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…
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à.
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 :
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.
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 :
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 ;-)