188 m (616 feet) 1-Wire
Wie lang darf eigentlich das Kabel für einen 1-Wire Bus sein? Die Quellen im Internet machen da verschiedenste Angaben, von Desktop-Range bis einige hundert Meter. Ich probiere es aus: Ein Versuch mit 188 m TP-Kabel.
Das Problem
Das Problem sind fünf verschiedene Effekte:
- Bei nicht optimaler Terminierung der Leitung bekommen wir es bei längeren Kabeln mit Reflexionen am Leitungsende zu tun,
- die Signallaufzeit darf nicht so lang sein, dass verschiedene Devices am Bus die Flanken unterschiedlich auswerten und sich gegenseitig stören,
- durch die Impedanz des Kabels ist die Spannungsversorgung am Slave gegebenenfalls nicht mehr optimal,
- durch die Leitungsinduktivität kann es bei steilen Flanken zu erheblichen Spannungsspitzen und Absacken der Masse kommen und zu guter letzt
- ist der relativ große Pull-Up-Widerstand nicht in der Lage die Leitungskapazität schnell genug zu laden, so dass bestimmte steigende Flanken der Open-Drain-Schaltung zu langsam werden.
Die Lösung
Ich habe gar nicht so viel unternehmen müssen, um einen Temperatursensor an den 188 m Kabel zum Laufen zu bringen. Leitungsreflexionen treten mit TP-Kabel interessanterweise nicht auf, entweder passt die Impedanz des für die Tests verwendeten DS18S20 gut genug (in einem Datenblatt steht tatsächlich etwas von einem 100 Ω FET in der Endstufe) zu den 100 Ω des TP-Kabels, oder der Pull-Up-Widerstand am Leitungsende schluckt hinreichend Signal am Leitungsende. Eine Serienterminierung von 100 Ω funktioniert zwar, hat sich aber soweit nicht als nötig erwiesen.
Timing / Pull up
Kritisch ist definitiv die Größe des Pull-Up-Widerstandes. Er bildet mit der Leitungskapazität einen Tiefpass und macht es dem Bus so bei größeren Leitungskapazitäten unmöglich innerhalb der spezifizierten Recovery-Time von 1 µs den Idle-State (high) zu erreichen.
Overshoot / Undershoot
Durch die steilen Flanken des Masters gibt es natürlich massive Spannungsspitzen auf der Leitung. 1-Wire-Slaves sind für -0.3 V bis 5.3 V (Vcc + 0.3 V) spezifiziert. Wie man in der Messung unten sieht überschreiten die induzierten Spannungsspitzen von 7.3 V deutlich diesen Grenzwert. Selbiges gilt auch für den massenahen Pegel von -1 V.
Ich habe dieses Problem ganz pragmatisch gelöst, in dem ich am Slave je eine clipping Diode gegen Vcc und GND geschaltet habe. Wie man sieht, ist das Problem damit gelöst.
Spannungsversorgung
Um eine ordentliche Spannungsversorgung trotz der hohen Leitungsimpedanz zu gewährleisten habe ich schließlich noch einen 10 µF Tantal-Elko an die Versorgungsspannung geschaltet. Wie man auf dem folgenden Bild sieht, ist das Resultat eine absolut einwandfreie Versorgungsspannung ohne Einbrüche (blaue Kurve):
Ergebnis
Um die Qualität des 1-Wire Busses zu kontrollieren habe ich neben den Messungen mit dem Speicheroszilloskop einen Atmel Mega2560 eingesetzt, den ich so programmiert habe, dass er neben der Auswertung des DS18S20 verschiedene Parameter der Übertragung anzeigt. Von 2809 Temperaturmessungen über die oben vorgestellte Konfiguration waren 2809 erfolgreich, außerdem hat das System erfolgreich 29 Adresssuchen (Anzeige: Scans) auf dem Bus durchgeführt. Der angeschlossene DS18s20 wurde dabei jedes Mal korrekt als solcher erkannt (Das Programm erkennt und unterstützt auch die anderen DS18xxx Typen).