• Keine Ergebnisse gefunden

TMC222-Schrittmotorsteuerung

Inter-IC-Bus-Komponenten

CONFIGURATION REGISTER

9.6 TMC222-Schrittmotorsteuerung

9.6.1 Trinamic TMC222

Bei einem Schrittmotor werden die Spulenwicklungen in einer bestimmten Ab-folge derart angesteuert, dass sich ein Drehfeld ergibt. Dieses wiederum erzeugt die Drehbewegung des Ankers. Die Aufgabe der Spulenansteuerung wird oft von Mikrocontrollern ¨ubernommen und erfordert im Zusammenspiel mit einem Treiber-IC8in der Regel eine Vorgabe der Schrittanzahl und der Drehrichtung.

Die positionsgenaue und gleichf¨ormige Erzeugung einer bestimmten Bewegung kann hierbei einen Mikrocontroller fast v¨ollig auslasten.

Ein Controller, der speziell f¨ur diese Aufgabe entworfen wurde, ist der TMC222 der Firma Trinamic [Trinamic 08]. Der Baustein bietet neben der Motortreiber-Endstufe f¨ur bipolare Schrittmotoren (vier Anschl¨usse) auch einen sog.Motion Controller. Dieser Logikteil koordiniert den Bewegungsab-lauf und damit alle zeitkritischen Aufgaben. Der TMC222 stellt dem steuern-den Rechner eine abstrakte Schnittstelle in Form von Zielposition, Beschleu-nigung und Maximalgeschwindigkeit zur Verf¨ugung (vgl. Abbildung 9.10).

Vmax

Xziel

Xstart

Vmin

V[F S/s]

[s]

keine Bewegung

keine Bewegung konstante

Geschwindigkeit

Beschleunigungs-phase

Verzögerungs-phase

Abb. 9.10.Rampenerzeugung des Trinamic TMC222. Quelle: Trinamic, Datenblatt TMC222.

¨Uber integrierte RAM- und OTP9-Speicher k¨onnen Bewegungsparameter ab-gelegt werden. Die Kapselung dieser Low-Level-Befehle entlastet den

Host-8Bspw. dem Schrittmotortreiber A3979 von Allegro, vgl. http://www.

allegromicro.com.

9Engl.One Time Programmable.

Controller und erm¨oglicht zudem die Ansteuerung ¨uber ein integriertes serielles I2C-Interface.10Folgende Eckdaten kennzeichnen den TMC222:

• Betrieb von bipolaren Schrittmotoren im Micro-Step-Modus

• Spulenspannung bis 800 mA

• Versorgungsspannung 8–29 V

• Diagnose f¨ur ¨Ubertemperatur, Leitungsbruch, Kurzschluss, ¨Uberstrom und Unterspannung

• Motion-Controller mit internem 16-Bit-Z¨ahler

• Rampengenerator, Vorgabe der Beschleunigung und der Geschwindigkeit

• Anschluss f¨ur Referenzschalter

• I2C-Schnittstelle mit bis zu 350 kbit/s

!

1

Adresse

1 OTP3 OTP2 OTP1 OTP0 A0 R/W

Abb. 9.11. I2C-Adressfeld des TMC222.

Abbildung 9.11 zeigt das Adressfeld des TMC222. ¨Uber das OTP-Register lassen sich vier Bit fest programmieren, die bei der Auslieferung auf 0 gesetzt sind. Bit 0 kann in der Schaltung verdrahtet werden und wird in der Regel auf einen Jumper herausgef¨uhrt. Werden mehrere TMCs an einem I2C-Bus be-trieben, sind die OTP-Felder zuvor entsprechend zu parametrieren. Insgesamt k¨onnen dann maximal 32 TMC222-Module verwendet werden. Zur Kommuni-kation mit dem Logikteil des TMC222 stehen dem Anwender die in Tabelle 9.5 aufgelisteten Befehle zur Verf¨ugung.

9.6.2 Conrad C-Control I2C-Bus-Stepper-Driver

Mit dem Conrad I2C-Bus-Stepper-Driver ist ein g¨unstiges Applikationsboard auf Basis des TMC222 erh¨altlich (vgl. Tabelle E.2). Der Anwender erspart sich hiermit das Aufl¨oten des SMD-Bausteins oder gar ein eigenes Platinen-layout. Zudem sind auf der Stepper-Driver-Platine zus¨atzliche Komponenten zur Spannungsstabilisierung und Absicherung untergebracht. Bei Motoren be-stimmter Bauform ist es m¨oglich, das Modul direkt am Geh¨ause zu

