Eisenbahn_Header_5Eisenbahnbrett - Neues LayoutEisenbahnbrettBR24

 

ACK-Impuls für Cytron Motorshield

Auf der Suche nach etwas kräftigeren Treibern für die BaseStation von DCC++ bin ich auf das Motor Shield der Firma Cytron gestoßen.

Cytron Motor Shield MDD-10

Das Gerät hat zwei Endstufen die jeweils 10 A stemmen, die Verdrahtung der Arduino Anschlüsse wird mit Steckbrücken erledigt und die Endstufen sind mit Sense Widerständen ausgestattet. Darüber hinaus wird im Auslieferungszustand des Shield bereits eine über einen StepDown Wandler erzeugte Spannung von 5 V an den Arduino geliefert, man muss nicht daran denken, irgendwelche Steckbrücken oder Leiterbahnen aufzutrennen. Bliebe noch zu erwähnen, dass die Leiterplatte sehr sauber hergestellt wurde, qualitativ hochwertig. Eigentlich ein rundum sorglos Paket, könnte man meinen.

Leider sind die Sense Widerstände nur für die interne Schutzschaltung vorgesehen, es erfolgt keine Auskopplung in Richtung der Arduino Analogeingänge. Zudem sind die Widerstände mit 2 mΩ ausgesprochen klein, am original Aduino Motorshield arbeiten wir mit 150 mΩ. Zusätzlich ist der Spannung über den Widerständen eine ordentlich störende Hochfrequenz überlagert. Aber da für eine Auskopplung der Strommessung ohnehin ein Verstärker vorgesehen werden muss, kann der OpAmp auch gleich als Tiefpass ausgelegt werden.

Überschlägig komme ich für die Erkennung des ACK Impulses (nach DCC Norm 60 mA für 6 ms) auf eine notwendige Verstärkung von 10000, wenn ich ein ähnliches Potential wie beim original Arduino Motor Shield erreichen will. Das ist zweistufig machbar, aber einstufig wäre besser, weil einfacher. Man wird sehen.

Die Konfiguration des Shield über die Steckbrücken klappt einwandfrei, eine saubere Lösung, gefällt mir sehr gut. Jetzt muss also die Rückmeldung angegangen werden…


Ich habe eine kleine Platine entworfen, die auf die vorhandenen Steckbrücken aufgesteckt werden kann, verbunden ist nur 5V, GND und die beiden Analogeingänge A0 und A1 des Arduino. Zwei Leitungen von den heißen Enden der Sense Widerstände zu den Eingängen der Schaltung müssen an den vorgesehenen Stellen angelötet werden.

Als OpAmp kommt ein LM358 im DIP Gehäuse zum Einsatz, alle passiven Bauteile sind SMD Teile auf der Oberseite, die Stecker zum Cytron Motorshield bzw. letztlich zum  Arduino werden von unten eingelötet. Die beiden Stufen des LM358 sind ohne Änderung erst einmal zweistufig verschaltet, können aber über eine vorgesehene Trennstelle als jeweils einzelne Stufen für Kanal A und Kanal B verwendet werden. Hier das Schaltbild und das Layout:

ACK-Impuls_Tiefpass für Cytron             (Click auf das Bild für volle Auflösung)

ACK-Impuls_Tiefpass für Cytron

In natura stellt sich das Board so zur Schau:

ACK-Impuls_Tiefpass für Cytron

Im Bild sind bereits die Kondensatoren C1 und C3 entfernt, beide Verstärkerstufen sind dadurch nur noch Tiefpässe 1. Ordnung. Weiterhin sind die Stufen getrennt, die Schaltung werkelt als zwei einstufige Verstärker mit jeweils vorgeschaltetem Tiefpass.

Die Sense Widerstände werden mit Drähten kontaktiert.

Cytron MotorShield - ACK Impuls

Die fertige BaseStation:

BaseStation mit Cytron Shield und ACK-Impuls Auskopplung


Der direkt am Sensewiderstand abgenommene ACK Impuls ist erkennbar, verschwindet aber mit nur knapp 100 mVss komplett im Rauschen.

Cytron SHIELD MDD10 - ACK-Impuls

Der einstufige Tiefpass/Verstärker mit  einer Verstärkung von ca. 300 lässt das schon besser aussehen und die Rückmeldungen vom Decoder werden einwandfrei erkannt.

Cytron SHIELD MDD10 - ACK-Impuls nach OpAmp

Nach dem Verstärker hat der Impuls eine Höhe von ca. 500 mVss.


Der auf dem Shield verwendete H-Brücken Controller DRV8701E von Texas Instruments hat einen Ausgang SO, der das Signal seines Sense-Eingangs um Faktor 20 verstärkt ausgibt. Cytron hat diesen Ausgang nicht verwendet und die testweise Adaption des Pins mittels Kupferlackdraht war mit Hobbymitteln nicht einfach aber machbar.

