SX-Schrittmotor-Decoder

Einen Positionierantrieb über den SX-Bus zu steuern, ist eigentlich keine  besondere
Aufgabe. Insbesondere wenn man einen Schrittmotor als Antrieb verwendet und die
Positionswerte im EEPROM des Decoders hinterlegt sind, die per SX-Bus abgerufen
werden. Trotzdem ist es ein etwas umfangreicheres Softwareprojekt geworden, das
ich hier vorstellen möchte.

Die naheliegende Anwendung ist eine Drehscheibe oder Schiebebühne, aber auch
Krananlagen oder eine Zugvitrine könnten damit bedient werden. Selbst die Modell-
seilbahn oder Kirmes-Kram könnte einen Positionierantrieb brauchen (können).

Das Decoderprogramm wird sich kaum ändern, aber die Grafik im Bedien- und
Programmier-Programm auf dem PC. Wie der Antrieb bzw. das Getriebe zwischen
dem Schrittmotor und dem eigentlichen Objekt gestaltet wird, das ist eine ganz andere
Baustelle. Zahnriemen, Schecken oder Stirnradgetriebe, Zahnstangen oder Seilzug,
viele Möglichkeiten, die letztlich aber immer ein Übersetzungsverhältnis und einen
Wertebereich haben.

Standardschrittmotore haben 200 Schritte pro Umdrehung, d.h. in einem Byte können
die Positionswerte innerhalb 1 1/4 Umdrehungen dargestellt werden. Mit 2 Byte kommt
man einer praktischen Anwendung schon wesentlich näher mit bis zu 65535 Schritten.

Schrittmotore haben eine Start-Stop Frequenz mit vielfältigen Abhängigkeiten. Ganz
entscheidend ist dabei das Massenträgheitsmoment der Last. Aber schon im Leerlauf
sind wenige Hundert Hz die Grenze für sicheren Anlauf und Stop ohne Schrittverlust.

Größere Drehzahlen erreicht man nur mit definierten Beschleunigungs- Bremsrampen.
Intelligente Schrittmotorsteuerungen bieten nicht nur den rampengesteuerten Positions-
Betrieb, sondern auch den Mikroschrittbetrieb, geregelten Motorstrom usw.
Leider haben diese Geräte einen entsprechenden Preis.
Relativ günstig sind jedoch die "nackten" Schrittmotorendstufen bei Motorströmen bis 2 A
und maximal 40 Volt Betriebsspannung. Entsprechende integrierte Schaltungen sind
seit Jahren auch für den "Bastler" verfügbar.
Für meine Tests habe ich die SMC11 von Nanotec verwendet (ca. 30€).
Diese Endstufen haben  immer 3 Steuersignale:
1.    Takt
2.    Enable
3.    Drehrichtung
Manche bieten noch die Möglichkeit der Stromabsenkung im Stllstand. Gute Steuerungen
beinhalten die Motorstromregelung, die dafür sorgt, dass vom Stillstand bis zur Grenzdrehzahl
der Motorstrom den eingestellten Wert hat.

Decodersoftware:

Dieses Programm ist mit der IDE des ICC7AVR-Compilers getippt. Es passt gerade noch
in den ATMega8. ( 82 % belegt)
In "C" fällt das Arbeiten mit Arrays und vielen Variablen leichter als in ASM und ist weniger
fehlerträchtig.

Das Kernstück ist die Interruptserviceroutine für den SX-Takt mit den Funktionen Lesen,
Schreiben und Synchrontest.

Im Hauptprogramm wird entweder in den Normalbetrieb oder zur Programmierfunktion verzweigt.
Im Normalbetrieb wird lediglich die Basisadresse des Decoders gelesen. Bit 7 ist das "Do-It" Bit,
d.h. wenn diese Bit log Hi ist, werden die unteren 7 Bit als Positionsnummer interpretiert.
Alle unteren Bit == Lo entspricht Positionsnummer 0 und leitet den Referenzlauf ein.

Der Referenzlauf