befesti-10Unter der Bezeichnung TMC211 ist der Baustein auch mit LIN-Bus-Anschluss verf¨ugbar.

186 9 Inter-IC-Bus-Komponenten

Befehl Funktion Befehls-Byte

GetFullStatus1 Liefert den kompletten Status zur¨uck 0x81 GetFullStatus2 Liefert Ist-, Soll- und Sicherheitsposition 0xFC

GetOTPParam Liefert OTP-Parameter 0x82

GotoSecurePosition F¨ahrt den Motor an die Sicherheitsposition 0x84

HardStop Stoppt den Motor sofort 0x85

ResetPosition Setzt die aktuelle Ist- und Zielposition auf 0 0x86 ResetToDefault Uberschreibt RAM-Speicher mit OTP-Inhalt¨ 0x87

RunInit Referenzfahrt 0x88

SetMotorParam Setzt die Motorparameter 0x89

SetOTPParam L¨oscht den OTP-Speicher 0x90

SetPosition Setzt Ziel- und Sicherheitsposition 0x8B SoftStop Stoppt den Motor mit eingestellter Verz¨ogerung 0x8F

Tabelle 9.5. Befehlssatz des TMC222.

gen.11 Abbildung 9.12 zeigt einen Versuchsaufbau mit Motor, Stepper-Driver und Endschalter.

Abb. 9.12.I2C-Bus-Stepper-Driver mit Schrittmotor und Endschalter.

Der I2C-Bus wird gem¨aß Tabelle 9.6 ¨uber einen Pfostenstecker angeschlos-sen. Versorgung, Motoranschl¨usse und Endschaltereingang sind auf Schraub-klemmen herausgef¨uhrt. Die Leitung f¨ur den Endschalter kann wahlweise auf GND oder V+ gesetzt werden – eine interne Logik bestimmt automatisch den richtigen Schaltzustand. Falls die Belegung des verwendeten Motors nicht be-kannt ist, k¨onnen die Spulenanschl¨usse durch Widerstandsmessung mithilfe eines Multimeters bestimmt werden. Die korrekte Polung kann im Betrieb

er-11Dies gilt f¨ur Motoren mit einem Abstand von 31 mm zwischen den Bohrungen.

mittelt werden: Bei einer ungleichm¨aßigen Bewegung ist wahrscheinlich eine der beiden Spulen nicht richtig gepolt.

Anschluss Beschreibung SDA (PF), Pin 5 I2C-Bus Datenleitung SCL (PF), Pin 6 I2C-Bus Taktleitung GND (PF), Pin 1 I2C-Bus Signalmasse

V+ Versorgungsspannung, 8 V–24 V GND Versorgungsmasse

OB2 Spule B, negativer Anschluss OB1 Spule B, positiver Anschluss OA2 Spule A, negativer Anschluss OA1 Spule A, positiver Anschluss ERS Endschalter

Tabelle 9.6.Anschlussbelegung des I2C-Bus-Stepper-Moduls von Conrad. Die I2 C-Leitungen SDA, SCL und Signalmasse werden auf dem sechspoligen Pfostenstecker (PF) aufgesteckt. F¨ur die anderen Anschl¨usse existieren Schraubklemmen.

9.6.3 Die Klasse IICStepper

Mit der Klasse IICStepper wird dem Anwender eine einfache Schnittstelle geboten, um Schrittmotoren ¨uber einen TMC222-Baustein anzusteuern. Die Anwendung eignet sich ebenfalls f¨ur andere Layouts und ist nicht auf das Ap-plikationsboard von Conrad beschr¨ankt. Um die Implementierung auch f¨ur eigene Erweiterungen nachvollziehbar zu gestalten, werden die in Tabelle 9.5 aufgelisteten TMC222-Befehle als gleichnamige Methoden implementiert. Ei-ne Ausnahme bilden die beiden OTP-ZugriffsfunktioEi-nengetOTPParam()und setOTPParam(). Diese werden zum Schreiben des OTP-Speichers in einer se-paraten Funktion verwendet (vgl. auch Abschnitt 9.6.4).