Hier zwei Aufnahmen mit einem Mikroskop nach der Operation. Der Chip misst 4 x 4 mm.

H-Brücken Controller DRV8701E auf Cytron Shield

DRV8701E - Pin 11 adaptiert

Der Test ergab, dass die Verwendung dieses SO Signals keine Verbesserung gegenüber der direkten Messung am Sense Widerstand bringt, diese Operation kann man sich also sparen.


Nachdem klar war, dass der Verstärker einstufig realisiert werden kann, habe ich das Schaltbild und das Board noch ein bisschen aufgeräumt und eine weitere Version erstellt.

ACK-Impuls Tiefpass für Cytron Shield             (Click auf das Bild für volle Auflösung)

ACK-Impuls_Tiefpass_Cytron_brd_resize

Auch hier die realisierte Schaltung...

Cytron ACK-Impuls Verstärker mit Tiefpass

... und auf dem Shield montiert

Cytron ACK-Impuls Verstärker mit Tiefpass


Um das so erweiterte Motor Shield mit DCC++ verwenden zu können, müssen die Angaben zu den verwendeten Anschlüssen am Arduino in der Datei “DCCpp_Uno.h” eingepflegt werden.

Die Information, dass ein Cytron Motor Shield verwendet wird, wird konform zu den ursprünglichen Angaben in der Datei “config.h” eingebaut.

Die vorhandene Liste mit unterstützten Boards wird um einen Eintrag für das Cytron Shield erweitert:

    ///////////////// ///////////////// ///////////////// ///////////////// /////////////////
    // DEFINE MOTOR_SHIELD_TYPE ACCORDING TO THE FOLLOWING TABLE:
    //
    //  0 = ARDUINO MOTOR SHIELD                  (MAX 18V/2A PER CHANNEL)
    //  1 = POLOLU MC33926 MOTOR SHIELD           (MAX 28V/3A PER CHANNEL)
    //  2 = FunduMoto MOTOR SHIELD                (MAX 18V/2A PER CHANNEL)
    //  3 = FunduMoto MOTOR SHIELD an Nano V3.0   (MAX 18V/2A PER CHANNEL)
    //  4 = Cytron MOTOR SHIELD an Mega2560       (MAX 30V/10A PER CHANNEL)
    #define MOTOR_SHIELD_TYPE   4

In der Datei “DCCpp_Uno.h” erfolgt dann die passende Zuordnung der Pins zu den Signalen:

    #if MOTOR_SHIELD_TYPE == 0
      #define MOTOR_SHIELD_NAME "ARDUINO MOTOR SHIELD"

    ... MOTOR_SHIELD_TYPE 1..3 hier der Übersichtlichkeit halber weggelassen ...

    #elif MOTOR_SHIELD_TYPE == 4
     
    #define MOTOR_SHIELD_NAME "Cytron MOTOR SHIELD an Mega2560"
     
    // PWM Signals
     
    #define SIGNAL_ENABLE_PIN_MAIN 10        // 10 // mit Jumper PWM2 selektieren
     
    #define SIGNAL_ENABLE_PIN_PROG 3         //  3 // mit Jumper PWM1 selektieren
     
    #define DIRECTION_MOTOR_CHANNEL_PIN_A 12 // 12 // mit Jumper DIR2 selektieren
     
    #define DIRECTION_MOTOR_CHANNEL_PIN_B  2 //  2 // mit Jumper DIR1 selektieren
      // analog Signals
     
    #define CURRENT_MONITOR_PIN_MAIN A0      // A0
     
    #define CURRENT_MONITOR_PIN_PROG A1      // A1
    #else
      #error CANNOT COMPILE - PLEASE SELECT A PROPER MOTOR SHIELD TYPE
    #endif


Hinweis
Um den auf dem Layout verbrauchten Strom zu messen, muss die hier beschriebene Erweiterung softwaremäßig kalibriert werden. Ursprüngliches Ziel ist hier nur, die ACK Impulse der Lokdecoder zu erkennen.


Aktualisierung
DCC++ wird seit Jahren nicht mehr weiter entwickelt, Gregg hat sich zurück gezogen.
In Anbetracht der genialen Idee hat sich stattdessen ein Team von Freiwilligen der Sache angenommen und DCC++ in DCC-EX überführt und weiter entwickelt.

Was liegt also näher, als einen Test des Cytron Shield mit DCC-EX durchzuführen?
Richtig - Nichts :)

Am Einfachsten lädt man sich dazu von Github ”EX-CommandStation-installer.exe” herunter, der erledigt soweit alles, inklusive Erzeugung der notwendigen Datei config.h aus dem mitgelieferten Template config.example.h. Am besten mal das ReadMe dazu auf Github durchlesen.

