Programmierung der Schrittmotorsteuerung „SM1“

(PT_PIESA, Teilprojekt A2)
Zusammengekürzt auf Relevanz für OWIS-Schiebetisch

Steuerung

Schnittstellen-Kommandos

Einzelbyte-Kommandos

PC OUTPC INFunktion
0-wird ignoriert, kann zur Synchronisation nach Kommunikationsverlust gesendet werden
'#' ♣'#'Echo-Prüfung (kurzer Anwesenheitstest der Motorsteuerung)
'%'4 ByteMikrocontroller-Auslastung abfragen und Min/Max rücksetzen, Load::
1 Byte Minimum-Load (hier ca. 20 = 0%, aber 0 = 0% kann man getrost annehmen) Min
1 Byte Maximum-Load (0xFF = 100%) Max
2 Byte gleitender Load-Mittelwert (0xFF00 = 100%) Avg
'$' ♣'$'Warten bis alle Achsen stehen oder bis EEPROM-Schreibvorgang beendet
Hierzu ggf. TimeOut der seriellen Schnittstelle temporär erhöhen.
Andere Kommandos beenden diesen Wartemodus vorzeitig ohne '$'-Antwort.
Sollte kein Warten erforderlich sein (kein Motor in Bewegung und kein EEPROM-Schreibvorgang), erfolgt die '$'-Antwort unmittelbar.
'?' ♣"SM1"zur Unterscheidung und Anwesenheitstest für die Anwendungssoftware
'D'8 ByteMotorstruktur abfragen (schnell) (hier: für OWIS-Motor), Motor::
  • 1 Byte Zustand phase
    HUNTBit 0Zielfahrt-ModusDiese Bits bestimmen die firmware-interne State-Machine
    REFFBit 1Referenzfahrt-Modus
    BRAKEBit 2Bremsung aktiv
    SLOWBit 3Langsame Referenzschaltersuche (3. Pass)
    FULLBit 4Motor bestromtDiese Bits reflektieren den Zustand der Motor-Endstufen
    PHABit 7-5Phasenlage
  • 1 Byte vzb. Beschleunigung (max. ±64), in Mikroschritt/125²µs² * 2^ea (zz. ea=-9) accel
  • 2 Byte vzb. Geschwindigkeit (max. ±512) in Mikroschritt/125µs speed
  • 4 Byte vzb. Mikroschritt-Position Ist
256 Mikroschritte sind 1 Halbschritt
'c' ♣-Stopp für alle Achsen (für alle Motoren)
'f' ♣-Nullpunkt setzen
  • Setzt Position zu Null.
  • Setzt Referenzierung (REF-Bit).
  • Bei vorher vorhandener Referenzierung werden auch die Software-Endschalter Anfang und Ende im RAM verschoben.
't' ♣-Referenzierung aufheben (löscht REF-Bit)

♣ Kann man sinnvoll in HyperTerminal oder anderem Terminalprogramm verwenden

Mehrbyte-Kommandos (RAM, flüchtig)

Mehrbyte-Kommandos haben im Kommandobyte Bit 7 gesetzt. Danach folgt die Nutzdaten-Länge in Bytes, danach die Nutzdaten.

PC OUTPC INFunktion
0x83
länge
Daten
-Sollposition setzen und Zielfahrt/Referenzfahrt ausführen Command::
länge = 1..16 (typisch 1 oder 8)
  • 1 Byte Kommando cmd
    Mögliche (sinnvoll erscheinende) Kombinationen
    • 1 = Zielfahrt absolut
    • 5 = Zielfahrt relativ
    • 2 = Referenzfahrt in Normalrichtung (wie im EEPROM festgelegt: zum Motor hin)
    • 6 = Referenzfahrt in Gegenrichtung (vom Motor weg)
    Falls AZ gelöscht, steht nach Abschluss der Referenzfahrt in Soll die Referenzabweichung in Mikroschritt.
    Falls AZ gesetzt, wird anschließend zur Nullposition gefahren.

    Wirksame Bits in cmd:

    HUNTBit 0Zielfahrt starten
    REFFBit 1Referenzfahrt starten
    RIGHTBit 2Schaltersuche umschalten / REL relative Positionsangabe für Zielfahrt
    SLOWBit 3Schleichfahrt (sonst automatisch erst schnell, dann langsam)
  • 1 Byte vzl. Maximalbeschleunigung MaxAccel, 0 = Maximum aus EEPROM, CNAN = vorhergehender Wert
  • 2 Byte vzl. Maximalgeschwindigkeit MaxSpeed, in Mikroschritt/125µs, 0 = Maximum aus EEPROM, INAN = vorhergehender Wert
  • 4 Byte Zielposition Soll, in Mikroschritt◊, oder explizite Referenzfahrtrichtung (negativ ist normal!), LNAN = vorhergehender Wert
    +∞ fährt bis zum positiven Limit
    –∞ fährt bis zum negativen Limit
  • 4 Byte Lage des linksseitigen Software-Endschalters Anfang, in Mikroschritt◊, LNAN = vorhergehender Wert
  • 4 Byte Lage des rechtsseitigen Software-Endschalters Ende, in Mikroschritt◊, LNAN = vorhergehender Wert
0x8B
länge
Daten
-Limits oder Flags setzen
länge = 1..24
  • Erstes Byte flags (wird automatisch im EEPROM gespeichert):
    LEFTBit 0Motor dreht andersherum (bspw. sinnvoll wenn eine Phase vertauscht wurde)
    REFBit 1Motor referenziert, Software-Endschalter wirksam
    RIGHTBit 2Schaltersuche nach rechts (zum Ende hin)
    MANUBit 3Niemals Referenzfahrt; Kommando setzt Referenzposition an aktueller Stelle
    HOLDBit 4Motoren dauerhaft bestromt (mit verringertem Haltestrom)
    ROTABit 5umlaufender Antrieb ohne Software-Endschalter, Software-Endschalter geben Periode vor (von Anfang bis Ende-1)
    DEMOBit 6Demo-Modus (ungenutzt!)
    AZBit 7Nach Referenzfahrt zur Null eilen
    Wenn nicht gesetzt, steht nach der Referenzfahrt in Soll die Abweichung von der letzten Referenzfahrt.
  • weiter wie oben, Folgebytes werden nicht im EEPROM gespeichert
0x93
2
offset
länge
<länge>Motor-Struktur abfragen (komplett) (Strukturlänge 32 Bytes, Quelltext: class Motor)

offset = 0..31
offset+länge ≤ 32
Damit können alle variablen Infos abgefragt werden.
Die Daten liegen hintereinander:
  • wie bei Kommando 'D' (8 Bytes)
  • wie bei Kommando 0x8B (16 Bytes)
  • danach 8 Bytes, die weniger interessant und zumeist funktionslos sind
    • 2 Byte Pilgerschritt (0) Pilger
    • 1 Byte Ruck (0) Jolt
    • 1 Byte Endschalter-Zuordnung endsw
      • Bit 0 = Endschalter motornah vorhanden (1)
      • Bit 1 = Endschalter motorfern vorhanden (1)
      • Bit 2 = Referenzschalter vorhanden (0)
      • Bit 3 = Endschalter motornah/motorfern vertauscht (0)
      • Bit 4 = Endschalter mit invertiertem Signal (0)
    • 2 Byte weitere Flags (0) fl2 fl3
    • 1 Byte PowerDownCounter (0) pdc
    • 1 Byte Einzelbeschleunigungskommando (0) OneAccel
Mittels offset und länge kann ein beliebiger Ausschnitt der 32-Byte-Motordaten gelesen werden, um den Datenverkehr auf der RS232-Schnittstelle zu minimieren.

◊ Die niederwertigen 8 Bits werden von der Firmware auf Null gesetzt.

Die angegebenen Konstanten sind wie folgt festgelegt (NaN = Not-a-Number, keine Zahl):

Mehrbyte-Kommandos (EEPROM, persistent)

Diese Mehrbyte-Kommandos dienen zum Zugriff insbesondere auf den EEPROM, der die persistenten Einstellungsdaten speichert. Damit kann PC-Steuersoftware in gewissen Grenzen plug-and-play-fähig gemacht werden, da diese steuerungsspezifische Daten wie Spindelsteigung aus dem EEPROM entnehmen kann.

PC OUTPC INFunktion
0xA0
4
adrL
adrH
0x81 ♠
länge
länge Nutzdaten EEPROM lesen

adrH:adrL = Adresse (high:low)
0xA1
länge
adrL
adrH
0x81 ♠
Nutzdaten
- EEPROM schreiben
länge = 4..255
adrH:adrL = Adresse (high:low)


länge-3 Bytes Nutzdaten

♠ Dies entspricht der Linkerskript-Vorgabe des AVR-GCC.

EEPROM-Inhalt

Der EEPROM enthält Konfigurationsinformation in der folgenden Form:

