Question:
Obtenir deux (ou, une et demie) sorties à partir d'une seule broche
Paolo Bonzini
2017-10-15 21:34:40 UTC
view on stackexchange narkive permalink

Je fais un projet avec un ATtiny85 et bien sûr je suis à court de broches d'E / S.Une idée que j'ai eue était d'utiliser une seule broche pour deux sorties (appelons-les EN et DATA).

schematic

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

Je sais que DATA n'a pas d'importance lorsque EN = 0.En d'autres termes, ces deux sorties ne peuvent prendre que les valeurs EN = 0 / DATA = x, EN = 1 / DATA = 0, EN = 1 / DATA = 1.Existe-t-il un moyen simple de mapper par exemple 0 à EN = 0 / DATA = x, 1 à EN = 1 / DATA = 1, Z (broche d'entrée) à EN = 1 / DATA = 0?La consommation d'énergie n'a d'importance que lorsque EN = 0.

Pas à partir d'une entrée binaire.Si vous utilisez une entrée ADC, vous pourriez.
Je suis confus!Le titre dit: "* Obtenir un 0 et un 1 à partir d'une entrée flottante *" mais la question dit: "* utiliser une seule broche pour deux sorties *".Lequel est-ce?
@Transistor: Je voudrais obtenir deux sorties (trois états au total) de ma carte en utilisant une seule broche GPIO du microcontrôleur et une logique de colle sur la carte.Mon idée était que le microcontrôleur pouvait configurer la broche comme sortie basse / sortie haute / entrée pour obtenir les états souhaités.
@Trevor: en utilisant une sortie PWM au lieu de l'entrée flottante pourrait être possible car je n'en utilise pas, mais comment ferais-je cela?;)
@Paulo: Ce n'est toujours pas clair.Essayez-vous d'utiliser une broche pour deux * sorties * ou essayez-vous de surveiller deux signaux sur une broche d'entrée.Il y a un bouton schématique sur la barre d'outils de l'éditeur.Dessinez-le.Vous devez modifier votre question.
@Transistor: une broche pour deux sorties, a ajouté un schéma
Il est beaucoup plus facile d'obtenir 5 sorties à partir de 4 broches que d'obtenir 2 sorties à partir d'une broche.Vous posez peut-être la mauvaise question.
Vous avez 3 états de sortie: 0, 1 et hi-Z;utilisez donc 2 Rs pour régler la tension hi-Z à mi-chemin, puis 2 comparateurs pour donner 00, 01 (ou 10) et 11.
Je doute donc que les solutions PWM soient ce que vous recherchez, mais ma première pensée est la téléphonie.Les téléphones transmettent tous les numéros sur le clavier à l'aide d'un seul fil (plus un retour).Et je suis certain qu'il y a du matériel pour faire ça =)
Vous avez trois états distincts.Pourriez-vous faire quelque chose avec une broche basse pour un état, une broche haute pour l'état suivant et une broche basse à haute à basse réelle rapidement pour le troisième état?
Sept réponses:
Marcus Müller
2017-10-15 22:09:24 UTC
view on stackexchange narkive permalink

Vérité honnête: ce que vous essayez de faire est plus facile à implémenter simplement en utilisant un microcontrôleur avec suffisamment de broches.C'est probablement encore moins cher qu'un Attiny85.Qui sait.

Mais: si vous le devez vraiment, vous pouvez faire différentes choses pour obtenir plus de sortie d'une seule ligne:

  • Achetez un module d'extension IO qui utilise la norme 1-Wire (pseudo) et implémentez un émetteur 1-Wire sur l'Attiny
  • un appareil UART pourrait faire aussi bien, mais je ne connais aucun adaptateur UART-IO à un seul fil qui ne soit en fait qu'un autre microcontrôleur programmé
  • Implémenter un DAC, suivi d'un ADC
    • DAC en PWM en utilisant votre sortie,
    • alimentation du PWM dans un filtre passe-bas RC, produisant une tension variable "douce"
    • acheter un ADC de sortie parallèle bon marché, or
    • implémentez votre propre ADC de sortie parallèle avec des diodes Zener
Cela pourrait être une solution en effet (acheter un autre microcontrôleur :) ou simplement utiliser PB5 et un programmeur haute tension).Il s'agit principalement d'un exercice d'apprentissage en électronique, construisant mon propre module d'extension d'E / S avec le moins de programmation possible et une logique de collage discrète.Je pensais utiliser des résistances et des diodes, mais je n'ai pas pu le faire fonctionner.
J'ai voté pour.J'ai une solution connue pour fonctionner mais nécessite que la broche en question soit anormalement avancée.
Marcus Müller
2017-10-15 23:07:22 UTC
view on stackexchange narkive permalink

