Open Drain Serial TX-Ausgang auf Arduino

Ich habe versucht, mit einem Arduino Nano einen seriellen Open-Drain-Ausgang zu implementieren. Im folgenden Beispiel habe ich 2 Arduino Nanos (beide mit 5 V Vcc) verwendet, wobei ein Arduino als Sender und der andere als Empfänger verwendet wurde.

Der Sender ist so programmiert, dass er die folgende Reihe von Bytes sendet:

fe fe 68 60 39 12 11 81 16 68 c1 1 35 1a 16 fe fe

Vom Empfänger wird natürlich erwartet, dass er dasselbe erhält. Aber stattdessen scheint der Empfänger Folgendes zu empfangen:

0 0 9 2 63 3b 77 3f 3a 9 1f 7f 65 39 3a 0 0

Das Folgende ist die Schaltung, die ich als Schnittstelle zwischen den beiden Arduinos verwende:

Schnittstellenschaltung

Ich entschuldige mich, wenn die Terminologie, die ich hier verwendet habe, nicht ganz korrekt ist, da ich nur ein Anfänger auf dem Gebiet bin. Übersehe ich etwas in der Schaltung? Ist der N-Kanal-MOSFET, den ich hier verwende, für diese Anwendung geeignet? Jeder Einblick wäre sehr dankbar, danke im Voraus.

Beachten Sie, dass Sie einen GPIO-Pin direkt vom Eingangsmodus (= Tristate) auf Low-Ausgang und umgekehrt per Software umschalten können. Wenn Sie also eine serielle Softwareschnittstelle implementieren, benötigen Sie nicht einmal einen externen Transistor, um ein Äquivalent zu einem Open-Drain-Ausgang zu erzeugen. Sie geben Ihre Daten im Grunde nur an das DDRx statt an das PORTx-Register aus.

Antworten (3)

Dies wird auf verschiedene Weise durcheinander gebracht:

  1. Sie sagen, der digitale Ausgang ist Open Drain, aber Sie haben nichts bereitgestellt, was das Signal jemals hoch gehen lässt.
  2. Ein 60 V 55 A MOSFET ist hier grob übertrieben. Zumindest dieser lässt sich mit nur 5 V Gate-Ansteuerung sinnvoll einschalten. Also, obwohl es albern ist, sollte es zumindest funktionieren.
  3. Der Transistor invertiert. Das bedeutet, dass die sendenden und empfangenden UARTs für entgegengesetzte Polarität konfiguriert werden müssen. Das ist bei den meisten Mikrocontrollern nicht möglich. Solche UARTs sind im Allgemeinen mit einem hohen Leitungsleerlaufpegel fest verbunden.
  4. Sie haben nichts über Baudrate oder Hardwareprotokoll wie 8-N-1 erwähnt. Das kann man nicht übersehen.
  5. Die Baudrate muss langsam genug sein, damit der passive Pullup die Leitung in einem kleinen Bruchteil der Bitzeit hochziehen kann.
  6. Es ist ein echter Kopfkratzer, warum man die beiden Pins nicht einfach direkt mit einem Pullup miteinander verbunden hat. Wieso ist das nicht selbstverständlich? Hier ist kein Hirngespinst notwendig.
"Sie haben nichts bereitgestellt, was das Signal jemals hoch gehen lässt"?! Was ist mit R2?
@ Jim: R2 zieht den Ausgang des FET hoch, nicht den Open-Drain-Ausgang des Prozessors, der TX1 antreibt.
So wie ich es verstehe, hat der µC nur einen Push / Pull-TX-Ausgang, und das OP versucht, ihn über einen externen Transistor in einen offenen Drain umzuwandeln (vielleicht für Multimaster).
@Jim: Das OP bezieht sich auf eine "Open-Drain-Serienausgabe". Es hört sich so an, als wolle er einen benutzen, nicht einen machen, zumal er keinen Grund hat, warum er einen machen möchte. Wenn Ihre Interpretation richtig ist, dann ist das eine ganz andere Frage.
"Versuch, einen offenen Abfluss zu implementieren" war, wo ich die Betonung auf implement las . Außerdem hat IIRC der Arduino Nano keinen seriellen Open-Drain-Ausgang (Hardware).
Ich glaube nicht, dass der digitale Ausgang Open Drain ist. Der Arduino Nano basiert auf dem ATmega328. Soweit ich weiß (nach dem Lesen des Datenblatts), hat es nur einen Open-Drain-Ausgang für die I²C-Schnittstelle (genannt "2-wire Serial Interface" (TWI)) für die Signale SDA und SCL (Seite 108), nicht den seriellen Ausgang .

