Source file: /~heha/mb-iwp/Antriebe/Schrittmotorsteuerung/smc.zip/sm.h

/****************************************
 * Strukturen der Motorsteuer-Firmware	*
 * sm1.cpp, sm2.cpp, sm3,cpp		*
 * heha, 140408				*
 ****************************************/

#pragma once

struct EeCtrl{	// Offset = 0: Kopfdaten
 WORD fv;	// Berechnungsschritte pro Sekunde für v (8 kHz)
 char ea;	// Exponent zur Basis 2 für a (64 kHz²)
 char xs;	// Irrelevante Bits für Positionsangabe (hier: Halbschritt)
 BYTE le;	// dies entspricht Load = 0 %
 BYTE lf;	// dies entspricht Load = 100 %
 BYTE bd;	// Baudrate gemäß Baudrate.htm
 BYTE nm;	// Achsen (Low-Nibble) à 48 Byte, Teiler für Bahnsteuerung (High-Nibble)
};

// Diese Struktur ist weitestgehend gleich der "struct Motor"-Struktur weiter unten.
// Um 4 Byte versetzt sowie ohne die PC-Angaben. Gesamtlänge: 48 Bytes
struct EeMotor{	// alle Positions- und Wegangaben in Mikroschritt
 long Ist;	// 04 00 Position zurzeit (wird häufiger geschrieben)
 BYTE flags;	// 08 04 Nichtflüchtige Bits
		//	0 = LEFT  Phasenumkehr der Motorbestromung
		//	1 = REF   Position referenziert
		//	2 = RIGHT Default-Referenzschaltersuche zur Motorferne
		//	3 = MANU  Niemals Referenzfahrt, sondern Null-Setzung
		//	4 = HOLD  Dauer-Bestromung des Motors
		//	5 = ROTA  Umlaufender Antrieb ohne Endlagen
		//      6 = PILG  ¿Pilgern, sonst Spielausgleich
		//	7 = AZ    Zielfahrt nach Null nach Referenzfahrt
 char MaxAccel;	// 09 05 Maximale Beschleunigung (vzl.)
 short MaxSpeed;// 0A 06 Maximal erlaubte Verfahrgeschwindigkeit (vzl.)
 long RefPos;	// 0C 08 Position des Referenzschalters ‡
 long Anfang;	// 10 0C Software-Endschalter links †
 long Ende;	// 14 10 Software-Endschalter rechts †
 short Pilger;	// 18 14 Pilgerschritte oder Spiel, vzb., max. ±127 Halbschritte
 char Jerk;	// 1A 16 (Maximaler) Ruck, 0 = ohne Ruckbegrenzung
 BYTE endsw;	// 1B 17 Endschalter-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)
 BYTE fl2;	// 1C 18 weitere Flags (Verbote)
		//	4 = DEMO  ¿ungenutzt
		//	5 = F2AR  ¿Automatisch Referenzfahrt beim Einschalten
		//	6 = F2RR  ¿Keine Bewegung ohne Referennz
		//	7 = F2RV  ¿Referenzverlust beim Einschalten
 BYTE fl3;	// 1D 19 unbestimmt
 BYTE Current;	// 1E 1A Strom durch Motorwicklung, in 20 mA (SM3+)
 BYTE Curve;	// 1F 1B Kurvenform der Sinusinterpolation (SM3+)
 float PerUnit;	// -- 1C Mikroschritt pro Einheit - nur für PC-Software
 char Unit[8];	// -- 20 Einheitenbezeichner in UTF-8 - nur für PC-Software
		//       (nullterminiert oder nicht terminiert)
 LONGLONG
   FreeForApp;	// -- 28 Handle o.ä. für Anwendungsprogramm
};	// Diese Struktur ist stückweise binärkompatibel mit „class Motor“:
	// <RefPos> ist <Soll>; <ProEinheit> und <Einheit> kommen nicht vor
// † darf Inf sein, wenn Hardware-Endschalter vorhanden, sonst nicht.
//   NaN ist nicht erlaubt.
// ‡ darf sich auch außerhalb von Anfang und Ende befinden.
//   NaN oder Inf ist nicht erlaubt.
#define LNAN 0x80000000	// Not-a-number-Kode, keine oder ungültige Zahl, NaN
#define LINF 0x7FFFFFFF	// Überlauf-Kode, +8

