Connexion d'un bouton-poussoir à une broche de contrôleur

8

Ce problème est vieux de plusieurs décennies mais je ne vois pas de réponse directe sur ce site. Je veux ce qui suit:

entrez la description de l'image ici

Ce circuit permet juste de vérifier l'état du bouton depuis l'intérieur du micro-contrôleur. Rien d'extraordinaire. Mes questions:

  1. Y a-t-il quelque chose de mieux que cette conception simple?
  2. La valeur de la résistance de 100 kilo-ohms est-elle adéquate pour nos appareils CMOS d'aujourd'hui, comme dsPIC30FXXXX et pas une application à haute puissance?
Kirill Kobelev
la source
2
1) Pas vraiment, sauf si vous recherchez un anti-rebond matériel. 2) Oui.
NickHalden

Réponses:

6

Premièrement, de nombreux microcontrôleurs et contrôleurs de signaux numériques auront des résistances de rappel internes. Voici un exemple, un Atmel ATMega164.Port GPIO ATMega164p

Il y aura généralement un registre permettant d'activer et de désactiver les tractions internes. En raison des variations dans le processus de fabrication, ces tractions internes viennent dans une très large gamme et ne sont pas un bon choix si vous avez besoin d'un contrôle très étroit sur la consommation de courant dans les applications à très faible consommation d'énergie. S'il est important de maintenir le nombre de composants bas, c'est un moyen facile de le faire. L'utilisation de tractions internes pour le rebond matériel ne serait pas une bonne idée, car il n'est pas possible de prédire leur valeur exacte.

Que la valeur de 100 soit adéquate dépend. Si c'est juste un interrupteur qui sera périodiquement basculé par un utilisateur, alors 100 serait un bon choix pour minimiser la consommation d'énergie. Pour les choses qui vont changer plus rapidement, comme les encodeurs rotatifs, le processus que je suivrais estkΩkΩ

  1. Trouver le courant de dissipation maximum dans la fiche technique
  2. Calculer une valeur de pull up en utilisant la loi d'Ohm
  3. Choisissez une résistance de taille standard quelques tailles plus grande, en fonction de la vitesse réellement nécessaire
  4. Testez et voyez si la taille de résistance choisie donne les temps de montée et de descente requis
  5. Ajuste en accord

Donc, si le courant de dissipation maximum par broche GPIO était de 10 mA et fonctionnait à 5 V: . Garder cette valeur R aussi petite que possible permettra d'avoir les bords les plus nets et les fréquences de commutation les plus élevées.R=VI=5V10mA=500Ω