beginnt mit Rückwärtslauf des Motors. Die eigentliche Drehrichtung bestimmt die Polarität der
Motorwicklungen. Vertauschen der Anschlüsse einer Wicklung wechselt die Drehrichtung.
Der Motor dreht bis an PORTC PC5 Lo-Pegel erkannt wird. Die Drehrichtung wird gewechselt.
Die Lo-Hi Flanke an PC 5 ist die Referenzposition, d.h. der Istwert des Schrittzählers wird auf
die Mitte des Zählbereiches = 32768 gesetzt und als erster Zielwert die Position mit Indexnummer 1
angefahren. Das Befehlsbit, Bit 7 in der Basisadresse wird danach gelöscht.

Der Normalbetrieb

ist das Fahren auf die Positionsnummer, die binärcodiert in Bit 0 bis Bit 6 der Basisadresse
steht. Das Fahrkommando ist wiederum Bit 7.
Die derzeitige Version kennt 95 Positionen die sich aus einer 7,5° Spur N-Drehscheibe
ergeben haben, weil ich für jeden der 48 möglichen Gleisanschlüsse 2 Positionen vorgesehen
habe. Im Idealfall unterscheiden sie sich um die Schrittzahl für 180° die für das Wenden
benötigt werden. So ist es möglich, Mittenfehler der Drehbühnenlagerung zu kompensieren.

Beschleunigen und Bremsen

geschieht mit einer Rampenfunktion. Die Länge der Rampe wird im Modul "sm_fahr" aus der
vorberechneten Distanz ermittelt. Die Maximale Länge habe ich mit 100 Schritten festgelegt,
d.h. bei Distanz 200 Schritte ergibt sich ein quasi Dreiecksbetrieb mit 100 Schritten beschleunigen
und 100 Schritten verzögern. Bei größeren Distanzen fährt der Motor zwischen den Rampen
mit der vorgewählten Drehzahl die sich aus der Maximalfrequenz und der Schrittanzahl pro
Umdrehung ergibt.
Bei geringeren Distanzen als 200 Schritte werden die Rampen auf Distanz / 2 reduziert.

Die Impulszeiten in der Rampe sind im Array "timtab[110]" hinterlegt. Der Index in dieses Array
ist der Rampenzähler.
Nach Reset des Mega8 wird dieses Array in der Funktion "timtab_init" mit Zahlenwerten gefüllt,
die direkt als TimerCounter Wert verwendet werden. Dies geschieht im Overflow-Interrupt für
Timer1.
In "timer1_ofv_isr" ist die Nachlaufsteuerung für die Positionsfahrt realisiert. Die vorberechneten
Werte sind " besch_pos, brems_pos und ziel_pos " aus dem Modul "sm_fahr".
Die Variablen "mot_pos und besch_cnt" sind die eigenen Arbeitswerte der Routine.

Gesteuert wird das Fahrmodul über das Flag "fahren"


Der Programmiermode

enthält die Funktionen für:

1.        Auf Position Fahren
2.        Neue Basisadresse setzen
3.        Positionswert auf Indexnummer speichern
4.        Maximalfrequenz abspeichern
5.        Basisparameter auf SX-Bus schreiben
6.        Positionswert einer Indexnummer auf den SX-Bus schreiben

Verwendet werden die SX-Adressen K000, K001, K002, K003, K104 und K105 für den
Kommando- und Parameterdialog zwischen Decoder und PC-Programmiersoftware.
Eingeleitet wird der Programmiermode mit einer Taste im Decoder. Die Kennung,
Programmieren Ein, ist Bit 5 im Zustandskanal K106 der Zentrale.


PC-Software

DS_Progra habe ich in MS VisualStudio2005 geschrieben. Ein C# Programm das MS .NET2
erfordert.

Nach Programmstart, "Verbinden", "Positionswerte" und "Nr. und Wert anfahren", hat der Decoder
seine Basisdaten und die aktuellen Einstellungen an DS_Progra gesendet.









    Letzte angefahrene Position = 05



    Drehscheibengrafik ohne Gleise











    aktuelle Maximalfrequenz 1 KHz







Die Drehscheibenbühne ist symbolisch dargestellt, der orangefarbene Balken ist das "Rückwarts-Ende".
Die gelben Punkte repräsentieren die 47 möglichen Gleisanschlüsse, die Referenzposition kann
nicht verwendet werden.
Die Liste der Positionen hat 47 Vorwärts- und Rückwärtswerte und ist mit Abstand 400 Schritte vorbesetzt.
Der Wertebereich ist  400 bis 18800 Schritte.

