Des moyens intelligents pour détecter un bouton (moins consommateur d'énergie)

28

Lors d'une réunion pour un projet particulier, on m'a demandé de réfléchir à la façon de détecter une pression sur un bouton avec un MCU. La détection doit consommer le moins d'énergie possible. Au premier coup d'œil, j'ai pensé au circuit typique avec un pull-up ou un pull-down:

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Je ne prends pas en compte certaines fonctionnalités anti-rebond ici, car cela dépasse la portée de cette question. Dans les deux cas, lorsque le bouton est enfoncé, la valeur de courant totale qui circule dépend de la valeur de la résistance. Pour le minimiser (le courant), je pourrais augmenter la valeur de la résistance mais pas autant car, si j'ai raison, cela dépend aussi de la valeur de fuite de la broche d'entrée. De plus, une grande résistance récupérerait lentement.

Ma question est la suivante: quelles sont les façons intelligentes de détecter un bouton enfoncé qui ne consomme pas d'énergie (généralement pour une application à forte consommation d'énergie)? Existe-t-il des méthodes qui consomment à peine lorsque vous appuyez sur le bouton?

vionyst
la source
5
Un menu déroulant de 10k ne consomme presque pas d'énergie. 3,3 V donne 330 uA. Et sur la plupart des microcontrôleurs modernes, vous avez la possibilité d'en définir un en interne, qui aura une résistance encore plus élevée. Cela étant dit, vous pouvez activer l'alimentation des boutons à partir d'une broche MCU via un BJT ou MOSFET. Activez-le uniquement pendant la lecture et lisez avec interrogation.
Lundin
27
@Lundin En termes "modernes", 330 A peut être un courant élevé ...μ
awjlogan
6
en effet, de nombreux microcontrôleurs peuvent obtenir des courants de sommeil aussi faibles que 2 à 10 μA. Gaspiller 30 fois cela sur un seul pull-down est un peu triste, surtout dans une situation de batterie.
whatsisname
1
La taille d'une résistance que vous pouvez utiliser sur un pull down dépend de l'impédance des broches et de la tension de commutation. Disons que vous avez une broche 3,3 V dans un état de haute impédance qui commute à 2,4 V, tout ce dont vous avez vraiment besoin est une impédance légèrement inférieure à l'entrée. Je vous recommande d'attacher un potentiomètre et de mesurer la valeur élevée d'une résistance que vous pouvez utiliser pour que la broche continue de fonctionner de manière fiable, puis de descendre de 20% en valeur pour garder une marge.
Drunken Code Monkey

Réponses:

29

Une méthode à faible courant que j'ai utilisée une fois consistait à connecter un commutateur entre deux broches d'E / S de microcontrôleur.

Une E / S a été configurée comme sortie (SWO). Le second a été configuré comme une entrée (SWI) avec son pull-up interne programmable activé.

L'état de commutation a été échantillonné rarement (toutes les 10 ms) par une routine d'interruption logicielle. La séquence de lecture était: conduire SWO bas, lire SWI, conduire SWO haut.

Cela signifiait qu'un interrupteur pressé ne tirait que le courant de descente SWI à travers lui-même et SWO pendant moins de 1 us pendant le balayage, tandis qu'un interrupteur non pressé ne tirait aucun courant. Ce tirage actuel pour <1 us toutes les 10 ms a entraîné une consommation moyenne moyenne de courant infime.

