Richtige Methoden zum Trennen von ICs in Niedrigleistungszuständen, um eine parasitäre/Rückspeisungsversorgung zu vermeiden

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.

Geben Sie hier die Bildbeschreibung ein(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:

  1. Erzwinge VCC auf GND (nicht sicher wie? Hbridge?). (Wenn ich das tue, was passiert mit den Datenpins, die hoch sind?)
  2. Platzieren Sie einen Tri-State-Puffer zwischen allen Datenpins und diesen Geräten, und versetzen Sie den Tri-State-Puffer während des Ruhezustands in einen hochohmigen Zustand, trennen Sie VCC oder GND nur mit P- oder N-Mosfet
  3. Trennen Sie GND nur mit N-Mosfet und platzieren Sie Dioden auf allen Datenpins
  4. Gibt es eine Art Stromverriegelung, die sowohl VCC als auch GND trennt und sie in einen „hochohmigen“ Zustand versetzt (wie einen Tri-State-Puffer für Strom?). Auf diese Weise kann kein Strom aus den Datenleitungen „herausfließen“.

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

Ja, das ist super ärgerlich, ich habe tatsächlich Fälle gesehen, in denen Strom, der einen GPIO-Pin erreicht, einen AVR einschalten (Code ausführen) kann, selbst wenn kein Strom die VCC-Pins erreicht ...
Lustige Beobachtung: Ich habe einige weitere Google-Suchen durchgeführt, seit ich diese Frage gepostet habe, und diese Frage zu SE wurde als oberster Rang eingestuft. Google hat diese Seite in weniger als 10 Minuten indexiert.
Nur Kommentar: Richtige Trennschalter, wie andere vorgeschlagen haben, sind die beste Lösung, wenn eine Fernspannung nicht beseitigt werden kann. Es KANN sein, dass die Verwendung von Schottky-Dioden an Eingangsstiften mit Kathoden, die gemeinsam und normalerweise auf Vcc liegen und an Masse geklemmt sind, wenn eine Isolierung gewünscht wird, eine angemessene Eliminierung hochohmiger Spannungen bietet. Offensichtlich kann das Schottky-Klemmen einer Stromzuleitung mit niedriger Impedanz Ihren Tag verderben.
Wahrscheinlich ist das Hi-Z-ing aller Ihrer Verbindungen auf irgendeine Weise (Tri-State-µC-Pins, Tri-State-Puffer, Analogschalter usw.), wie Peter Smith und CL vorgeschlagen haben, die beste Wahl. Welche der Methoden besser ist, bin ich mir nicht sicher. Auf jeden Fall: Warum verwenden Sie zum Schalten ein Relais und keinen P-MOSFET (oder einen Lowside-N-MOSFET, obwohl das Lowside-Schalten hier wahrscheinlich etwas schwieriger sein wird)?

Antworten (4)

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.

ADG812 aus Leckage

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:

Leistungsanforderungen des ADG812

Die übliche Reihenfolge zum Ausschalten:

  1. Deaktivieren Sie die Datenpfadschalter

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

Verzeihen Sie die Unkenntnis der Frage, aber unterscheidet sich dies deutlich von einem Tri-State-Puffer? (Und danke für die Antwort!)
Diese werden auch als „Pass Gates“ bezeichnet.

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.

Sie müssen sie eigentlich nicht hoch-Z machen, Sie können einfach die GPIO-Leitungen des Mikros niedrig fahren.
Das wäre gefährlicher, wenn der andere Chip das Signal jemals hoch treiben könnte.
Nur damit ich es vollständig verstehe, ist das Umschalten der Pins auf Eingänge immer dasselbe, als würde man sie in einen hochohmigen Zustand versetzen? Gilt das für die meisten MCUs oder nur für die AVRs? Ist das derselbe Status wie bei 74 x 125, wenn OE deaktiviert ist?
@JeremyGilbert Alle CMOS-Eingänge haben eine hohe Impedanz (es sind MOSFET-Gates, die sich wie sehr kleine Kondensatoren verhalten). Ein deaktivierter 125er-Ausgang hat kein Gate, aber der Unterschied ist vernachlässigbar.
@JeremyGilbert Eingänge sind in den meisten Anwendungen im Allgemeinen High-Z; Schließlich ist es schwer, etwas zu spüren, wenn Sie die Linie fahren. Zumindest bei AVRs (und wahrscheinlich auch anderen, aber ich kenne die Einzelheiten nicht) müssen Sie auf die internen Pullups achten: Wenn sich der Pin im Eingangsmodus befindet (über DDRx konfiguriert) und Sie LOW schreiben es (über PORTx), es ist im regulären Hi-Z-Modus. Wenn Sie jedoch im Eingabemodus HIGH schreiben, wird der interne Pullup aktiviert, und von außen sieht der Pin wie ein ~ 50K-Widerstand gegen VCC anstelle einer schwebenden Leitung aus.

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 ich 2 C . 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.

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan