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