F¨ur die einfache Verwendung des Bausteins setzen zus¨atzliche Methoden auf den TMC222-Befehlen auf. So werden auch Status und Parameter des TMC222 f¨ur einen einfachen Zugriff in separaten Strukturen motor params undmotor statushinterlegt.

Nach einer kombinierten Abfrage mittelsgetFullStatus2()f¨ur den direkten Zugriff auf die Einzelpositionen (Soll-, Ist- und Sicherheitsposition) werden auch diese als Membervariablen gespeichert. Mit einem umfangreichen I2 C-Pufferm bufvon zehn Bytes ergeben sich f¨ur die KlasseIICStepperfolgende Objektvariablen:

m o t o r _ p a r a m s p a r a m s ; // m o t o r p a r a m e t e r s

m o t o r _ s t a t u s s t a t u s ; // m o t o r s t a t u s

s h o r t a c t u a l _ p o s , t a r g e t _ p o s , s e c u r e _ p o s ; // 16 - bit - p o s i t i o n s

c h a r buf [ 1 0 ] ; // rw - b u f f e r

188 9 Inter-IC-Bus-Komponenten

Als Benutzerschnittstelle sind folgende Methoden implementiert:

IICStepper(IICBus& bus, int addr, string name);

Erzeugt ein Objekt vom TypIICStepper unter Angabe der Standardpa-rameter f¨ur den zugeordneten I2C-Busbus, der Bausteinadresseaddrund der Bezeichnungname.

TMC222-Befehle

Bis auf die BefehlegetOTPParam()undsetOTPParam()stehen alle in Ta-belle 9.5 aufgelisteten Befehle auch als Memberfunktionen zur Verf¨ugung.

Diese sind hier nicht nochmals einzeln aufgef¨uhrt.

motor status getStatus();

Liefert die Statuswerte in einer Struktur vom Typ motor status gesam-melt zur¨uck. Die Daten werden direkt vom TMC222 ermittelt.

motor params getParams();

Liefert die Parameter in einer Struktur vom Typmotor paramsgesammelt zur¨uck. Die Daten werden direkt vom TMC222 ermittelt.

Wichtig: F¨ur die folgenden Zugriffsfunktionen m¨ussen die Daten zun¨achst mittels getFullStatus1() bzw. getFullStatus2() vom TMC222 gelesen werden:

unsigned char getTempInfo();

Liefert den Temperaturstatus als 2-Bit-Wert zur¨uck.

bool getExtSwitch();

Liefert den Zustand des Endschalters (gedr¨uckt = 1).

bool getMotion();

Gibt an, ob der Motor sich momentan in Bewegung befindet.

short getActualPos(), getTargetPos(), getSecurePos();

Liefert die jeweilige Position als 16-Bit-Wert zur¨uck.

int referenceInit(motor params params, unsigned char v max, unsigned char v min, short ref dist, short null dist);

F¨uhrt eine Referenzfahrt zum Endschalter aus. Der Motor bewegt sich dabei um eine maximale Distanz von ref dist Schritten. Wird der Endschalter auf dieser Strecke nicht erreicht, erfolgt ein Abbruch mit R¨uckgabewert−1. Bei Erreichen des Endschalters wird der TMC222 neu initialisiert und es erfolgt eine Fahrt zur relativen Position null dist. Jetzt wird der Z¨ahler zur¨uckgesetzt. Die Referenzfahrten werden mit v min und v max ausgef¨uhrt. Anschließend werden die Parameter auf paramsgesetzt.

int waitForStop(unsigned int maxtime ms);

Wartet blockierend bis die Bewegung beendet ist, allerdings h¨ochstens maxtime msMillisekunden. Eine Auswertung erfolgt durch kontinuierliches

Lesen des Motion-Flags. Kommt der Motor innerhalb der Zeitvorgabe zum Stillstand, wird 0 zur¨uckgegeben, sonst−1.

void printParam();

Gibt alle Parameter auf der Standardausgabe aus.

void printStatus();

Gibt alle Statuswerte auf der Standardausgabe aus.

Wenn die R¨uckgabewerte nicht n¨aher spezifiziert wurden, wird im Erfolgs-fall die kommunizierte Anzahl der I2C-Daten-Bytes zur¨uckgegeben, sonst