Kurz und knackig hier die wesentlichen Maßnahmen, um das Cytron Shield in DCC-EX einzubinden.

In der Datei config.h wird ab Zeile 40 die Definition für das Cytron Shield eingebaut und in Zeile 63 dann referenziert (gelb hervorgehobene Zeilen):

    ///////////////// ///////////////// ///////////////// ///////////////// /////////////////
    // If you want to add your own motor driver definition(s), add them here
    //   For example MY_SHIELD with display name "MINE":
    //   (remove comment start and end marker if you want to edit and use that)
    /*
    #define MY_SHIELD F("MINE"), \
     new MotorDriver( 3, 12, UNUSED_PIN, 9, A0, 5.08, 3000, A4), \
     new MotorDriver(11, 13, UNUSED_PIN, 8, A1, 5.08, 1500, A5)
    */
    #define CYTRON_SHIELD F("CYTRON"), \
    new MotorDriver(10, 12, UNUSED_PIN, UNUSED_PIN, A0, 5.08, 3000, UNUSED_PIN), \
    new MotorDriver( 3,  2, UNUSED_PIN, UNUSED_PIN, A1, 5.08, 1500, UNUSED_PIN)


    ///////////////// ///////////////// ///////////////// ///////////////// /////////////////
    //  NOTE: Before connecting these boards and selecting one in this software
    //        check the quick install guides!!! Some of these boards require a voltage
    //        generating resistor on the current sense pin of the device. Failure to select
    //        the correct resistor could damage the sense pin on your Arduino or destroy
    //        the device.
    //
    // DEFINE MOTOR_SHIELD_TYPE BELOW. THESE ARE EXAMPLES. FULL LIST IN MotorDrivers.h
    //
    //  STANDARD_MOTOR_SHIELD : Arduino Motor shield Rev3 based on the L298 with 18V 2A per channel
    //  POLOLU_MOTOR_SHIELD   : Pololu MC33926 Motor Driver (not recommended for prog track)
    //  FUNDUMOTO_SHIELD      : Fundumoto Shield, no current sensing (not recommended, no shortprotection)
    //  FIREBOX_MK1           : The Firebox MK1                   
    //  FIREBOX_MK1S          : The Firebox MK1S
    //  IBT_2_WITH_ARDUINO    : Arduino Motor Shield for PROG and IBT-2 for MAIN
    //  EX8874_SHIELD         : DCC-EX TI DRV8874 based motor shield
    //   |
    //   +-----------------------v
    //
    #define MOTOR_SHIELD_TYPE CYTRON_SHIELD
     

Das war’s schon :)

Anschließend CommandStation-EX.ino compilieren und auf den Arduino laden - sollte sofort funktionieren.

Bitte beachten, dass die Anzeige des auf dem Layout verbrauchten Stroms nicht korrekt ist, dazu müsste die Berechnung kalibriert werden. DCC-EX hat die dafür notwendigen Routinen bereits implementiert, in der Instantiierung für das Shield ist der Parameter senseFactor vorhanden, siehe dazu die folgende Beschreibung der Parameter:

    // The MotorDriver definition is:
    //
    // MotorDriver(byte power_pin, byte signal_pin, byte signal_pin2, int8_t brake_pin, byte current_pin, float senseFactor, unsigned int tripMilliamps, byte faultPin);
    //
    // power_pin:     Turns the board on/off. Often called ENABLE or PWM on the shield
    // signal_pin:    Where the DCC signal goes in. Often called DIR on the shield
    // signal_pin2:   Inverse of signal_pin. A few shields need this as well, can be replace by hardware inverter
    // brake_pin:     When tuned on, brake is set - output shortened (*)
    // current_pin:   Current sense voltage pin from shield to ADC
    // senseFactor:   Relation between volts on current_pin and actual output current
    // tripMilliamps: Short circuit trip limit in milliampere, max 32767 (32.767A)
    // faultPin:      Some shields have a pin to to report a fault condition to the uCPU. High when fault occurs
     

Es existieren (bisher) keine zutreffenden Werte für das mit meiner Erweiterung versehene Cytron Motorshield. In meinem Beispiel habe ich den Standardfaktor für das Arduino Motorshield einfach übernommen.

Die beiden Werte tripMilliamps für das Auslösen der Überstromsicherung sind ebenfalls die Defaults. Hier kann man mit dem Cytron Shield deutlich höher gehen, das Cytron Shield liefert ja den 5-fachen Strom eines Arduino MotorShield. Die Einstellung der Auslösewerte ist natürlich erst sinnvoll, wenn die Kalibrierung erfolgt ist.

 


Beim Aufruf dieser Funktion werden Daten an Google in USA übermittelt. Neben Ihrer IP-Adresse wird auch die URL der besuchten Seite übertragen.
Besucherzaehler

Besucher seit
25.11.2000