Bien sûr, je suis un nerd, alors voici des solutions moins susceptibles d'être implémentées par vous, mais qui méritent d'être mentionnées pour le plaisir:

Shenanigans basées sur le registre des changements

Les idées suivantes sont basées sur des registres à décalage série-parallèle.

Broche de sortie -> Entrée de données

Vous pouvez simplement transférer vos données vers l'entrée de données série de votre registre à décalage.

Problem: Les registres à décalage ont besoin d'une horloge pour savoir quand "échantillonner" l'entrée.

Solution: Génère une impulsion d'horloge chaque fois que l'entrée change.

N Nouveau problème: OK, nous pouvons le faire avec une simple porte logique ET, combinant votre DataIN et une version minimalement retardée de sa sortie (retard à travers des composants discrets, par exemple un filtre RC). Mais: alors nous ne pouvons avoir que des modèles de bits alternés.

Solution: La séquence de sortie de votre pin doit toujours être

0->1 [long] ->B [court] ->0 .

Ce qui se passe ici, c'est que le premier 1 charge un condensateur (d'où le "long" 1), la tension aux bornes de ce cap déclenche un one-shot retardé (par exemple, via un NE555) il franchit un seuil, ce qui provoque alors une impulsion d'horloge pour le registre à décalage.

Au moment où l'impulsion se produit, vous avez déjà défini le bit de sortie souhaité B sur la sortie. Cela doit être plus court que le 1 "fixe" pour éviter de déclencher à nouveau l'impulsion d'horloge.

Vous faites ce qui précède deux fois pour décaler deux bits différents B1 et B2 dans le registre à décalage.

Vous pouvez implémenter le schéma d'envoi ci-dessus

  0b1111BB00
 

avec l'unité UART (si votre microcontrôleur en est équipé).

Si vous regardez de plus près, c'est très similaire à ce que font les trucs WSxxxx "neopixel" pour communiquer: 0->1 marque le début d'une période, et le montant de 1 dans cette période définit si c'est un 0 logique ou un 1.

Pulsations populaires passives polynomiales

Cela avait besoin d'un titre rimant. En toute vérité, cela devrait probablement être appelé "génération de registre à décalage à rétroaction linéaire d'une séquence de sortie".

L'idée est que lorsque vous utilisez un registre à décalage et que vous connectez son entrée à une combinaison logique de ses cellules internes, vous pouvez créer quelque chose qui parcourt tous les états de sortie possibles (si vous choisissez la fonction de rétroaction de manière appropriée). J'expliquerais cela ici, mais moi, paresseux, alors lisez l'article de wikipedia sur les registres à décalage à rétroaction linéaire.

À retenir: si vous pouvez avoir un tel LFSR, vous pouvez, simplement en basculant son clock, obtenir toutes les sorties (il suffit de basculer le bon nombre de fois).

Doh '. C'est bien, mais c'est plus difficile à expliquer qu'un compteur

