Frage:
Multiplexing-Eingänge auf einem Mikrocontroller
BG100
2012-08-07 23:04:31 UTC
view on stackexchange narkive permalink

Ich habe einen 4-Wege-DIL-Schalter, mit dem ich Eingaben für einen Mikrocontroller bereitstelle, und ich muss einen Port freigeben, der für etwas anderes verwendet werden kann.

Gibt es eine Möglichkeit, 4 Eingänge zu multiplexen? 3 Mikrocontroller-Ports? Ich denke, dass es eine Möglichkeit gibt, 2 Pins als Eingänge und einen dritten Ausgangspin zu haben, der hoch angesteuert werden kann, um Schalter 1 und 2 zu lesen, und niedrig, um Schalter 3 und 4 zu lesen.

Mein aktuelles einfaches Design ist unten dargestellt. Kann ich dies mit nur 3 Pins tun?

schematic

Sieben antworten:
jippie
2012-08-08 00:22:00 UTC
view on stackexchange narkive permalink

Charlieplexing nutzt die Tristate-Pins des Mikrocontrollers, kostet jedoch zusätzliche Dioden und etwas komplexere Programmierung.

Mit N IO-Pins können Sie N (N- 1) Schalter / LEDs.

Der Artikel Charlieplexing mit Schaltern beschreibt, wie es mit Schaltern und LEDs funktioniert.

Tree pin and 6 switch Charlieplexing

Das ist großartig, genau das, wonach ich gesucht habe ... Ich habe von Charlieplexing mit LEDs gehört, aber nicht daran gedacht, die gleiche Methode auch für Schalter zu verwenden. Vielen Dank.
stevenvh
2012-08-07 23:19:36 UTC
view on stackexchange narkive permalink

Was Sie beschreiben, ist ein 2-zu-1-Multiplexer wie der 74HC157, der ein Quad-Multiplexer mit zwei Eingängen ist, also 2 Eingänge zu 1 Ausgang und 1 Eingang auswählen. Sie verwenden zwei Multiplexer für die vier Eingänge.

Der 74HC153 macht eine ähnliche Sache, aber es ist ein dualer 4-zu-1-Multiplexer , also 4 Eingänge, 1 Ausgang und 2 Auswahlleitungen pro Multiplexer. Persönlich finde ich das eine logischere Lösung für Ihre Anwendung.

Verbinden Sie den Freigabeeingang mit Masse und vergessen Sie nicht, nicht verwendete Eingänge entweder mit Masse oder Vcc zu verbinden.

Vielen Dank für Ihre Antwort, aber ich bevorzuge die Charlieplexing-Methode, hauptsächlich, weil ich bereits die Dioden habe und dafür neue Teile bestellen müsste.
Bruno Ferreira
2012-08-07 23:31:07 UTC
view on stackexchange narkive permalink

Als Alternative zu Stevens Lösung können Sie einen 2: 4-Demux wie diesen verwenden:

Schematic

Aha! Schönes Bild, aber was sind das für hässliche kleine Dreiecke? ;-);
@stevenvh Als Referenz sind diese hässlichen kleinen Dreiecke die Dioden, die ein Verbrennen der Demux-Ausgänge vermeiden, wenn mehr als ein Schalter eingeschaltet ist. :-) Übrigens +1 für deine Antwort.
Ich habe nur geärgert. Ich habe gehört, sie sind teurer als Pulldown-Widerstände. Hast du das auch gehört? :-)
@stevenvh Ja, das leite ich auch. Ich finde immer zuerst die schwierigere Lösung. Entschuldigung für den Tippfehler.
So wie Sie es gezeichnet haben, benötigen Sie einen Demux mit aktiv-hohen Ausgängen. Sie können einen 74HC238 verwenden, bei dem es sich um die Active-High-Version des gängigeren 74HC138 handelt. Anscheinend gibt es keine Active-High-Version des 74HC139, die besser passen würde. Zumindest konnte ich keinen finden.
@stevenvh HEF4555B hat aktiv-hohe Ausgänge.
stevenvh
2012-08-08 15:13:39 UTC
view on stackexchange narkive permalink

Großartige Lösung von jippie . Ich möchte etwas näher darauf eingehen.