Matt Young
la source
Êtes-vous en train de dire qu'en raison de la capacité du fil / de la trace, vous aurez un circuit RC qui causera des retards de propagation du signal à l'UC, et qu'avec un R plus grand, ces retards de propagation peuvent en fait provoquer une mauvaise lecture d'un codeur rotatif?
angelatlarge
Oui, les réactances parasites ne sont qu'une réalité de la vie qui doit être traitée de plus en plus à mesure que la fréquence augmente.
Matt Young
Intéressant! Je suis confus cependant: en supposant que la capacité paracitique est inférieure à 1 uF, compte tenu d'une résistance de 100 k Ohms et en supposant 0,1 uF C parasite, nous obtenons une constante de temps d'environ 23 ms (entrée = 5 V, sortie = 4,5 V). En d'autres termes, dans un circuit à 5 V, l'UC verra 4,5 V à l'entrée dans une impulsion montante en moins de 25 ms. Pour que l'UC rate cela (en supposant qu'il ne relève pas), l'encodeur générerait des impulsions à 40 Hz environ. Est-ce quelque chose dont nous devrions nous inquiéter?
angelatlarge
La capacité parasite se situe généralement dans la plage nano ou pico Farad. Cela devient un problème avec les encodeurs rotatifs à des vitesses plus élevées. Prenons un encodeur optique qui émet 24 impulsions par tour et tourne à 1500 tr / min. Les ondes carrées de sortie vont être de 600 Hz avec une période d'environ 1,2 ms. Ceci est encore suffisamment lent pour que la traction de taille minimale ne soit pas nécessaire, mais 100 entraîneraient des temps de montée et de descente peu susceptibles d'être acceptables. Cela vaut à lui seul une question. kΩ
Matt Young
Vrai et vrai. Je pensais aux encodeurs rotatifs manuels.
angelatlarge
4

Vous pouvez devenir plus simple que cela.

Utilisez simplement une résistance pull-up / pull-down interne dans votre microcontrôleur.

100k est suffisant, mais les pullups internes pourraient être un peu plus bas dans certains MCU, par exemple dans AVR atmega8 c'est 30-80kOhm pour réinitialiser le pull-up et 20-50kOhm pour toutes les autres broches d'E / S.

miceuz
la source
Vous ne pouvez pas dire que 100k est suffisant. Il n'y a pas de reçu universel, vous devez calculer la valeur en fonction du MCU et de l'appareil entraînant la broche de l'autre côté.
Blup1980
1
La personne posant la question a spécifié un bouton-poussoir. Je ne vois aucun problème avec cette réponse.
mjh2007
1
  1. Y a-t-il quelque chose de mieux que cette conception simple?


    Mieux ne peut être répondu sans critères spécifiques à mesurer, que vous n'avez pas fournis. Dans la plupart des cas, la topologie que vous montrez est correcte. Deux variantes peuvent être "meilleures" selon la situation:

    De nombreux microcontrôleurs ont des tractions internes sur certaines de leurs broches. Celles-ci sont destinées exactement à ce genre de situation. La résistance est alors interne au micro et vous définissez un peu quelque part pour l'activer. La seule pièce externe requise est le simple bouton-poussoir lui-même.

    Une autre variante utile à garder à l'esprit est pour les conceptions de faible puissance où le bouton peut être un interrupteur qui peut être fermé pendant de longues périodes. Dans ce cas, vous souhaitez minimiser le courant moyen à long terme à travers la résistance de rappel. Vous le rendez aussi grand que possible, mais il y a des limites à cela et des inconvénients à le rendre trop grand. Au lieu de cela, vous activez le pullup pendant quelques µs à la fois pour prendre une lecture de bouton. Si vous cochez la touche toutes les 1 ms et que le pullup est activé pendant 10 µs, le courant de pullup moyen est réduit de 100x. Avec une résistance externe, vous utilisez une autre broche pour entraîner le côté supérieur du pullup. Avec un pullup interne, vous activez / désactivez-le dans le firmware selon vos besoins.

  2. La valeur de la résistance de 100 kilo-ohms est-elle adéquate pour nos appareils CMOS d'aujourd'hui, comme dsPIC30FXXXX et pas une application à haute puissance?


    J'ai déjà répondu longuement à cette question ici .

Olin Lathrop
la source
0

Mieux que ce simple design? Oui. Jetez un capuchon dessus et vous avez un simple interrupteur anti-rebond du matériel.

entrez la description de l'image ici

Le condensateur serait un capuchon en céramique de 0,1 uf commun. La résistance serait un 10k. Ce site a tous les détails sur pourquoi. En bref, un circuit anti-rebond empêche le microcontrôleur d'enregistrer de fausses pressions multiples lorsque vous appuyez sur le bouton. La configuration Résistance / Condensateur adoucit le rebond mécanique du bouton afin que ce soit une transition régulière.

Passant
la source
Les bouchons électrolytiques n'aiment pas être court-circuités. J'utilise régulièrement 100nF qui fonctionne bien pour mes applications.
jippie
1
@jippie, le symbole était ce que l'image avait, mais une céramique de 100 nf ou 0,1 uf est ce qu'il faut.
Passerby
3
Ce n'est pas un bon circuit anti-rebond. Tout d'abord, cela ne fait que rebondir une pause, pas une marque. Lorsque le bouton est enfoncé, le capuchon est immédiatement court-circuité. Deuxièmement, la constante de temps de 1 ms est trop courte pour être très utile. Troisièmement, cela ne doit être introduit que dans une entrée de déclenchement Schmidt. Les entrées normales n'aiment pas les signaux qui augmentent lentement. Laissez simplement le capuchon et faites le rebouncing dans le firmware, ce que vous devriez faire de toute façon, même avec le capuchon.
Olin Lathrop
Oui, le bouchon est immédiatement court-circuité, mais toute recharge en raison du rebond est filtrée passe-bas, supprimant tout effet du rebond. Peut-être plus précisément, le rebond sur marque est un mécanisme très différent du rebond sur pause. Un ms est cependant trop rapide. Je n'aime pas utiliser ce circuit pour plusieurs raisons. Cependant, si vous conduisez une interruption avec la broche en question, le rebouncing dans le firmware n'est souvent pas la meilleure solution. Passer à un DPST et rebondir avec une bascule SR est une assez bonne méthode pour ce cas.
Scott Seidman
0

EDIT - le commentaire que j'ai fait ci-dessous était destiné à suivre ce qu'Olin avait dit plus tard sur le circuit avec un condensateur censé ajouter un anti-rebond. Je suis désolé que cela semble apparaître au mauvais endroit - peut-être que quelqu'un peut résoudre ce problème parce que je suis évidemment trop aveugle ou stupide pour voir comment j'aurais dû le faire !!

Je suis d'accord avec Olin - cela n'offre pas un bon rebond. J'ajouterais également que court-circuiter le condensateur peut provoquer une forte augmentation de courant qui peut réinitialiser le microprocesseur si la configuration du circuit imprimé n'est pas vraiment bonne. Certains commutateurs ont besoin d'un courant de mouillage pour fonctionner correctement et de manière fiable et 100k peuvent être trop élevés pour certains commutateurs (en particulier les commutateurs à membrane).

Andy aka
la source