Bien sûr, ce qui précède est très cool (car il a de nombreuses applications, par exemple dans la communication, la vérification de l'intégrité des données, etc.), et c'est très efficace en termes de nombre de portes dont vous avez besoin pour cela, mais:

Vous pouvez tout aussi bien acheter ou construire un compteur 2 bits (ou plus). Et comptez les bascules de votre épingle Attiny. La sortie de bits parallèles du compteur peut être vos 2 broches de sortie (ou plus).

Je pense que cela en dit long. J'ai d'abord pensé aux LFSR plutôt qu'aux compteurs.

Discrimation basée sur la fréquence

Filterbank avec deux fréquences discrètes

L'idée est simple:

  1. Générez deux fréquences différentes avec la broche, par exemple, en la basculant avec une fréquence de 1 kHz (c.-à-d. toutes les 1 ms la sortie se répète, vous devez basculer toutes les 500 µs), ou à 2 kHz (basculer toutes les 250 µs) ou somme logique des deux oscillations (un peu difficile à faire dans la tête, mais cela revient à avoir des périodes hautes et courtes alternées).
  2. Filtrez la sortie avec deux filtres différents:
    1. un filtre passe-bas qui ne laisse passer que tout ce qui est en dessous, disons 1,2 kHz, un RC fera l'affaire
    2. un filtre passe-bande qui laisse passer 2 kHz, mais pas 1 kHz ni 3 kHz.
  3. rectifie et filtre passe-bas la sortie de ces deux filtres. Tada, vous avez construit un récepteur 2-Tone 2FSK, si vous le souhaitez.
  4. Ce sont vos deux signaux de sortie; utiliser un dispositif de seuillage, un "discriminateur" (diode Zener, comparateur) pour les convertir en binaire 0 ou 1.

Bonus

Si vous n'utilisez pas 1 et 2 kHz, mais quelques MHz, vous pouvez en fait remplacer votre câble de connexion par des antennes appropriées et effectuer ce transfert par voie aérienne. Vous enfreindriez également la loi en abusant du spectre pour lequel vous n'avez aucune licence.

PWM qui

Idea: identique à ci-dessus, mais plus simple.

Soit deux informations indépendantes:

  1. Cycle de service de sortie> 50%
  2. Modifications de sortie du tout

Vous pouvez avoir le cycle de service> 50% soit par

  • commutation de la broche constamment haute (cycle de service de 100%), ou basse (0%), ou par
  • réglage de l'unité PWM pour vous donner un cycle de service de 25% ou 75%.

Ensuite, comme ci-dessus, un filtre passe-bas, suivi d'un discriminateur qui commute à la moitié de la plage de tension de sortie, vous donne le premier bit de sortie.

Un filtre passe-haut, suivi d'un redresseur, d'un condensateur et d'un discriminateur vous donne le deuxième bit.

frarugi87
2017-10-16 16:59:28 UTC
view on stackexchange narkive permalink

Vous pouvez utiliser deux comparateurs et les valeurs high-input-low. Par exemple:

schematic

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

Les deux comparateurs donneront un 1 logique lorsque la tension à l'entrée est supérieure à 3/4 * Vcc (DATA one) ou 1/4 * Vcc (EN un).

Lorsque la broche attiny est tirée vers le bas, la tension sera fixée à 0V; les comparateurs auront alors la valeur 0 et 0. Lorsque la broche est laissée flottante (définie comme entrée), la tension passera à Vcc / 2 grâce aux deux résistances; les comparateurs afficheront 1 pour le EN, 0 pour le DATA. Lorsque la broche est tirée haut, la tension sera fixée à Vcc; les deux comparateurs afficheront un 1. Résumé:

  État de la broche | EN | LES DONNÉES
------------------------
  OUT 0 | 0 | 0
  INPUT | 1 | 0
  OUT 1 | 1 | 1
 

Notez que ce n'est pas évolutif contrairement aux solutions avec le PWM ou l'extension de port. Si vous avez besoin de plus de broches, il vaut peut-être mieux obtenir un registre à décalage et lui dédier deux broches (horloge et données); de cette façon, vous aurez plus de sorties si vous en avez besoin.

EDIT: Une autre solution, qui n'implique pas l'utilisation de circuits intégrés mais uniquement des composants discrets, est la suivante:

schematic

simuler ce circuit

Dans ce cas, vous devrez choisir les MOS pour qu'ils puissent s'allumer avec Vcc / 2; notez que les valeurs des résistances peuvent également être augmentées si vous voulez un courant plus faible. Vous pouvez également changer le P-MOS avec un PNP et le N-MOS avec un NPN, mais vous devrez ajouter une résistance de limitation de courant sur leur base (et je ne sais pas comment cela influence les trois états).

Dans tous les cas, voici le tableau des statuts

  État de la broche | EN | LES DONNÉES
------------------------
  OUT 0 | 1 | 1
  INPUT | 1 | 0
  OUT 1 | 0 | 0
 
Plus élégant que ma solution.J'ai oublié l'option à trois états.+1.
C'est le plus proche de ce à quoi je pensais.À Vcc = 3,3 V, BSS84 et BSS138 devraient fonctionner pour les MOSFET.Pour réduire la consommation d'énergie pour EN = 0, je pourrais ajouter deux diodes entre R1 et R2, en connectant l'entrée entre les diodes et les portes des deux côtés.Ensuite, la partie droite du circuit peut utiliser des onduleurs CMOS.Lorsque l'entrée est flottante, ils doivent passer respectivement à 0 (pour DATA) et 1 (pour EN).
@PaoloBonzini sachez que vous travaillez peut-être légèrement en dehors des spécifications, car la tension de seuil est très proche de Vcc / 2 ... Quant aux diodes, pourquoi devrait-elle diminuer la consommation électrique?Vous pouvez (et devriez probablement) augmenter la valeur des résistances jusqu'à quelques centaines de kiloohms.En ce qui concerne les CMOS, sachez que la région entre 0.8V et 2.0V est interdite (donc 1.65V n'est pas ok pour les ports CMOS).
Les diodes donneraient une tension différente aux portes plutôt que 1,65 V pour les deux, de sorte que je puisse utiliser des onduleurs CMOS (discrets, pas 7404) et diminuer la consommation d'énergie statique.Cela a-t-il un sens?
Transistor
2017-10-15 22:36:50 UTC
view on stackexchange narkive permalink