−1. Es ist zu beachten, dass der Aufruf der notwendigen TMC222-Befehle nicht automatisch in die get-Methoden f¨ur einzelne Variablenzugriffe inte-griert ist. Da teilweise bis zu acht Bytes ¨uber den Bus ¨ubertragen werden, sollte dies nicht h¨aufiger als notwendig geschehen. Es liegt in der Hand des Anwenders, den Zeitpunkt zu w¨ahlen, wann Daten aktualisiert werden sol-len. Vor dem Zugriff auf Parameter oder Statusvariablen ist ein Aufruf von getFullStatus1()notwendig. Eine Positionsabfrage ben¨otigt einen vorheri-gen Aufruf vongetFullStatus2().

Nach dem Neustart eines TMC222 sind vor der ersten Motorbewegung folgende Initialisierungsschritte auszuf¨uhren:

1. Aufruf vongetFullStatus1(); die Schaltung verl¨asst den Sicherheitszu-stand.

2. Abfrage der aktuellen Position durch einen Aufruf vongetFullStatus2(); die Sollposition f¨urrunInit()muss sich davon unterscheiden.

3. Setzen der notwendigen Bewegungsparameter durch einen Aufruf von setMotorParam().

4. Start der Initialisierungsphase durch eine Ausf¨uhrung vonrunInit()bzw.

referenceInit(), falls ein Endschalter angefahren werden soll.

Das Beispielstepperzeigt, welche Schritte nach der Erstellung eines Objektes vom Typ IICStepper notwendig sind, um eine korrekte Referenzfahrt mit anschließender Positionierung auszuf¨uhren.

9.6.4 Programmierung des TMC222-OTP-Speichers

Wie bereits in Abschnitt 9.6 angesprochen, k¨onnen vier Bits der TMC-Adresse

¨uber den OTP-Speicher fest programmiert werden. Dies ist nur einmalig m¨oglich und sollte deshalb nicht in der Anwendung selbst geschehen. Mit dem zweiten Quelltextbeispiel in stepper steht ein Programm nur f¨ur die-se Aufgabe zur Verf¨ugung (Datei otptool.c). Es empfiehlt sich, zun¨achst etwas Erfahrung zu den Parameterwerten f¨ur Maximalstrom, Beschleunigung

190 9 Inter-IC-Bus-Komponenten

und Geschwindigkeit zu sammeln, bevor diese gemeinsam mit der Adresse fest eingebrannt werden.

Bei einem Neustart wird der RAM-Inhalt aus dem OTP-Speicher kopiert, womit sich mit fest eingestellten Variablen ein Aufruf von setMotorParam() zu Beginn er¨ubrigt. Versehentlich fehlerhaft programmierte OTP-Werte sind zwar ¨argerlich, aber nicht tragisch. Falls zumindest die Adresse korrekt ist, so k¨onnen die Werte im RAM wieder ¨uberschrieben werden. ¨Uber den Be-fehl resetToDefault()kann der RAM-Inhalt auf OTP-Werte zur¨uckgesetzt werden. Das C-Programm otptool l¨asst sich ¨uber ein im Makefile separat definiertes Ziel ¨ubersetzen:

$ m a k e o t p t o o l

Im Listing sind die nachfolgenden Parameter bereits definiert. Die Werte sind f¨ur die eigene Applikation entsprechend anzupassen:

# d e f i n e A D D R E S S 0 x60

# d e f i n e OSC 0 x08

# d e f i n e I R E F 0 x04

# d e f i n e TSD 0 x00

# d e f i n e BG 0 x00

# d e f i n e AD 0 x00

# d e f i n e I R U N 0 x0B

# d e f i n e I H O L D 0 x03

# d e f i n e V M A X 0 x04

# d e f i n e V M I N 0 x01

# d e f i n e S E C P O S 500

# d e f i n e S H A F T 0 x01

# d e f i n e ACC 0 x02

# d e f i n e S T E P M O D E 0 x03

Der OTP-Inhalt besteht aus insgesamt acht Bytes.12 Diese werden zun¨achst aus den definierten Makros zusammengesetzt und dann, nach erfolgreicher De-tektion des TMC222-Bausteins, nacheinander geschrieben. Am Ende des Pro-gramms wird der OTP-Inhalt zur¨uckgelesen und ausgegeben. Zun¨achst sollte ein Testlauf erfolgen um die zusammengesetzten Werte zu ¨uberpr¨ufen. An-schließend kann folgende Einkommentierung vorgenommen und ein Brennver-such gestartet werden:

// # d e f i n e A C T I V E