struct Motor {		// Strukturgröße = 32 Bytes
 enum {		// Nur flüchtige Bits: BRAKE,FULL,PHA3, HUNT,REFF,SLOW
  HUNT=1,		// Ist an Soll angleichen („Jagd“-Modus), Zielfahrt
  REFF=2,		// Referenzfahrt (bis zum Referenz-Schalter)
  BRAKE=4,		// Bremsung aktiv (automatisch bei speed=0 gelöscht)
  SLOW=8,		// Langsame Schaltersuche (ggf. dritter Pass)
  FULL=16,		// voller Strom
 };			// die übrigen 3 Bits = Halbschritt-Phase
 BYTE phase;	// 0	0..15; gerade Zahlen: geringer, ungerade: hoher Strom
 char accel;	// 1	0, +MaxAccel oder -MaxAccel, in Mikroschritt/(125µs)²*2^ea
 short speed;	// 2	±MAXSPEED, mehr nicht! In Mikroschritt/125µs
 long Ist;	// 4	In Mikroschritt
 enum {		// Nur feste Bits: LEFT,RIGHT,MANU,HOLD,ROTA,AZ
  LEFT=1,		// Linkslauf (Motor dreht andersherum)
  REF=2,		// Referenzierte Position (Software-Endschalter wirksam)
  RIGHT=4,		// Schaltersuche nach rechts (zum Ende hin)
  MANU=8,		// niemals Referenzfahrt auf Anschlag (Konf.-Bit)
  HOLD=16,		// bestromt (kein Freilauf, aber reduzierter Strom)
  ROTA=32,		// umlaufender Antrieb ohne Endlagen (bspw. Spindel)
  DEMO=64,		// Demo-Modus (fährt zwischen den Endschaltern) — ungenutzt
  AZ=128,		// Auto-Zero = Nach Referenzfahrt zur Null eilen
 };		// „Halbfeste“ Bits hierin sind REF und DEMO.
// Mögliche weitere Bits und Bytes:
// - Referenzierung beim Einschalten verlieren
// - Referenzpunkt beim Lösen des Schalters
// - Pilgerschritt (± Schritte)
 BYTE flags;	// 8	können per serielle Schnittstelle gesetzt werden
 char MaxAccel;	// 9	vzl. Maximalbeschleunigung, max. +MAXACCEL
 short MaxSpeed;// 10	vzl. Maximalgeschwindigkeit für HUNT und REFF
 long Soll;	// 12	Sollposition, zu der hingefahren werden soll bei HUNT
#define RefDir ((char*)&Soll)[3]	// +1 oder -1, Referenzfahrtrichtung
 long Anfang;	// 16	2 Software-Endschalter-Positionen (±8 erlaubt!), …
 long Ende;	// 20	… diese werden nur ausgewertet, wenn REF gesetzt ist
 short Pilger;	// 24
 BYTE Jerk;	// 26
 BYTE endsw;	// 27
 BYTE fl2;	// 28
 BYTE fl3;	// 29
 BYTE pdc;	// 30 PowerDownCounter (zz. ohne EEPROM-Startwert!)
 char OneAccel;	// 31	Einzel-Beschleunigungs-Befehl (wird in CalcSpeed null gesetzt)
		//	auch: Akkumulator für CalcSpeed-Zyklen
};

#pragma pack(1)
struct load_t{	// Antwort auf "#"
 BYTE min;
 BYTE max;
 WORD avg;
};

struct move_t{	// Ist- oder Sollposition, Kommando "A".."F"
 BYTE flags;
 char accel;
 short speed;
 long pos;
};

struct read_t{	// Anfrage RAM/EEPROM/Flash lesen
 BYTE cmd;	// 0xA0 = Lesen
 BYTE len;	// = 4
 WORD a;	// Adresse
 BYTE ah;	// 0x00 = Flash, 0x80 = RAM, 0x81 = EEPROM
 BYTE l;	// Länge in Bytes, max. 255, 0 = nichts
};
struct write_t{	// Header RAM/EEPROM schreiben
 BYTE cmd;	// 0xA1 = Schreiben
 BYTE len;	// = Anzahl Bytes + 3
 WORD a;	// Adresse
 BYTE ah;	// 0x80 = RAM, 0x81 = EEPROM
};		// anschließend die Daten, max. 252 Bytes

struct ram_t{	// 28 Bytes aus Motor-Struktur im RAM
 BYTE flags;	// beginnt (absichtlich) so ähnlich wie move_t
 char MaxAccel;
 short MaxSpeed;
 long Soll;
 long Anfang,Ende;
 short Pilger;
 BYTE Jerk,endsw;
 BYTE fl2,fl3;
 BYTE pdc;	// PowerDownCounter, nicht schreiben!
 char OneAccel;	// nicht schreiben!
};
#pragma pack()
Detected encoding: UTF-80