schematic

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

Figure 1. Un simple codage binaire à 3 états alimenté par un filtre passe-bas et surveillé par deux comparateurs pour extraire les données.Notez que de nombreux comparateurs sont des sorties à collecteur ouvert et nécessitent une résistance pull-up.

Vous aurez du mal à obtenir la constante de temps R1-C1.

oui, bien, c'est l'une des implémentations ADC possibles mentionnées dans ma [première réponse] (https://electronics.stackexchange.com/a/334574/64158).
TLW
2017-10-16 00:21:37 UTC
view on stackexchange narkive permalink

Une (mauvaise) solution est la suivante.

data = gpio
faible inversion du déclencheur schmitt de gpio à gpio.
monostable redéclenchable inversé de gpio à fr.

L'idée de base est que si la sortie est tristée, le schmitt le fera osciller, ce qui sera capté par le monostable pour désactiver la sortie.Cela posera un problème lors de la désactivation de la sortie.Et a une consommation d'énergie lorsqu'il est désactivé.

En fait, ce n'est pas une mauvaise idée.J'ai oublié l'option à trois états lors de la rédaction de ma réponse.Introduisez-le dans un anti-rebond RC sur l'entrée de l'autre puce.La deuxième puce peut lire l'état de l'entrée, basculer l'entrée sur une sortie et essayer de la tirer à l'autre niveau logique, la relâcher et voir si elle y reste.Si c'est le cas, la première puce est tri-déclarée.Sinon, ce sont des données.Renforcez votre réponse.
Pour résoudre le problème de consommation d'énergie, je pourrais simplement inverser la direction EN et DATA.
Nick Gammon
2017-10-17 00:53:37 UTC
view on stackexchange narkive permalink

À moins que vous ne fassiez une mission qui stipule spécifiquement que vous devez utiliser un Attiny85, peu importe quoi, alors la solution de loin la plus simple est d'utiliser une puce avec plus de broches (par exemple, l'Atmega328P). Le coût serait pratiquement le même (par exemple, 2,00 $ contre 1,50 $).

Certaines des autres réponses qui suggèrent d'utiliser un protocole à un fil, des registres à décalage, des déclencheurs schmitt, des comparateurs, etc. ajoutent simplement plus de pièces (et de coût) de toute façon. Il serait beaucoup plus facile d'utiliser un microprocesseur qui fait réellement ce que vous voulez, que d'ajouter des puces supplémentaires pour étendre ses fonctionnalités d'une manière moins facile à utiliser.


Autre possibilité: la broche / RESET peut être configurée comme une broche IO générale. Vous pouvez obtenir une épingle supplémentaire de cette façon. Soyez averti que la reprogrammer par la suite sera plus difficile. Cela dit, ce n'est pas impossible. J'ai un article sur la programmation haute tension de puces comme l'Attiny85, en utilisant un autre processeur (dans ce cas, un Arduino Uno). Quelques pièces permettent d'activer le 12V vers la broche / RESET au moment opportun.

AaronD
2017-10-17 01:46:40 UTC
view on stackexchange narkive permalink

En partant du deuxième exemple de @ frarugi87 ( https://electronics.stackexchange.com/a/334700/53375), vous pourriez faire une chose similaire avec les optoisolateurs:

schematic

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

L'avantage de cette version est qu'elle peut consommer très peu de courant si la tension directe de l'optos (y compris les diodes supplémentaires en série pour garantir cela) est supérieure à la moitié de l'alimentation.Bien sûr, cela ne peut pas être plus que l'approvisionnement complet ou ils ne viendront jamais du tout.

OUT0 et OUT1 peuvent avoir les noms appropriés et des résistances pull-up / down pour produire la combinaison de signaux que vous souhaitez.

C'est bien, mais faites attention avec le GPIO tri-déclaré que les deux LED seront un peu conduction.


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...