Question:
Multiplexage des entrées sur un microcontrôleur
BG100
2012-08-07 23:04:31 UTC
view on stackexchange narkive permalink

J'ai un commutateur DIL à 4 voies que j'utilise pour fournir une entrée à un microcontrôleur, et j'ai besoin de libérer un port pour l'utiliser pour autre chose.

Existe-t-il un moyen de multiplexer 4 entrées dans 3 ports de microcontrôleur? Je pense qu'il peut y avoir un moyen d'avoir 2 broches comme entrées, et une 3ème broche de sortie qui peut être mise au niveau haut pour lire les commutateurs 1 et 2, et basse pour lire les commutateurs 3 et 4.

Ma conception simple actuelle est illustrée ci-dessous, puis-je le faire avec seulement 3 broches?

schematic

Sept réponses:
jippie
2012-08-08 00:22:00 UTC
view on stackexchange narkive permalink

Charlieplexing tire parti des broches à trois états du microcontrôleur, mais cela coûte des diodes supplémentaires et une programmation un peu plus complexe.

Avec N broches IO, vous pouvez adresser N (N- 1) interrupteurs / LED.

L'article Charlieplexing with switches décrit comment cela fonctionne avec les interrupteurs et les LED

Tree pin and 6 switch Charlieplexing

C'est génial, exactement ce que je cherchais ... J'ai entendu parler de charlieplexing avec des LED, mais je n'ai pas pensé à utiliser la même méthode pour les commutateurs. Merci.
stevenvh
2012-08-07 23:19:36 UTC
view on stackexchange narkive permalink

Ce que vous décrivez est un multiplexeur 2 en 1, comme le 74HC157, qui est un multiplexeur quadruple à 2 entrées , donc 2 entrées pour 1 sortie, et 1 sélectionnez l'entrée. Vous utilisez deux multiplexeurs pour les quatre entrées.

Le 74HC153 fait la même chose, mais c'est un double multiplexeur 4 en 1 , donc 4 entrées, 1 sortie et 2 lignes de sélection par multiplexeur. Personnellement, je trouve que c'est une solution plus logique pour votre application.

Connectez l'entrée d'activation à la masse et n'oubliez pas de connecter les entrées inutilisées à la masse ou à Vcc.

Merci pour votre réponse, mais je préfère la méthode charlieplexing, principalement parce que j'ai déjà les diodes et que je devrais commander de nouvelles pièces pour ce faire.
Bruno Ferreira
2012-08-07 23:31:07 UTC
view on stackexchange narkive permalink

Comme alternative à la solution de Steven, vous pouvez utiliser un démultiplexeur 2: 4 comme celui-ci:

Schematic

Ah! Belle photo, mais quels sont ces vilains petits triangles? ;-)
@stevenvh Pour référence, ces vilains petits triangles sont les diodes qui éviteront de brûler les sorties de démultiplexage lorsque plusieurs interrupteurs sont activés. :-) Au fait +1 pour votre réponse.
Je taquinais juste. J'ai entendu dire qu'elles sont plus chères que les résistances pull-down. Avez-vous entendu cela aussi? :-)
@stevenvh Oui, je suis également responsable de cela. Je semble toujours trouver la solution la plus difficile en premier. Désolé pour la faute de frappe.
La façon dont vous l'avez dessiné, vous aurez besoin d'un démultiplexeur avec des sorties actives-hautes. Vous pouvez utiliser un 74HC238, qui est la version active-high du 74HC138 plus courant. Apparemment, il n'y a pas de version active du 74HC139, ce qui conviendrait mieux. Au moins, je n'en ai pas trouvé.
@stevenvh HEF4555B a des sorties actives-hautes.
stevenvh
2012-08-08 15:13:39 UTC
view on stackexchange narkive permalink

Excellente solution de jippie . J'aimerais élaborer un peu là-dessus.

Le schéma:

enter image description here

L'idée est de faire l'une des sorties d'E / S et les deux autres entrées qui permettent de lire le état de deux boutons. Trois fois la sortie \ $ \ fois \ $ deux entrées est bonne pour 6 boutons comme le montre le schéma.

Comment activer la sortie? Faites-le haut? Faisons-le pour la broche 1, puis les diodes B et F sont polarisées en avant, nous nous attendons donc à pouvoir lire ces boutons. Pour de nombreux microcontrôleurs, cela ne fonctionnera pas. Appuyer sur le bouton B rendra l'entrée 2 haute, mais que faire si le bouton n'est pas enfoncé? L'entrée serait flottante et vous ne pourrez rien y lire de significatif. Une résistance pull-down aiderait, mais de nombreux microcontrôleurs n'ont que des résistances pull-up, et vous ne lirez jamais un niveau bas. Je ne sais pas pour tous, mais au moins un certain nombre de microcontrôleurs AVR et PIC n'ont que des pull-ups.

Dans ce cas, la bonne façon est d'activer les pull-ups internes et d'activer la sortie en la rendant basse . Nous ne contrôlons pas les boutons B et F, mais A et E. Si le bouton A n'est pas enfoncé, le pull-up rendra l'entrée 2 haute. Appuyez sur le bouton A et vous tirez l'entrée vers le bas.