8 Byte Header ab EEPROM-Adresse 0:
AdresseNameLängeInhaltBeschreibung
0fv28000Berechnungsschritte pro Sekunde für v (8 kHz)
2ea1-9Exponent zur Basis 2 für a (64 kHz² als Basis)
3xs18Irrelevante Bits für Positionsangabe (hier: Halbschritt)
4le1≈20Ausgabewert für Load = 0 % (siehe Kommando '%')
5lf1255Ausgabewert für Load = 100 % (siehe Kommando '%')
6bd10x19Baudrate gemäß Baudrate.htm
7nm10x466 Motor-Achsen (Low-Nibble) à 48 Byte,
4 (High-Nibble) — für koordinierte Steuerung

Die Angaben fv und ea sind zur Einheitenumrechnung bei Geschwindigkeit und Beschleunigung erforderlich, siehe LabVIEW-Beispiel!
Die Angabe xs dient zum Ausblenden von Bits beim Auslesen und Anzeigen des Istwertes.
Die Angabe nm ist zur Berechnung von EEPROM-Offsets heranzuziehen!

Es folgen:

6 × 48 Byte Motordaten ab EEPROM-Adresse 8 (Quelltext: struct EeMotor):
OffsetNameLängeInhaltBeschreibung
0Ist40Position zurzeit (wird häufiger geschrieben)
4flags10Nichtflüchtige Bits
0 = LEFTPhasenumkehr der Motorbestromung
1 = REFPosition referenziert
2 = RIGHTDefault-Referenzschaltersuche zur Motorferne
3 = MANUNiemals Referenzfahrt, sondern Null-Setzung
4 = HOLDDauer-Bestromung des Motors
5 = ROTAUmlaufender Antrieb ohne Endlagen
6 = PILG¿Pilgern, sonst Spielausgleich
7 = AZZielfahrt nach Null nach Referenzfahrt
5MaxAccel164Maximale Beschleunigung
6MaxSpeed2128Maximal erlaubte Verfahrgeschwindigkeit
8RefPos40Position des Referenzschalters ‡
12Anfang4–∞Software-Endschalter links †
16Ende4+∞Software-Endschalter rechts †
20Pilger20Pilgerschritte oder Spiel, vzb., max. ±127 Halbschritte
22Jolt10(Maximaler) Ruck, 0 = ohne Ruckbegrenzung
23endsw13Endschalter-Zuweisung, Bits:
0 = Endschalter motornah vorhanden
1 = Endschalter motorfern vorhanden
2 = Referenzschalter vorhanden (gleiche Leitung wie „motornah“)
3 = Endschalter-Leitungen motornah/motorfern vertauscht
4 = Endschalter mit invertiertem Signal (Schließer)
24fl210weitere Flags (vorgesehene Verbote)
4 = DEMO¿ungenutzt
5 = F2AR¿Automatisch Referenzfahrt beim Einschalten
6 = F2RR¿Keine Bewegung ohne Referennz
7 = F2RV¿Referenzverlust beim Einschalten
25fl310unbestimmt
26Current1≈50Strom durch Motorwicklung, in 20 mA (einstellbar ab SM3, sonst nur Anzeigegröße)
27Curve10Kurvenform der Sinusinterpolation (mikroschrittfähiges SM3+)
28PerUnit4400L<<8Mikroschritt pro Einheit — nur für PC-Software (C: float, PASCAL: single)
32Unit8"mm"Einheitenbezeichner in UTF-8 — nur für PC-Software (nullterminiert oder nicht terminiert)
40FreeForApp80Handle o.ä. für Anwendungsprogramm

† darf ±∞ sein, wenn Hardware-Endschalter vorhanden, sonst nicht.
NaN ist nicht erlaubt.
‡ darf sich auch außerhalb von Anfang und Ende befinden.
NaN oder ±∞ ist nicht erlaubt.
¿ Nicht implementiert
Eine wichtige Angabe ist PerUnit, welche zur Umrechnung der Mikroschritte in physikalische Einheiten heranzuziehen ist, sowie Unit zur Anzeige der passenden Einheit. Somit ist Position/Unit = Position/µSchritt / PerUnit, somit zum Anzeigen der Die Ausgabezeichenkette ist UTF-8-kodiert und muss ggf. für das Betriebssystem umgewandelt werden. Für Windows typischerweise mittels MultiByteToWideChar().

Tipp: Die Anzahl der anzuzeigenden Nachkommastellen errechnen sich zu:

Anmerkung: Für den OWIS-Schiebetisch liegt die passende Struktur ab EEPROM-Adresse 152 (0x98) = 8 + 3 * 48.

Es folgen:

6 × ?? Bytes Motor-Achsbezeichnung (nullterminierte UTF-8-Strings)
(an vierter Position "OWIS-Lineartisch\0")

In LabVIEW exisitert für die Binär-Interpretation des seriellen Datenstroms eine passende Komponente: Daten serialisieren / deserialisieren.