TonyM
la source
On peut se demander pourquoi vous avez besoin du pull-up en utilisant cette technique. La séquence SWO Low, Read SWI, SWO High, SWI Read peut être suffisante pour savoir si les broches sont connectées ensemble. Vous pouvez également partager le SWO entre de nombreux commutateurs.
Trevor_G
8
@Trevor Laisser l'entrée flottante lorsque le commutateur est ouvert n'est pas une très bonne idée. Selon la technologie, le tampon d'entrée peut consommer de l'énergie si son entrée est dans un état intermédiaire.
RoyC
1
@Trevor Multiplie efficacement la résistance de rappel par le rapport cyclique sw1 sw2. Encore un pull up qui nous ramène au schéma de l'OP 1. Il peut fonctionner dans un environnement à faible bruit.
RoyC
2
Le fait que le MCU doive rester éveillé pour effectuer l'interrogation au lieu de s'appuyer sur une interruption n'annule-t-il pas complètement les économies de cycles de service de commutation plus courts?
AndreKR
5
Salut @AndreKR, nous avions une application de microcontrôleur alimenté par batterie et il avait besoin de plusieurs commutateurs connectés, nous avons donc utilisé cette technique car elle était assez facile. Nous n'avions pas installé de microcontrôleur uniquement pour la détection des commutateurs. Le MCU a attiré quelque chose comme 900nA en mode veille entre ses interruptions de 10 ms, donc les économies de pull-up en valaient la peine.
TonyM
23

Un bouton SPDT ( S ingle P ole D ouble T hrow) serait votre bouton ultra efficace.

entrez la description de l'image ici

Source: http://www.ni.com/white-paper/3960/en/

Dans votre cas, le 1P irait au MCU, le 1T au VCC, le 2T au GND.

Harry Svensson
la source
+1 .. cela m'a toujours dérangé que les SPDT subminiatures soient très difficiles à trouver ou coûtent trop cher ...
Trevor_G
1
@Trevor Ouais ... certaines choses sont malheureusement très chères. Alors que d'autres articles sont sous-évalués (MCU par exemple). Vous ne pouvez pas tout avoir.
Harry Svensson
C'est une bonne idée. Malheureusement, je n'ai pas réussi à trouver un bouton CMS SPDT correspondant à mes besoins. Je garderai ce circuit à l'esprit
vionyst
10

Combien de temps le bouton sera-t-il enfoncé? S'il ne s'agit pas d'un interrupteur à bascule (qui conserve son état) mais d'un interrupteur momentané, le courant circulant lorsque le bouton est enfoncé est largement hors de propos en raison du court laps de temps pendant lequel le bouton est réellement fermé.

L'un ou l'autre des deux circuits que vous montrez est OK, cela n'a pas d'importance.

Vous pouvez supposer que la fuite d'entrée et / ou le courant dans une entrée MCU est négligeable . Tous les MCU sont de nos jours en technologie CMOS et ont un courant d'entrée pratiquement nul. Alors arrêtez d'y penser, ce n'est pas là.

Au lieu d'utiliser une résistance externe, vous pouvez également utiliser la résistance de pull-up interne intégrée dans de nombreuses entrées du MCU. Cette résistance peut avoir une valeur relativement faible (50 kohm peut-être), donc un petit courant passera lorsque le bouton sera enfoncé.

Vous pouvez utiliser en toute sécurité même une résistance de 1 Mohm pour un pull-up / pull-down. Seulement dans des environnements très "sales" (électriquement parlant), vous pourriez avoir besoin d'une valeur inférieure. Vous pouvez également placer un condensateur de 100 nF en parallèle avec le commutateur pour supprimer les interférences provenant d'autres circuits à proximité.

Conseil de pro: réservez une place pour un tel condensateur sur le PCB, mais ne montez pas de capuchon. encore. En cas de problème: placez-le et voyez si cela peut vous aider.

Pour détecter l'état du commutateur, utilisez l' interrogation (comme dans la réponse de TonyM) ou utilisez une interruption . Cela dépend de l'application qui est la meilleure pour la consommation d'énergie (du MCU).