Gleise malen

Mit Click auf diesen Button trägt DS_Progra für alle Positionen einen Gleisanschluss in die Grafik ein.
Zum Konfigurieren der Drehscheibe habe ich den Wert 20000 vorgesehen. Eine Positionsnummer, die
sowohl im Vorwärts- als auch im Rückwärtsabschnitt den Wert 20000 enthält, bekommt keinen
Gleisanschluss.




    Werte vom Decoder Lesen -- Speichern

    Editfeld  Positionswert  --  Fahrbutton

    Position 24 gegenüber 00 ohne Gleis







    Position 40 ohne Gleis
    Position 3 und 4 ohne Gleis
    Referenzposition ohne Gleis

    Info-Feld

    Gleisanschlüsse aktualisieren


    Maximalfrequenz wählen -- senden

    Basisadresse wählen -- senden


    Info Felder


Die Grafik wird mit Click "Gleise malen" gelöscht und aktualisiert.

Mit Click in  die Listbox der Positionswerte wird selektiert und der Wert in das grüne Editfeld übernommen.
Nach Click auf den Speicherbutton übernimmt der Decoder den aktuellen Wert nach Bestätigung.
Die Indexnummer wir in K001 übertragen der Wert in K104 (Lo) und K105 (Hi). Der neue Wert ist
sofort im EEPROM gespeichert.

Gegenüberliegende Gleisanschlüsse müssen inverse Polarität haben damit kein Kurzschluss auftritt. Ohne
diese Einschränkung müsste die Bühnenpolarität manuell der gewünschten Fahrtrichtung angepasst werden.
In der Grafik verläuft die Wendelinie von 6 Uhr nach 12 Uhr und hat keine Gleisanschlüsse.


Fahrkommando

Hiefür gibt es zwei Möglichkeiten:
1.    Click in die Positionsliste, Click Nr. und Wert anfahren
2.    Click in die Grafik mit oder ohne "Rückwärtswahl"

Motor und Grafik verhalten sich ähnlich bezüglich der Stellgeschwindigkeit. Synchron ist das nicht !!
Eine wesentliche Einschränkung habe ich meinem Drehscheibenprogramm gegeben. Die Bühne kann
nicht mit dem Vorwärtsende " über" die Referenzposition fahren. Der Grund ist meine Absicht, die Bühne
nicht mit Schleifringen zu versorgen, sondern mit Litzen in der Hohlwelle, die sich aber nicht verdrillen
sollten !
Bei einer Schiebebühne ist das selbstverständlich, da dreht sich nichts!
Der Decoder "merkt" sich die angefahrene Position, so dass Referieren nach Neustart nicht notwendig
ist, wenn die letzte Position auf einem Vollschritt lag. Mikroschritte werden "verloren".


Adresse und Maximalfrequenz

Beide Parameter werden nach Bestätigung in den Decoder übernommen und werden im EEPROM
gespeichert. Die Änderung ist sofort wirksam.

Hardwarehinweis

Eine Platine habe ich noch nicht gebaut, sondern die Tests auf dem STK500 gesteckt. Die nanotec
Endstufe SMC11 MUSS einen Stützelko von mindestens 2200 uF an der Motorspannung haben,
sonst entwickelt der Motor heftiges Eigenleben und die Mimik ist störempfindlich. Verdrillte Motor-
leitungen schaden auch nicht. Ansonsten ist der Betrieb problemlos. Im nanotec Vertrieb ist eine
"nackte" Endstufe mit ähnlichen Daten. Auf dieser Basis werde ich gelegentlich ein Decoder
"mit allem" bauen.

Software

Die Decodersoftware für den Mega8 zum "Brennen", lesen und oder portieren:

DS_CTRL.hex    DS_CTRL.eep    dsmotor.c    sm_func.c

Das C#  Hauptprogramm aus dem VS2005 Projekt:   Form1.cs

Projektdateien und DS_Progra zum installieren maile ich auf Anfrage.

Winfried Steinhart, Februar 2009