Zunächst einmal: Warum willst du den MOSFET dort verwenden?

Und welchen Nutzen soll R1 haben?

Zweite:

Durch die Verwendung eines einzelnen MOSFET wird der Ausgang des ICs invertiert. Wenn der IC also einen hohen Pegel am Tx-Pin ausgibt, erhalten Sie einen niedrigen Pegel am Rx-Pin und umgekehrt!

Ich habe nur die Wellenform von fe fe 68und die Wellenform von überprüft 00 00 09. Unter der Annahme einiger Zeitparameter (Zeit zwischen zwei Bytes) ist eine der beiden Wellenformen genau die Umkehrung der anderen Wellenform.

Wenn also der Tx-Pin beim Senden hoch ist, fe fe 68ist er beim Senden niedrig 00 00 09, und wenn er für die erste Sequenz niedrig ist, ist er für die zweite Sequenz hoch.

Das ist also der Grund, warum Sie nicht das erhalten, was Sie erwarten: Der MOSFET fungiert als NICHT-Gatter.

Hinweis: Ich gehe davon aus, dass Ihr Ziel bei der Open-Drain-Suche darin besteht, schließlich eine Vielzahl von Arduino-Senderknoten mit einem einzigen Empfänger zu verbinden.

Die übliche serielle Klasse des Arduino verwendet den Hardware-UART und ist im Leerlauf hoch (und ist natürlich ein Push-Pull-Ausgang). Der Chipdesigner erwartet, dass Sie einen invertierenden RS232-Treiber und einen invertierenden RS232-Empfänger verwenden.

Wenn Sie also ein „oder“ erstellen möchten, das zwei Sender und einen Empfänger zulässt, können Sie entweder zweimal mit einem Paar PNP-BJTs oder p-Kanal-MOSFETs am Sender (mit einem Pulldown-Widerstand) und einem Inverter am Empfänger invertieren , oder Sie können Dioden wie die unten gezeigte mit einem Pull-up-Widerstand verwenden:

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Denken Sie daran, dass RS232-Treiber und -Empfänger mit Pegeln, Impedanzen und Schutz für einen robusten Betrieb mit langen Kabeln entwickelt wurden, und wenn Sie so etwas mit CMOS-Eingängen/Ausgängen versuchen, werden Sie sich allen möglichen Problemen öffnen.


Die bevorzugte Lösung in diesem Fall wäre meiner Meinung nach die Verwendung von RS485-Treibern und -Empfängern mit einem ordnungsgemäß terminierten Twisted Pair (plus gemeinsamer Masse) und die Aktivierung nur des aktiven Senders. Sie würden einen zusätzlichen GPIO verwenden, um den aktiven Sender zu aktivieren.

Geben Sie hier die Bildbeschreibung ein


Wie auch immer, das wäre der Weg, es zu tun, wie Sie dachten:

schematisch

Simulieren Sie diese Schaltung


Schließlich können Sie möglicherweise die SoftwareSerial-Klasse ändern, um das DDR-Bit anstelle des Ausgangs zu verändern und Open Drain direkt mit dem AtMega-Ausgang zu simulieren (wobei nur ein Widerstand und keine Transistoren erforderlich sind), dies ist jedoch mehr Arbeit und hat andere Nachteile (z Mangel an Geschwindigkeit) über die Verwendung der bereitgestellten Hardware auf dem Chip.