Wie kann ich mit dem Mikrocontroller eine Tristate-Ausgabe lesen?

7

Ich möchte die STAT-Leitung eines Lithium-Ionen-Lade-Manager-ICs MCP73831 an einen Mikrocontroller anschließen, um den aktuellen Ladestatus zu lesen.

Das Datenblatt erklärt in Abschnitt 5.2.1, dass die STAT-Zeile eine Tristate-Ausgabe ist und den folgenden Status hat:

  • Hoch
  • Niedrig
  • Hohe Impedanz

und es wird eine Tabelle bereitgestellt, die erklärt, wie jeder Füllstand jeden Ladezustand der Batterie darstellt.

Wie kann ich diesen Pin mit einer Mikrocontroller-E / A verbinden und diese drei unterschiedlichen Zustände lesen?

Das Lesen von High und Low ist recht einfach, aber das Erkennen eines Eingangs ist hochohmig, was ich vorher noch nicht getan habe.

RHaguiuda
quelle

Antworten:

11

Sie können es mit zwei 10k-Widerständen an Masse und Vcc binden und den Pegel über einen A / D-Eingang ablesen.

Wenn Sie keinen A / D-Ersatz haben, schließen Sie ihn mit einem 10k-Widerstand an einen anderen Pin Ihres uC an. Wenn der Pin entweder hoch oder niedrig ist, wird er natürlich als hoch bzw. hoch angezeigt. niedrig (vorausgesetzt, es kann eine 10k Last fahren). Wenn es hochohmig ist, wird es gleich dem angezeigt, was Sie am anderen Pin ausgeben.

Wouter van Ooijen
quelle
+ Ich mag die 2. Idee. Lesen Sie mit hoher und niedriger Ausgabe, vier Möglichkeiten, von denen nur drei sinnvoll sind.
Spehro Pefhany
Gute Idee mit dem anderen Pin. In diesem Fall kann / wird der Eingang jedoch die Prozessoren Vcc überschreiten. Es wurde ein Beitrag anstelle eines erweiterten Kommentars hinzugefügt.
Carveone
8

Bei vielen Mikrocontrollern können Sie zwischen einem schwachen Pullup- und einem schwachen Pulldown-Widerstand an einem GPIO-Eingang wählen - in der Größenordnung von etwa 50.000 bis 100.000 Ohm. Wenn der Eingang hoch-z ist, wird ein Lesevorgang mit aktiviertem schwachem Pulldown niedrig und ein nachfolgender Lesevorgang mit schwachem Pullup hoch angezeigt.

Denken Sie daran, einige µs zwischen dem Umschalten des Widerstands und dem GPIO-Messwert zu warten, damit sich die Spannung am Pin einstellen kann.

Beachten Sie, dass ältere AVRs und 8051s möglicherweise nur einen schwachen Pullup, aber keine schwachen Pulldown-Widerstände haben.

Turbo J.
quelle
2
+1 ... Bei MPUs ohne schwaches Pullup und schwaches Pulldown können Sie einen einzelnen externen Widerstand zu einem anderen GPIO-Pin hinzufügen und damit den Widerstand hoch oder niedrig treiben.
Tut
4

Wenn Sie das Dokument lesen - Abschnitt 3.3 sehen Sie , dass es beabsichtigt , mit einer Pull - up - Widerstand verwendet werden.

Bei einem Open-Drain- oder Tri-State-Signal soll es nicht gelesen werden, wenn es sich im Tri-State-Modus befindet. Es ist so konzipiert, dass das Signal von mehreren Geräten gemeinsam genutzt werden kann. Es wird verwirrend, wenn Sie das Signal lesen und es sich im Drei-Zustands-Modus befindet (und Sie es nicht wissen), können Sie falsche Messwerte erhalten. Der beste Weg ist, dann einen schwachen Pull-up anzuwenden, damit das Signal entsprechend gelesen wird, wenn sich das Signal in einem mehrdeutigen Zustand befindet. Da dieses Signal eine LED ansteuern soll, um einen Ladestatus anzuzeigen (dh niedrig wird geladen), bedeutet dies, dass es nicht aufgeladen wird, wenn es hochgezogen wird und hoch angezeigt wird.

Geben Sie hier die Bildbeschreibung ein

Platzhalter
quelle
1
Die Tabelle in Abschnitt 5.2.1 zeigt an, dass (für den MCP73831) ein "HIGH Z" -Ausgang "Shutdown" oder "No Battery Present" anzeigt, während ein "H" -Ausgang (High) "Charge Complete - Standby" anzeigt. Ein Pull-up-Widerstand allein ermöglicht es der MCU nicht, den Unterschied zu erkennen.
Tut
Mit einem Pull-up werden dann die Modi "Herunterfahren", "Keine Batterie vorhanden" und "Aufladen abgeschlossen - Standby" alle auf den gleichen Wert von Hoch abgebildet. Dies alles sieht so aus, als ob das Datenblatt konsistent ist.
Platzhalter
@placeholder, dass eine Zuordnung möglicherweise nicht erwünscht ist - Ladungskonkurrenz und keine Batterie vorhanden sind extrem unterschiedliche Fälle.
Chris Stratton
0

Wenn ich diesem Beitrag eine Warnung hinzufügen darf. Der MCP73831 ist ein Batterieladechip und daher ist sein Vdd höher als sein Vbat.

Geben Sie hier die Bildbeschreibung ein

Angenommen, Ihr Mikrocontroller ist an Vbat angeschlossen und Vdd wird über USB versorgt, dann könnte Vdd mindestens 1,5 V höher sein als V ucontroller .

Der Haken ist, dass beim 73831 mit Totempfahlausgängen STAT auf Vdd bezogen ist . Verbinden Sie STAT also nicht direkt mit einem uC-Eingang. Verwenden Sie dazwischen so etwas wie einen 10k-Widerstand. Bei einem PIC-Mikro werden die Eingangsdiodenklemmen auf Vcc geklemmt (überprüfen Sie das Datenblatt vor dem Latchup auf den maximalen Strom).

Als Nachtrag - letztes Jahr bin ich auf einen Hack gestoßen, um Hi / Low / Z-Eingaben zu lesen, die für einen PIC bestimmt waren, aber möglicherweise für Sie funktionieren (oder auch nicht). So etwas wie (Pseudocode):

STAT ----[10k]------ PIC
PIN starts as input

set PIN low
set PIN to output
set PIN to input
set PIN high
value = read PIN  (assuming 1 for high, 0 for low)
value = value << 1
set PIN to output
set PIN to input
value |= read PIN

Dann erhalten Sie 0 für niedrig, 1 für Hi-Z und 3 für hoch. YMMV.

Carveone
quelle
Ich habe das gleiche Problem. Was ich nicht verstehe ist, warum sollte es mit dem 10k funktionieren und den AVR nicht zerstören? Es begrenzt den Strom, aber die Spannung beträgt immer noch 5 V, was über der spezifizierten maximalen E / A-Spannung von VCC + 0,5 V liegt.
da_petcu21
Die Spannung auf einer Seite des Widerstands liegt außerhalb der Spezifikation, aber am Pin des Mikros klemmen die Eingangsschutzdioden die maximale Spannung auf VCC + einen Diodenabfall, der innerhalb der Spezifikation liegt. Wenn der Strom jedoch zu hoch ist, werden die Dioden trotzdem zerstört. Wenn Sie also 200 V -> 10 Ohm Widerstand -> Pin hätten, wäre der Strom 20 uA. Ich würde das jetzt auch nicht ohne externe Schottky-Dioden tun, aber Sie haben die Idee.
Carveone