Das Schema:

enter image description here

Die Idee ist, einen der E / A-Ausgänge und die beiden anderen Eingänge zu erstellen, mit denen Sie den lesen können Zustand von zwei Tasten. Dreifache Ausgabe \ $ \ mal \ $ zwei Eingaben sind für 6 Tasten geeignet, wie der Schaltplan zeigt.

Wie aktiviere ich den Ausgang? Hoch machen? Machen wir es für Pin 1, dann sind die Dioden B und F in Vorwärtsrichtung vorgespannt, sodass wir erwarten würden, diese Tasten lesen zu können. Bei vielen Mikrocontrollern funktioniert dies nicht. Durch Drücken der Taste B wird Eingang 2 hoch, aber was ist, wenn die Taste nicht gedrückt wird? Die Eingabe würde schweben, und dann können Sie nichts Sinnvolles darauf lesen. Ein Pulldown-Widerstand würde helfen, aber viele Mikrocontroller haben nur Pull-Up-Widerstände, und dann werden Sie nie einen niedrigen Pegel lesen. Ich weiß nicht über alle Bescheid, aber zumindest einige AVR- und PIC-Mikrocontroller haben nur Klimmzüge.

In diesem Fall ist es richtig, die internen Klimmzüge zu aktivieren und den Ausgang zu aktivieren, indem Sie ihn niedrig machen. Wir steuern nicht die Tasten B und F, sondern A und E. Wenn die Taste A nicht gedrückt wird, wird durch das Hochziehen der Eingang 2 hoch. Drücken Sie die Taste A und Sie ziehen den Eingang nach unten.

Der Algorithmus:

  IO2 = Eingang, Pull-up enabledIO3 = Eingang, Pull-up enabledIO1 = Ausgang, lowButton_A = IO2 (niedrig = gedrückt) Button_E = IO3 (niedrig = gedrückt) IO1 = Eingang, Pull-up aktiviertIO2 = Ausgang, lowButton_B = IO1 (niedrig = gedrückt) Button_C = IO3 (niedrig = gedrückt) IO2 = Eingang, Pull-up aktiviertIO3 = Ausgabe, lowButton_F = IO1 (niedrig = gedrückt) Button_D = IO3 (niedrig = gedrückt)  

Soweit ich weiß, haben beispielsweise alle NXP Cortex-M-Controller beide konfigurierbare Pull-Ups / Pulldown-Widerstände. Für diese können Sie positive Logik (hoch = gedrückt) verwenden, wenn Sie die Pulldowns und einen aktiven hohen Ausgang verwenden. Beachten Sie, dass Sie verschiedene Schaltflächen für denselben Ausgang lesen:

  IO2 = Eingang, Pulldown aktiviertIO3 = Eingang, Pulldown aktiviertIO1 = Ausgang, hoch
Button_B = IO2 (hoch = gedrückt) Button_F = IO3 (hoch = gedrückt) IO1 = Eingang, Pulldown aktiviertIO2 = Ausgang, highButton_A = IO1 (niedrig = gedrückt) Button_D = IO3 (niedrig = gedrückt) IO2 = Eingang, Pulldown enabledIO3 = Ausgabe, highButton_E = IO1 (niedrig = gedrückt) Button_C = IO3 (niedrig = gedrückt)  
Schöne Erklärung.
supercat
2012-08-08 00:50:35 UTC
view on stackexchange narkive permalink

Wenn Sie sich darauf verlassen können, dass Ihre E / A-Pins auf demselben Schwellenwert schalten, und es Ihnen nichts ausmacht, Interrupts für eine lange Zeit zu deaktivieren, während Sie die Schalter lesen (z. B. weil Sie sie nur beim Start gelesen haben), können Sie dies tun Verwenden Sie zwei E / A-Pins, sechs Widerstände und einen Kondensator. Verdrahten Sie einen 1K-, 2,2K-, 4,7K- und 10K-Widerstand parallel zu jedem Schalter und verdrahten Sie alle Schalter in Reihe, sodass die Kette einen Gesamtwiderstand von ungefähr 0K bis 17,9K hat. Schalten Sie einen 1K-Widerstand in Reihe mit dieser Kette und binden Sie ein Ende der Kette an einen Anschlussstift und das andere Ende an einen Kondensator. Das andere Ende des Kondensators sollte gegen Masse gehen. Verdrahten Sie einen 10K-Widerstand vom anderen Anschlussstift mit diesem Kondensator.

