Bei mehr als zwei Teilnehmern kommt man mit dem MAX488-Baustein nicht mehr aus. Hier würden mehrere Ausgänge auf die gemeinsame Leitung einwirken und dadurch gestörte Pegel entstehen: Der eine Ausgang zieht nach "H", der andere auf "L". Aus diesem Grund muss der Baustein MAX485CPA eingesetzt werden, der seinen Sendeteil in einen hochohmigen Zustand schalten kann. Bei diesem Baustein schaltet nur das Modul seinen Ausgang aktiv, das aktuell senden will. Alle anderen Module müssen ihr Sendeteil in hochohmigem Zustand halten. Das hört sich ganz einfach an, bedeutet aber, das man am Arduino außer dem Rxd- und TxD-Pin noch einen weiteren Steuer-Pin für das Umschalten der Sendestufe spendieren muss. Dieser Pin muss bei der Kommunikation auch noch programmiert werden. Die meisten Schaltungen, welche man im Internet findet, arbeiten auf diese Weise.

Wenn man den Steuer-Pin abhängig vom Ausgangssignal umschalten könnte, würde man sich am Arduino einen Port sparen. Mein erster Gedanke war ein retriggerbares Monoflop oder RC-Glied, das durch die Sende-Bits getriggert wird. Dummerweise ist die Schaltung aufwändig und das Umschalten in den hochohmigen Zustand zeitlich nicht präzise machbar.

Man kann aber die sehr schnellen MAX485-Bausteine mit einem einfachen Schaltungstrick überlisten und über einen Inverter den Steuer-Pin bedienen.

 

Die MAX485-Basisschaltung

MAX585-Bus Basisschaltung

Der Pin RO des MAX485 ist der Receiver-Output (Pin 1), der mit dem RXD-Eingang des Arduino verbunden wird. Der Sendeausgang TxD des Arduino ist mit dem DI (Driver-Input, Pin 4) des MAX485 verbunden. Für das Empfangen von Busdaten muss der Steuereingang RE (Receiver Enable, Pin2) auf Low liegen, während DE (Driver Enable, Pin 3) auf High liegen muss, damit Daten gesendet werden können. RE und DE müssen also immer auf diesen Logikpegeln liegen:

  • DE=L, RE=L bedeutet Senden auf den Bus
  • DE=H, RE=H bedeutet Empfangen vom Bus

Der Ruhepegel des Arduino am TxD-Pin ist High, bei der Datenübertragung wird der Pegel dem Bitmuster entsprechend zwischen H und L umgeschaltet. Verwendet man das TxD-Signal zur Steuerung der Enable-Eingänge, dann muss man das Signal nur invertieren. Dafür einen eigenen Logikbaustein 74HCT04 einzusetzen, ist zu aufwändig. Statt dessen findet ein Kleinleistungs-MOSFET (N-Kanal) T1 Einsatz. Ein H am Gate steuert den MOSFET durch und die durch den Pullup-Widerstand R1 auf 5V gelegte Spannung wird gegen Ground gezogen. Ist das Gate auf L, dann sperrt der MOSFET und die  Enable-Spannung ist 5V. Der Gate-Vorwiderstand R2 begrenzt den Entladestrom der Gatekapazität auf ungefährliche Werte. Der Pullup-Widerstand R1 ist mit 2,2kOhm relativ klein, d.h. es fließen etwa 5mA. Die Werte beider Widerstände wurden experimentell entwickelt und sind für ein sauberes Rechtecksignal bei 115kBaud optimiert. Das Vergrößern der Widerstände bringt stark verrundete Flanken und damit die Gefahr, dass die Empfänger am Bus das Signal nicht sauber lesen können. Das Umschalten der Enable-Eingänge per Sendesignal ist zwar nicht im Sinne der Hersteller, funktioniert aber einwandfrei.

 

Der Schaltungsaufbau

Die Schaltung wurde mit vier Teilnehmermodulen auf einem Breadboard aufgebaut und getestet:

RS485-Bus für vier Teilnehmer

Jedes der Module wird von seinem eigenen Arduino mit Spannung versorgt.

RS485-Bus für vier Teilnehmer (Details)

Auf dem Breadboard wurde ein Aufbau gewählt, wie er sich später auf der Platine realisieren lässt. Das gewährleistet ein identisches Signalverhalten für Test und Produktion.

 

Das Signalverhalten

Die Schaltung wurde auf dem Breadboard aufgebaut und mit einem digitalen Speicheroszilloskop gemessen. In den folgenden Screenshots wurde jeweils der Buchstabe "u" von einem Arduino gesendet.

MAX485 Signalverlauf 1

CH1 (blau) ist der Eingang DI des MAX485, in CH2 (gelb) ist der Zustand der Enable-Eingänge RE/DE zu sehen. Die Signalflanken des vom FET erzeugten invertierten Signals sind steilflankig und haben kaum Verzögerung.

 

MAX485 Signalverlauf 2

CH1 (blau) ist der Eingang DI des MAX485, CH2 (gelb) ist der Busausgang "A". Der Signalhub an "A" beträgt etwa 1V, für eine sichere Funktion sind mindestens 200mV erforderlich. A ist der nicht invertierende Ausgang.

 

MAX485 Signalverlauf 3

Wie zuvor, aber mit gedehnter Zeitachse. Die Verzögerung von A zu DI beträgt etwa 400nsec.

 

MAX485 Signalverlauf 4

CH1 (blau) ist der Busausgang "B", CH2 (gelb) der Ausgang "A". Der Hub an "A" nd "B" ist jeweils etwa 1V, lediglich die Y-Skalierung am DSO ist unterschiedlich eingestellt.

 

MAX485 Signalverlauf 6

Wie zuvor, aber es wurde am DSO noch die Kurve CH1-CH2 zugeschaltet, welche die Funktionsweise auf dem Bus mit seinen differentiellen Treibern verdeutlicht. Am Differenzsignal ist ein Hub von 2V erkennbar.

 

Einsatzgebiete

Die gezeigte Schaltung kann sowohl an einem Arduino als auch an einem FTDI-USB-Koppler zum PC eingesetzt werden und eignet sich universell zur Datenkommunikation. In der Schaltung sind die beiden Abschlusswiderstände (je 120Ohm) und die BIAS-Widerstände (je 680Ohm) nicht eingezeichnet. Die komplette Schaltung ist im nächsten Artikel zu finden.