Comment empêcher un interrupteur à bascule de rebondir comme une balle de golf tombée du toit
Les commutateurs rebondissent. C’est ce qu’ils font. C’est le cas des interrupteurs à bascule, des interrupteurs à bouton poussoir, des micro interrupteurs, des fins de course…
Si un nouveau venu dans la communauté de l’ingénierie électronique me demandait de choisir un sujet qui le suivrait tout au long de sa carrière – apparaissant quand il s’y attend le moins comme une version surréaliste de Whac-A-Mole – le sujet que je choisirais serait celui du rebond du commutateur.
Switch bounce est un concept relativement facile à comprendre, mais il peut être un petit escroc délicat à aborder avec un degré élevé de confiance. En fait, ce n’est pas strictement vrai car de nombreux ingénieurs ont été extrêmement confiants dans leur solution de rebond de commutateur, jusqu’au moment où un rebond imprévu a déclenché un événement indésirable.
Rebond des commutateurs
L’idée sous-jacente est que les contacts mobiles dans les commutateurs rebondissent. C’est ce qu’ils font. C’est le cas des interrupteurs à bascule, des interrupteurs à bouton-poussoir, des micro-interrupteurs, des interrupteurs de fin de course…
Pour les non-initiés, un interrupteur est soit Off, soit On. Lorsque quelqu’un active ou désactive un interrupteur sur un mur, par exemple, la lumière associée semble réagir immédiatement. En réalité, pendant un certain temps, l’interrupteur rebondira (s’allumera et s’éteindra) comme une balle de ping-pong lâchée sur un plancher de bois franc. Cependant, ce rebondissement – et le scintillement correspondant de la lumière – se produisent trop rapidement pour être perçus par nos systèmes sensoriels biologiques. (Il y a aussi l’inertie thermique du filament dans une ampoule à incandescence couplée à la persistance de la vision, mais ne nous égarons pas dans les mauvaises herbes.)
Par comparaison, dans le cas d’une unité de microcontrôleur (MCU) avec une horloge fonctionnant à des millions de fois par seconde, le rebond associé à chaque activation et désactivation peut être perçu comme des dizaines ou des centaines d’événements.
Considérez la borne normalement ouverte (NO) associée à un interrupteur à bascule unipolaire unidirectionnel (SPST), par exemple (Figure 1) (des SPST avec des bornes normalement fermées (NC) sont également disponibles). Observez que le rebond peut se produire à la fois sur les « bords » actifs et inactifs. En outre, que le rebond peut s’étendre jusqu’au niveau logique 0 et logique 1 (que je considère comme des « rebonds nets ») et/ou entre un bon niveau logique et un certain niveau de tension intermédiaire (que je considère comme des « rebonds sales » »).
De même, dans le cas d’un commutateur unipolaire bidirectionnel (SPDT), un rebond peut se produire sur les fronts actifs et inactifs des bornes NO et NC (Figure 2).
Notez que seuls les rebonds nets sont affichés dans cette image par souci de simplicité. En outre, nous supposons qu’il s’agit de la forme la plus courante de SPDT – une rupture avant la mise en place (BBM) – ce qui signifie que le contact mobile interrompt la connexion existante avec le lancer actuel avant d’établir une nouvelle connexion avec le nouveau lancer ( bien qu’elles soient moins couramment utilisées, des implémentations make-before-break (MBB) sont également disponibles).
Alors, combien de temps le rebond du switch peut-il persister ? Le problème ici est que beaucoup de « sagesse établie » est véhiculée par le bouche-à-oreille. Lorsque j’ai commencé en tant qu’ingénieur nouvellement créé aux yeux brillants et à la queue touffue, par exemple, un ingénieur senior m’a dit que le rebond aurait certainement cessé en 1 milliseconde (ms), donc je serais entièrement couvert si je supposais un pire -cas scénario de 2 ms. Je l’ai pris au mot. Je ne sais pas pourquoi je n’ai jamais pensé à vérifier cela par moi-même en utilisant de simples bancs d’essai (comme les circuits illustrés ci-dessus) et un oscilloscope.
Par comparaison, le gourou des systèmes embarqués Jack Ganssle est taillé dans un morceau de tissu différent parce qu’il a pris un tas de commutateurs différents, les a soumis à une analyse exhaustive (cela m’a épuisé rien que de lire à ce sujet) et a écrit son Guide to Debouncing. Jack a déterminé que les commutateurs ont rebondi pendant une moyenne de 1,6 ms avec une valeur maximale de 6,2 ms. Wow! C’était bien plus que ce à quoi je m’attendais.
Comme dernier point de données, l’un de mes amis, qui était un technicien de l’US Air Force, m’a dit qu’ils avaient supposé un scénario de rebond dans le pire des cas de 20 ms et – puisque c’est un bon nombre rond – Je suis heureux de suivre le courant. Hé, si c’est assez bon pour l’US Air Force, c’est certainement assez bon pour moi.
Alors, comment devrions-nous nous y prendre pour éviter les rebonds des signaux sortant de nos commutateurs ? En fait, nous avons deux options principales car nous pouvons opter pour des solutions matérielles ou logicielles. Pour être honnête, il existe presque autant de techniques matérielles que de concepteurs de matériel, et il existe presque autant de solutions logicielles que de développeurs de logiciels, nous n’en aborderons donc que quelques-unes ici.
Techniques traditionnelles de rebond du matériel
Commençons par quelques approches traditionnelles basées sur le matériel. Dans le cas d’un commutateur SPST, une option très courante consiste à utiliser un retard RC couplé à un inverseur de Schmitt (Figure 3).
A noter que la diode est optionnelle, mais sa présence simplifie les calculs de temporisation, ce qui peut être particulièrement utile si l’on souhaite déclencher des actions à la fois lorsque l’interrupteur est activé et lorsqu’il est désactivé. Avec la diode en place, le condensateur se charge via R1 et se décharge via R2. Si nous omettons la diode, le condensateur se décharge toujours via R2, mais il se charge via (R1 + R2).
Par comparaison, dans le cas d’un interrupteur SPDT, la crème de la crème consiste à utiliser un verrou SR formé de deux portes NAND dos à dos (deux portes NOR dos à dos peuvent également être utilisées) (Figure 4).
Pour être honnête, nous pourrions parler de ces solutions matérielles traditionnelles pendant des heures, mais cela ne sert à rien car relativement peu de concepteurs utilisent ces techniques de nos jours. Il existe également une solution matérielle plus moderne, mais d’abord…
Techniques de rebond logiciel
Les développeurs de systèmes embarqués d’aujourd’hui ont tendance à neutraliser les signaux de leurs commutateurs à l’aide de techniques logicielles. Le gros problème ici est que la majorité des développeurs de logiciels ont peu d’idées sur la façon dont fonctionne le rebond de commutateur dans le monde réel, donc souvent ils utilisent des extraits de code fournis par leurs pairs, où ce code peut ou non être aussi robuste qu’on pourrait le faire. espérer.
Il existe toutes sortes de techniques logicielles. Une approche courante consiste à utiliser un compteur. Aussi, pour faire une boucle en vérifiant l’état des choses (comme les commutateurs) et en effectuant toutes les actions associées une fois par milliseconde, par exemple. Supposons que nous attendions que la sortie du commutateur passe d’un 0 à un 1. Supposons également que nous ayons décidé d’attendre 20 ms après le rebond final avant de faire quoi que ce soit.
Nous commençons avec notre compteur contenant zéro. Après avoir détecté notre premier 1, chaque fois que nous faisons le tour de notre boucle, nous vérifions si le signal est toujours à 1. Si c’est le cas, nous incrémentons notre compteur ; sinon, nous remettons notre compteur à zéro. Ce n’est que lorsque le compteur contient 20 que nous savons que le signal a été un 1 logique constant au cours des 20 dernières ms, moment auquel nous pouvons effectuer toutes les actions souhaitées, après quoi nous commençons à attendre que la sortie du commutateur passe d’un 1 à un 0.
Maintenant, n’oubliez pas que je suis un concepteur de matériel informatique de formation, vous comptez donc sur tous les conseils logiciels que je donne à vos risques et périls. En gardant cela à l’esprit, je privilégie une autre approche logicielle que je trouve plus facile à comprendre. L’idée ici est d’avoir un registre à décalage de 20 bits, que nous pouvons implémenter en utilisant une variable entière non signée de 32 bits.
Chaque fois que nous faisons le tour de notre boucle principale, que nous supposons une fois toutes les millisecondes dans cet exemple, nous décalons le contenu de notre registre à décalage d’un bit vers la gauche, lisons l’état du commutateur et chargeons sa valeur 0 ou 1 dans le bit de poids faible (LSB) du registre. Lorsque les 20 LSB sont à 0, nous savons que le signal du commutateur est à 0 depuis au moins 20 ms. De même, lorsque les 20 LSB sont à 1, alors nous savons que le signal du commutateur a été à 1 pendant au moins 20 ms. Décider comment nous utiliserons ces informations par la suite est facile–squeezy de citron peasy. Par exemple, nous pourrions créer une machine d’état simple avec six états : ActuellementZero, TransitioningToOne, JustBecameOne, CurrentOne, TransitioningToZero et JustBecameZero.
Je suis fainéant!
J’ai peur d’admettre qu’avec les années, je commence à devenir un peu paresseux. Je ne souhaite plus passer mon temps précieux sur cette planète à m’attarder sur des tâches banales comme faire rebondir les signaux des interrupteurs alors qu’il y a tant d’autres choses amusantes à faire.
De plus, bien que l’anti-rebond d’un seul commutateur ne pose aucun problème, les choses deviennent plus douloureuses à mesure que le nombre de commutateurs augmente. Dans le cas de mon moteur de pronostic (ne demandez pas), par exemple, il y a huit interrupteurs à bascule, dix interrupteurs à bouton-poussoir et deux interrupteurs à couteau.
Ainsi, le commutateur anti-rebond dans tous mes projets de loisirs récents a été réalisé à l’aide de circuits intégrés dédiés de LogiSwitch (dans un esprit de divulgation complète, je dois souligner que je suis membre de leur conseil consultatif technique). Ces petites beautés sont disponibles en versions 3, 6 et 9 canaux. En outre, ils sont disponibles dans des boîtiers à trous traversants (LTH) à double en ligne (DIL) adaptés au prototypage sur des maquettes, et en tant que dispositifs de montage en surface (SMD) pour ceux qui les préfèrent. Par exemple, considérons un appareil LS18 à 3 canaux (Figure 5) (la nomenclature « SW0 » contre « SW1 » est malheureuse, mais c’est la façon dont le cookie s’effrite et le commutateur rebondit, j’en ai peur).
La première chose à noter est que nous n’avons pas besoin d’utiliser une résistance de rappel sur le commutateur car cette fonction est incluse dans la puce elle-même. Il est également intéressant de noter que toutes les pointes de bruit sont rejetées, ce qui me procure une chaleureuse sensation de bonheur flou. La sortie anti-rebond suit l’entrée 20 ms après le rebond final, ce qui est négligeable lorsqu’il s’agit d’applications d’interface homme-machine (IHM).
Si vous exigez une réponse « instantanée » (en quelques nanosecondes) pour une application d’automatisation, par exemple, LogiSwitch fournit une autre famille de puces qui font exactement cela. Cette autre famille fournit également une interface de prise de contact à 1 fil unique sur chaque canal qui peut être utilisée pour « effacer » l’événement de commutation, mais ces puces formeront une histoire pour un autre jour.
Et toi?
Alors, et vous ? Avez-vous rencontré des problèmes liés au rebond de commutateur que vous voudriez partager avec le reste d’entre nous ? Aussi, quelle(s) solution(s) anti-rebond avez-vous tendance à privilégier ?