Empêcher les interférences lors d'interruptions (python)

J’ai conçu un hat pour Raspberry Pi. L’objectif principal de ce Hat était de contrôler la vitesse de deux ventilateurs via deux sondes 18B20.

J’ai écrit un programme en python pour gérer le signal PWM envoyé aux ventilateurs et récupérer les températures des sondes. Tout cela ensuite géré par une interface web (.Net Core). J’ai utilisé les interruptions pour récupérer les infos des tachymètres des ventilateurs. Sur la V1 de ma borad, tout fonctionnait parfaitement. Le problème c’est que j’avais utilisé un LM1805 pour réguler la tension de 12v à 5v et ce composant n’est pas fiable.

Après quelques recherches j’ai donc fait une V2 avec cette fois-ci un LM2596. J’en ai profité pour ajouter d’autres capteurs : un SHT-31DIS pour la température interne et l’humidité et un ACS712 pour sonder la consommation (via un convertisseur MCP3004).

Maintenant avec ma V2 les interruptions donnent des chiffres erronés de manière aléatoire alors que ce n’était pas le cas avant.

J’ai essayé de jouer avec le paramètre bouncetime de la fonction add_event_detect mais cela ne convient pas. Il empêche certes les rebonds mais limite les impulsions lorsque le ventilateur est à pleine puissance. Donc par exemple avec un bouncetime à 20ms, j’obtiens un résultat précis sur les RPM des ventilateurs lorsque le signal va de 0 à 50% mais je n’ai plus les infos au-delà. À l’inverse j’ai tenté de réduire le bouncetime et j’obtiens bien le nombre de tour par minute jusqu’à 100% du signal, mais lorsque je baisse j’ai des rebonds et l’information est fausse :

Lorsque je force le signal d’un des ventilateur manuellement j’ai par exemple 1700RPM pour 23% alors que j’ai 2080 pour 100%.

En temps normal sur la V1 à 23% je devais tourner aux alentours de 600RPM.

Chose étrange :

J’ai essayé de sonder le signal du ventilateur à l’oscilloscope pour voir d’où provient le problème et lorsque je connecte la sonde au ventilateur, les rebonds disparaissent totalement et les RPM deviennent ultra précis sur toute la plage, comme sur ma V1. Mais le plus étrange, c’est que même si je débranche la sonde de l’oscilloscope je n’ai plus de rebonds. En fait, il semblerait que le simple fait de connecter la sonde, même dans le vide fasse disparaitre ces rebonds.

J’ai donc essayé de mettre un condensateur (0.22µF) mais cela ne fonctionne pas, j’ai toujours des rebonds. J’ai joué avec plusieurs valeurs mais j’obtiens le même comportement qu’avec le bounctime. Soit des chiffres précis en début de plage mais à partir d’un certain moment les RPM sont limités, soit une plage qui va jusqu’au bout et des chiffres imprécis en début de plage.

Il n’y a qu’en connectant cette sonde que tout fonctionne normalement. J’ai aussi remarqué qu’il fallait que si je déconnecte la masse de la sonde et que je ne laisse que le signal, les rebonds réapparaissent.

Pourtant, la masse du ventilateur est connecté à celle du PI, à tous les endroits via le GPIO et j’ai prévu des pistes larges et un plan de masse. J’ai tout de même testé faisant un pont avec un câble de test entre la masse du ventilo et du pi : aucun effet.

Je suis complètement perdu, j’ignore totalement d’où peuvent venir ces perturbations, j’ai lu que les interruptions étaient très sensibles à l’alimentation. J’ai essayé avec deux alims de labo différente et une alim 12v grand public, cela ne change rien.

J’ai aussi essayé de désactiver commenter le code qui récupère les valeurs des autres capteurs dans la boucle mais j’ai quand même des rebonds.

Est-ce que l’effet Hall de l’ACS712 peuvent créer ces perturbations ? Est-ce que le souci vient du LM2596 ?

Merci de votre aide.