Bimpelrekkie
la source
En fait, le bouton sera momentané mais le temps où il sera enfoncé peut être assez long (minutes)
vionyst
Si l'appareil est allumé 24h / 24 et 7j / 7, quelques minutes peuvent encore ne pas représenter beaucoup. Ce qui est important, c'est le rapport cyclique, 5 minutes par heure est 5 x 60/3600 = 8,3%. Donc, même à un courant de 100 uA, le commutateur consommerait 8,3 uA en moyenne dans mon scénario. Mon message est: ne vous concentrez pas trop sur le courant que le commutateur utilise lorsqu'il est enfoncé sans le comparer à la consommation actuelle du système complet. Ce n'est que lorsque les contributions sont les mêmes qu'il est logique d'améliorer la consommation actuelle du commutateur. Il est inutile de faire un commutateur de 0,1 uA lorsque le MCU utilise 1uA en continu.
Bimpelrekkie
"Il est inutile de faire un commutateur de 0,1 uA lorsque le MCU utilise 1uA en continu." ça sonne. Je pense que vous voulez dire un pic de 1uA. 10% juste pour le changement serait excessif;)
Trevor_G
@Trevor Pas de pointe, je veux dire 1uA de courant moyen pour le MCU mais 0,1uA lorsque l'interrupteur est enfoncé. Combiné avec un interrupteur 0,1 A qui ne sera pressé que pendant des périodes (relativement) courtes, l'interrupteur ne contribue presque rien à la consommation électrique moyenne totale, car le courant moyen sera de: 100% x 1 uA + 8,3% * 0,1 uA = 1,0083 uA (8,3% réutilisé d'après le commentaire ci-dessus).
Bimpelrekkie
2
Ouais, il suffit de lire comme si vous vouliez une moyenne de 0,1 uA sur le commutateur. Ce qui ne serait pas déraisonnable comme un dip-switch.
Trevor_G
10

Une méthode que j'ai utilisée tire parti de la nature capacitive des entrées CMOS.

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Dans le circuit au-dessus du commutateur, lorsqu'il est fermé, il permet à la résistance de rappel de charger / décharger les capacités d'entrée du GPIO jusqu'au niveau de la terre.

L'astuce avec ce circuit est d'utiliser la nature bidirectionnelle d'un GPIO pour maintenir l'entrée chargée à un niveau logique élevé lorsque le commutateur est ouvert.

La routine de commande tourne périodiquement la broche à un niveau élevé ou active brièvement le pull-up, suffisamment longtemps pour maintenir une charge des capuchons. La broche d'entrée agit alors comme un bit de mémoire dynamique et, avec la plupart des appareils, maintiendra cette charge pendant une durée considérable et utilisable.

Lorsqu'il est correctement configuré, si le bouton est enfoncé, la charge sur la broche se décharge plus rapidement que le taux de rafraîchissement. Cette condition peut ensuite être détectée dans le cadre de l'algorithme de rafraîchissement comme une lecture avant l'opération de rafraîchissement, ou utilisée pour déclencher une interruption.

L'alimentation est brièvement utilisée pendant l'impulsion de rafraîchissement, à la fois pour recharger les condensateurs et à travers la résistance et l'interrupteur si elle est fermée. Cependant, la longueur de l'impulsion de rafraîchissement est courte et la fréquence d'interrogation fait que le courant de rafraîchissement est relativement insignifiant.

De toute évidence, cette méthode est active. Si le micro est mis en veille, l'état de l'interrupteur sera indéterminé au réveil. Le premier cycle de rafraîchissement après le réveil doit ignorer la broche lue. De plus, cette méthode ne doit pas être utilisée pour réveiller le micro. Avant d'aller au lit, il est également sage d'activer la broche comme sortie basse pour la garer dans un état de courant nul.

Pour lire plus de commutateurs statiques, comme les commutateurs DIP de configuration, une routine dédiée peut être utilisée plutôt qu'un cycle de rafraîchissement continu. Après la lecture, les broches GPIO doivent ensuite être "parquées" dans un état de sortie faible actif (courant nul) pour éviter le problème des entrées flottantes.

REMARQUE: cette technique souffre un peu de la sensibilité au bruit si les longueurs de trace sont longues et traversent une zone bruyante. En tant que tel, R1 doit être proche de la broche d'entrée. Cependant, je ne le recommanderais pas pour brancher un interrupteur à une certaine distance du panneau avant, sauf si vous ajoutez une capacité supplémentaire près de la broche.

Trevor_G
la source
1
Cela semble en effet très vulnérable aux EMI. Si une forme quelconque d'énergie radio pénètre dans ce circuit et je pense que tous les paris sont désactivés. Heureusement, les choses sans fil ne sont pas si courantes de nos jours :)
Lundin
@Lundin ce n'est pas aussi mauvais qu'on pourrait le penser. 30pF et un meg font un assez bon filtre.
Trevor_G
8

Si votre bouton est un interrupteur piézo, la seule puissance requise est celle générée en appuyant sur le bouton.

Par exemple: R2 / C1 récupère l'énergie produite en appuyant sur le piézo. D1 empêche la tension C1 de devenir trop élevée. R1 draine C1 lorsque le bouton est relâché. Le MCU GPIO doit être en entrée, pas de mode pull. Voilà, le bouton détecte avec un courant nul de l'alimentation.

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

Heath Raftery
la source
3
Hmm, pouvez-vous faire / concevoir un prototype fonctionnel de cela et montrer les avantages des solutions avec un interrupteur normal que nous utilisons depuis 30 ans?
Bimpelrekkie
Sûr. J'ai ajouté un exemple de schéma. Construisez simplement cela. L'avantage est qu'il n'y a aucune consommation de courant de l'alimentation en état fermé ou ouvert. Les inconvénients incluent un mauvais contrôle de l'effort requis pour activer le commutateur (un circuit actif serait mieux, mais cela contrecarre l'avantage très marginal du circuit), et il s'agit d'une conception nouvelle par rapport à la conception de commutateur normale vieille de 30 (300?) Ans.
Heath Raftery,
Pourtant, ma calculatrice a beaucoup de boutons et fonctionne au moins 5 ans sur une pile bouton. Vous ne voyez toujours pas en quoi votre solution y apporterait un quelconque avantage. Je pense toujours que c'est une "solution" à un problème inexistant. Et plus cher aussi.
Bimpelrekkie
1
Oh je suis d'accord! Il répond aux critères d'origine "consomme le moins d'énergie possible", mais il est difficile d'imaginer pourquoi économiser moins d'un millijoule est réellement utile.
Heath Raftery
L'impédance d'entrée du MCU ne fait-elle pas de vilaines choses à cause de l'impédance de sortie élevée du piézo?
Scott Seidman
5

Si l'appareil doit pouvoir rester indéfiniment dans l'un ou l'autre état, l'utilisation d'un commutateur SPDT sera l'approche la plus faible, car un circuit statique peut être conçu pour ne tirer aucun courant au-delà de sa propre fuite interne et de celle du commutateur. Un avantage supplémentaire des commutateurs SPDT est qu'ils peuvent être rebondis presque parfaitement, quelle que soit la rapidité avec laquelle ils sont actionnés ou la taille des contacts, à condition qu'un seul contact cesse de rebondir avant que l'autre ne se lise comme fermé.

Il existe deux bonnes approches pour câbler de tels commutateurs:

schématique

simuler ce circuit - Schéma créé à l'aide de CircuitLab

La première approche nécessite une résistance de moins que la seconde, mais la seconde sera plus tolérante au chevauchement entre les deux pôles (elle attirera un courant plus élevé que d'habitude, mais ne mettra pas un court-circuit à travers l'alimentation). Notez que si le commutateur peut entrer dans un état qui est modérément résistif pendant une période de temps prolongée, cela pourrait brûler beaucoup plus de courant que d'habitude, mais pendant l'utilisation normale, aucune des résistances ne transportera de courant significatif, sauf pendant le bref instant entre la moment où le commutateur change d'état et la sortie répond.

supercat
la source
2

Utilisez le pull-up interne du microcontrôleur et lorsque la presse est détectée, désactivez le pull-up. Ensuite, réactivez-le brièvement pour vérifier l'état du bouton.

τεκ
la source