Um die Schaltereinstellung zu bestimmen, erden Sie beide Anschlussstifte und lassen Sie sie eine Weile geerdet. Schweben Sie dann den an die Widerstandskette angeschlossenen und treiben Sie den an den 10K-Widerstand angeschlossenen an. Zeit, wie lange es dauert, bis der an die Widerstandskette angeschlossene Pin hoch ist. Erden Sie dann beide Port-Pins, lassen Sie sie eine Weile geerdet und schweben Sie den mit dem 10K verbundenen Pin, während Sie den Widerstandstring-Pin hoch treiben und wie lange es dauert, bis der 10K-Pin umschaltet.

Wenn der Stifte schalten bei gleichen Spannungen, das Verhältnis der Zeiten ist das Verhältnis der Widerstände. Da der 10K-Widerstand bekannt ist, kann einer den anderen berechnen.

Es kann möglich sein, die Genauigkeit geringfügig zu verbessern, indem ein dritter Pin verwendet wird, der direkt mit dem Kondensator verbunden ist, um zu bestimmen, wann er geeignet geladen ist; Die Verwendung des gleichen Stifts für beide Messungen würde sicherstellen, dass beide Messungen mit derselben Schaltschwelle durchgeführt werden.

Interessante Antwort, ich hätte es nie so gemacht. Die Programmierung mag etwas schwierig sein, aber danke für Ihre Antwort.
Oder verwenden Sie die integrierte Klimaanlage und überspringen Sie alle Komplikationen
Ja Ja. Obwohl der RC-Ansatz den Vorteil hat, dass eine Zeit proportional zum Widerstand ist, während der ADC-Ansatz im Allgemeinen eine nichtlineare Spannung in Bezug auf die Schaltereinstellung ergibt (man könnte eine Annäherung an die lineare Spannung erreichen, wenn der Pull-up-Widerstand groß ist relativ zum Pulldown-Widerstand oder umgekehrt, aber das würde die Dinge im Allgemeinen in einen kleinen Teil des ADC-Bereichs zerquetschen.
Gregory Ion
2012-08-08 05:31:55 UTC
view on stackexchange narkive permalink

Ich habe festgestellt, dass Sie dort einen Analogeingang haben. Wenn Sie eine minimale Anzahl von Komponenten verwenden möchten, verbinden Sie eine Seite aller Schalter mit dem Analogeingang, und verbinden Sie den Analogeingang mit einem 1K-Widerstand mit + V. Schließen Sie vier Widerstände mit unterschiedlichen Werten an die andere Seite der Schalter an. Wählen Sie Ihre Widerstände sorgfältig aus, um sicherzustellen, dass Sie eine andere Spannung erhalten, unabhängig davon, wie viele Schalter gleichzeitig eingeschaltet sind. Generieren Sie einen Interrupt, wenn sich der A / D-Wandlungswert ändert, oder führen Sie eine Routine durch, die den Wert so oft liest, wie Sie möchten.

Ich glaube, dass dies die kostengünstigste Lösung für Ihr Problem ist. Es werden nur fünf Widerstände benötigt.
Würde dies angesichts der Tatsache, dass die 4 Schalter effektiv eine 4-Bit-Binärzahl bilden, eine ausreichende Auflösung (mit 1% Widerstandstoleranz) ergeben, um 16 verschiedene Schalterkombinationen zuverlässig erkennen zu können?
kenny
2012-08-08 00:48:11 UTC
view on stackexchange narkive permalink

Mein Ansatz wäre die Verwendung eines seriellen Busses I2C / SPI / etc .. Sie könnten diesen auf 3 Pins betreiben und ein Eingangsregister für die Schalter auf diesem Bus haben. Der MCP22017 ist zwar teuer und bietet derzeit mehr Bits, ist aber recht flexibel. Wenn Sie sich umschauen, stehen andere Optionen mit 8 Bit zur Verfügung.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...