Ich arbeite an einem batteriebasierten AVR-basierten Projekt mit geringem Stromverbrauch, das einige verschiedene Geräte integriert, darunter einen Neopixel-Streifen und einen Adafruit-Pixie . Wenn das gesamte Gerät im Ruhezustand ist, möchte ich, dass es weniger als 0,1 mA zieht, um die Lebensdauer der LiPo-Batterie zu maximieren.
Ich habe das alles zum Laufen gebracht (gemessen bei 0,035 mA), aber ich bin mir nicht sicher, ob ich es unbedingt auf die „richtige“ Weise gemacht habe, und ich plane, ein darauf basierendes Produkt zu bauen, also möchte ich es richtig machen.
(Nicht gezeigt: eine Freilaufdiode für das Relais)
Das Hauptanliegen, das ich habe, ist die „parasitäre“ Stromversorgung von Geräten, wenn VCC über Strom getrennt wird, der von Datenpins fließt. Zum Beispiel hat der Pixie (der seriell kommuniziert) keinen Power-Down-Modus und verbraucht selbst im ausgeschalteten Zustand etwa einen Milliampere. Also platzierte ich ein kleines Relais, um seinen VCC zu trennen, und entdeckte, dass der serielle Pin tatsächlich immer noch den Pixie mit Strom versorgte. Hinweise an anderer Stelle deuteten darauf hin, dass viele Chips eine Diode haben, die ihre digitalen Eingangspins als Stromschutz auf VCC überbrückt. Um dies zu lösen, musste ich die serielle Bibliothek und tatsächlich digitalWrite (PIN, LOW) während des Ruhezustands aussetzen.
Dasselbe gilt für den WS2812b-Streifen – das Trennen von VCC ermöglicht immer noch, dass das Gerät über den Daten-Pin mit Strom versorgt wird. Und in anderen Designs, wenn ich GND mit einem N-Kanal-MOSFET getrennt habe, habe ich das Gegenteil gesehen - einen Stromrückfluss durch die Datenleitung zur Masse! (Dies musste mit einer Diode pro Post auf PJRC gelöst werden.) Die WS2812b nehmen tatsächlich jeweils etwa einen Milliampere auf, selbst wenn sie nicht beleuchtet sind.
Daher die Frage: Gibt es eine allgemeine, „saubere“ Möglichkeit, VCC und GND während des Systemschlafs von Teilen eines Projekts zu trennen, wenn sich Datenpins in der Mischung befinden. Was ist die beste Vorgehensweise?
Einige Ideen:
Kann mich jemand über die sauberste und wiederholbarste Art aufklären, mit dieser Art von „Lasttrennungsproblem“ umzugehen? (Unnötig zu erwähnen, dass ich Stunden damit verbracht habe, dieses Problem mit wenig Glück zu googeln, obwohl ich diesen technischen Hinweis zum Lastschalten gefunden habe, der sich jedoch nicht mit Rückspeisung und parasitärer Leistung befasst.)
Wenn ich dies tue, verwende ich normalerweise CMOS-Analogschalter auf den betroffenen Datenleitungen.
So etwas wie der ADG812 verfügt über 4 Kanäle von SPST-Schaltern, die sich leicht für eine recht schnelle Logik eignen und im ausgeschalteten Zustand eine wirklich hohe Impedanz zwischen den Schaltknoten bieten.
Das Schöne daran ist, dass die Technik sowohl für unidirektionale als auch für bidirektionale Datenleitungen funktioniert.
Auch diese Teile laufen auf einem strahlenden Lächeln:
Die übliche Reihenfolge zum Ausschalten:
Deaktivieren Sie die Datenpfadschalter
Domäne herunterfahren.
Einschalten ist natürlich das Gegenteil.
[Aktualisieren]
Diese sind in der Tat unter anderen Namen bekannt, wie z. B. Pass Gates und Transmission Gates .
Diese unterscheiden sich erheblich von einem echten Tri-State-Puffer (wie Sie im Diagramm im obigen Link sehen können), aber für gewöhnliche Logik ist der Effekt besser (dies ist von Natur aus ein bidirektionales Gerät), aber mit geringerer Leistung.
Wenn die Datensignale mit Ihrem Mikrocontroller verbunden sind, können Sie sie einfach hochohmig machen, indem Sie diese Pins als Eingänge konfigurieren. (Wenn der andere Chip sehr wenig Strom verbraucht, können Sie seine Vcc wie ein Datensignal behandeln.)
Andernfalls können Sie analoge Schalter (74x66 Logikchips) verwenden, um sie zu trennen. Für unidirektionale Signale würde auch 74x125 funktionieren.
Ich glaube nicht, dass es leider eine Strategie gibt, die für alle passt. Schalten Sie die Stromversorgung zu den Subsystemen um, wie Sie es bereits getan haben. In der Software werden die Pins für Niedrigleistungszustände niedrig angesteuert, es sei denn, dies würde einen stationären Zustand mit hoher Leistung verursachen. Fahren Sie in diesem Fall den Stift hoch. Lassen Sie niemals Eingänge floaten. Sequenzieren Sie die Leistung nach Bedarf, um sichere Anfangsbedingungen herzustellen.
Ein unangenehmes Problem, das dazu führen kann, dass Mikrocontroller sehr seltsame Dinge tun.
Die nette Lösung ist die Verwendung von seriellen Pulldown-E / A wie
. Dies erfordert Pull-up-Widerstände auf SCK-, SDA-Leitungen. Die Pull-up-Widerstände sind mit der geschalteten Vcc-Leitung verbunden. Stellen Sie sicher, dass die geschaltete Vcc-Leitung beim Ausschalten schön auf null Volt abfällt (lassen Sie sie nicht schwimmen).
Sie haben diese Option nicht - Sie sind gezwungen, asynchrone serielle E / A zu verwenden. Einige Mikrocontroller ermöglichen einen ähnlichen Ansatz wie I2C, um das Problem zu lösen. Wenn Sie den seriellen Ausgangspin so programmieren können, dass er nur Pull-Down ist und nicht das üblichere Pull-Up-for-1, Pull-Down-for-0 , dann können Sie einen Pull-Up-Widerstand zu Switched-Vcc hinzufügen ein logisches High aufbauen.
Diese Lösung ist nicht so rauschresistent wie Ihr derzeitiger Ansatz, aber sie sollte das Problem der Rückspeisung Ihrer E/A-Module vom AVR lösen. Es ist nicht wirklich eine "saubere" Lösung, aber es ist viel sicherer für die Mikrocontroller in Ihren IO-Modulen.
Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan
Vicatcu
Jeremy Gilbert
Russell McMahon
FlashCactus