L'algorithme:

  IO2 = entrée, pull-up activéIO3 = entrée, pull-up activéIO1 = sortie, lowButton_A = IO2 (bas = enfoncé) Button_E = IO3 (bas = enfoncé) IO1 = entrée, pull-up activé IO2 = sortie, basButton_B = IO1 (bas = enfoncé) Button_C = IO3 (bas = enfoncé) IO2 = entrée, pull-up activéIO3 = sortie, lowButton_F = IO1 (low = pressé) Button_D = IO3 (low = pressé)  

Pour autant que je sache, tous les contrôleurs NXP Cortex-M, par exemple, ont les deux pull-up configurables / résistances pull-down. Pour ceux-ci, vous pouvez utiliser une logique positive (high = pressé) si vous utilisez les pull-downs et une sortie haute active. Notez que vous lirez différents boutons pour la même sortie:

  IO2 = input, pull-down enabledIO3 = input, pull-down enabledIO1 = output, high
Button_B = IO2 (haut = enfoncé) Button_F = IO3 (haut = enfoncé) IO1 = entrée, pull-down activéIO2 = sortie, hautButton_A = IO1 (bas = enfoncé) Button_D = IO3 (bas = enfoncé) IO2 = entrée, pull-down enabledIO3 = sortie, highButton_E = IO1 (low = pressé) Button_C = IO3 (low = pressé)  
Belle explication.
supercat
2012-08-08 00:50:35 UTC
view on stackexchange narkive permalink

Si vous pouvez compter sur vos broches d'E / S pour basculer au même seuil, et que cela ne vous dérange pas de désactiver les interruptions pendant une longue période pendant que vous lisez les commutateurs (par exemple parce que vous venez de les lire au démarrage), vous pouvez utilisez deux broches d'E / S, six résistances et un condensateur. Câblez une résistance 1K, 2,2K, 4,7K et 10K en parallèle avec chaque commutateur, et câblez tous les commutateurs en série afin que la chaîne ait une résistance totale d'environ 0K à 17,9K. Mettez une résistance 1K en série avec cette chaîne et attachez-la une extrémité de la chaîne à une broche de port et l'autre extrémité à un condensateur. L'autre extrémité du condensateur doit aller à la terre. Connectez une résistance 10K de l'autre broche de port à ce condensateur.

Pour déterminer le réglage du commutateur, mettez les deux broches de port à la terre et laissez-les à la terre pendant un moment. Faites ensuite flotter celle connectée à la chaîne de résistances et pilotez celle connectée à la résistance 10K. Temps nécessaire pour que la broche connectée à la chaîne de résistance devienne élevée. Mettez ensuite les deux broches du port à la terre, laissez-les à la terre pendant un certain temps, et faites flotter la broche connectée au 10K tout en poussant la broche de la chaîne de résistance à un niveau élevé et combien de temps il faut à la broche 10K pour basculer. les broches commutent à des tensions égales, le rapport des temps sera le rapport des résistances. Puisque la résistance de 10K est connue, on peut alors calculer l'autre.

Il peut être possible d'améliorer légèrement la précision en utilisant une troisième broche connectée directement au condensateur pour déterminer quand il est correctement chargé; l'utilisation de la même broche pour les deux mesures garantirait que les deux mesures sont prises avec le même seuil de commutation.

Réponse intéressante, je n'aurais jamais pensé le faire de cette façon. La programmation peut être un peu délicate cependant, mais merci pour votre réponse.
ou, vous savez, utilisez l'a / d intégré et évitez toute complication
Yeah Yeah. Bien que l'approche RC ait l'avantage d'avoir un temps proportionnel à la résistance, alors que l'approche ADC produira généralement une tension non linéaire par rapport au réglage du commutateur (on pourrait atteindre une tension plus proche de la tension linéaire si la résistance de pull-up est grande par rapport à la résistance de pull-down ou vice versa, mais cela réduirait généralement les choses dans une petite partie de la plage ADC).
Gregory Ion
2012-08-08 05:31:55 UTC
view on stackexchange narkive permalink

J'ai remarqué que vous avez une entrée analogique là-bas.Si vous souhaitez utiliser un minimum de composants, connectez un côté de tous les commutateurs à l'entrée analogique, puis connectez l'entrée analogique à + V avec une résistance de 1K. Connectez quatre résistances de valeurs différentes à l'autre côté des commutateurs. Choisissez soigneusement vos résistances pour vous assurer d'obtenir une tension différente quel que soit le nombre d'interrupteurs activés à la fois. Générez une interruption lorsque la valeur de conversion A / N change ou ayez une routine qui lit la valeur aussi souvent que vous le souhaitez.

Je pense que c'est la solution la moins chère à votre problème. Il ne nécessite que cinq résistances.
Étant donné que les 4 commutateurs constituent effectivement un nombre binaire de 4 bits, cela donnerait-il une résolution suffisante (avec une tolérance de résistance de 1%) pour me permettre de détecter de manière fiable 16 combinaisons de commutateurs différentes?
kenny
2012-08-08 00:48:11 UTC
view on stackexchange narkive permalink

Mon approche serait d'utiliser un bus série I2C / SPI / etc. Vous pourriez l'exécuter sur un 3 broches et avoir un registre d'entrée pour les commutateurs sur ce bus. Bien que coûteux et plus de bits dont vous avez besoin actuellement, le MCP22017 est assez flexible. D'autres choix avec 8 bits sont disponibles si vous regardez autour de vous.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...