Ansteuerung einer Schrittmotor-Achse mit Mikrocontrollern am Beispiel eines Arduino-Mega: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
Zeile 20: | Zeile 20: | ||
*''Deklarierung/Initialisierung der Variablen und Funktionen '' | *''Deklarierung/Initialisierung der Variablen und Funktionen '' | ||
// MTR GPE | |||
// WS 15/16 | |||
// David Hötzel | |||
// Test-String: X2000Y0000Z0000F9999 // U4000V0000W0000 | |||
// Endschalter der Endlagen links und rechts sind nur zur hardwaretechnischen Sicherheitsabschaltung (Not-Endlage) vorgesehen, nicht in diesem Programm zur Referenzierung! | |||
#include <AccelStepper.h> // Libary für Schrittmotoransteuerung | |||
// Infos: http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ac62cae590c2f9c303519a3a1c4adc8ab | |||
AccelStepper Achse_X(1,9,8), Achse_Y(1,9,8), Achse_Z(1,9,8); // Funktion zur Ansteuerung der jeweiligen Achse erstellen (Interface, Output-Pin für Step, Output-Pin für Direction) | |||
double X_Schritte = 0.0, Y_Schritte = 0.0, Z_Schritte = 0.0, F_Geschw = 0.0, U_Schritte = 0.0, V_Schritte = 0.0, W_Schritte = 0.0; // Variablen zur Berechnung der Anzahl der Schritte | |||
double X_Soll = 0.0, Y_Soll = 0.0, Z_Soll = 0.0, F_Soll = 0.0; // Variablen zur Berechnung der Sollposition in mm | |||
double U_Referenz = 0.0, V_Referenz = 0.0, W_Referenz = 0.0; // Variablen zur Referenzierung | |||
char Zeichen; // Variable zur Identifizeriung Achse im String | |||
double Sollposition = 0; // Variable zum Zwischenspeichern des Sollwerts (aller Achsen) in der Funktion "string_auslesen" | |||
double Schrittverhaeltnis = 0.033; // Verhältnis zur Eingabe absoluter Wege | |||
// Verhältnis Verfahrweg pro Umdrehung in mm/Schritte: 66/200 = 0,33 (Umdrehung besteht bei 1,8° pro Schritt aus 200 Schritten) | |||
// Verhältnis Schrittmotortreiber zu Schrittmotor: 1/10 | |||
*'' void loop() '' | *'' void setup() '' | ||
{ | |||
Serial.begin(115200); // Serielle Kommunikation starten | |||
Serial.println(""), Serial.println(""); | |||
Serial.print("Initialisiere..."); | |||
Achse_X.setPinsInverted(false,true,true); // Richtung: false=rechts, stepInvert, enableInvert | |||
Achse_X.setMaxSpeed(1000); // Begrenzung maximale Geschwindwigkeit der Achse | |||
Achse_Y.setPinsInverted(false,true,true); | |||
Achse_Y.setMaxSpeed(1000); | |||
Achse_Z.setPinsInverted(false,true,true); | |||
Achse_Z.setMaxSpeed(1000); | |||
Serial.println("fertig."); | |||
Serial.println(""), Serial.println(""); | |||
} | |||
*'' void loop() '' | |||
{ | |||
if (Serial.available() > 0) // Prüfen ob Daten am Seriellen Port verfügbar sind | |||
{ | |||
Serial.println("Neue Werte empfangen:"); | |||
Zeichen = Serial.read(); // erstes Byte (=erstes Zeichen) des seriellen Ports einlesen | |||
if(Zeichen == 'X') // Prüfen ob das Zeichen ein X,Y,Z oder F ist (Sollwertvorgaben der jeweiligen Achsen) | |||
{ | |||
X_Soll = string_auslesen(); | |||
Serial.print("X-Soll [mm]:"), Serial.print(X_Soll); | |||
Zeichen = Serial.read(); | |||
} | |||
if(Zeichen == 'Y') | |||
{ | |||
Y_Soll = string_auslesen(); | |||
Serial.print(" | Y-Soll [mm]:"), Serial.print(Y_Soll); | |||
Zeichen = Serial.read(); | |||
} | |||
if(Zeichen == 'Z') | |||
{ | |||
Z_Soll = string_auslesen(); | |||
Serial.print(" | Z-Soll [mm]:"), Serial.print(Z_Soll); | |||
Zeichen = Serial.read(); | |||
} | |||
if(Zeichen == 'F') | |||
{ | |||
F_Soll = string_auslesen(); | |||
Serial.print(" | F-Soll [mm/min]: "), Serial.println(F_Soll), Serial.println(""); | |||
Zeichen = Serial.read(); | |||
} | |||
if(Zeichen == 'U') // Prüfen ob das Zeichen ein U,V oder W ist (Übergabe eines neuen Referenzpunkt der jeweiligen Achse) | |||
{ | |||
U_Referenz = string_auslesen(); | |||
U_Schritte = U_Referenz/Schrittverhaeltnis; | |||
Achse_X.setCurrentPosition(U_Schritte); | |||
X_Soll = 0; | |||
Serial.print("X-Achse-Referenz gesetzt [mm]: "), Serial.print(U_Referenz); | |||
Zeichen = Serial.read(); | |||
} | |||
if(Zeichen == 'V') | |||
{ | |||
V_Referenz = string_auslesen(); | |||
V_Schritte = V_Referenz/Schrittverhaeltnis; | |||
Achse_Y.setCurrentPosition(V_Schritte); | |||
Y_Soll = 0; | |||
Serial.print(" | Y-Achse-Referenz gesetzt [mm]: "), Serial.print(V_Referenz); | |||
Zeichen = Serial.read(); | |||
} | |||
if(Zeichen == 'W') | |||
{ | |||
W_Referenz = string_auslesen(); | |||
W_Schritte = W_Referenz/Schrittverhaeltnis; | |||
Achse_Z.setCurrentPosition(W_Referenz); | |||
Z_Soll = 0; | |||
Serial.print(" | Z-Achse-Referenz gesetzt [mm]: "), Serial.println(W_Referenz), Serial.println(""); | |||
Zeichen = Serial.read(); | |||
} | |||
} | |||
X_Schritte = X_Soll/Schrittverhaeltnis; // Berechnung der Anzahl der Schritte zur Übergabe an den Schrittmotortreiber der jeweiligen Achse | |||
Y_Schritte = Y_Soll/Schrittverhaeltnis; | |||
Z_Schritte = Z_Soll/Schrittverhaeltnis; | |||
F_Geschw = (F_Soll/(60*Schrittverhaeltnis)); // Berechnung der Anzahl der Schritte pro Sekunde für die Geschwindigkeitsvorgabe der Achsen | |||
Achse_X.moveTo(X_Schritte); // Übergabe der Anzahl der Schritte an den jeweiligen Schrittmotortreiber | |||
Achse_Y.moveTo(Y_Schritte); | |||
Achse_Z.moveTo(Z_Schritte); | |||
Verfahren(); | |||
} | |||
*'' double string_auslesen() '' | *'' double string_auslesen() '' |
Version vom 28. Dezember 2015, 11:30 Uhr
Einleitung
• Aufgabenstellung und Ziel
Stand der Technik
Hardware
• Arduino Mega 2560 Mikrocontroller
• Geckodrive G201X Schrittmotortreiber
• Igus Nema23 Schrittmotor
• Schaltplan
Software
• Quellcode Mikrocontroller
- Deklarierung/Initialisierung der Variablen und Funktionen
// MTR GPE // WS 15/16 // David Hötzel // Test-String: X2000Y0000Z0000F9999 // U4000V0000W0000 // Endschalter der Endlagen links und rechts sind nur zur hardwaretechnischen Sicherheitsabschaltung (Not-Endlage) vorgesehen, nicht in diesem Programm zur Referenzierung! #include <AccelStepper.h> // Libary für Schrittmotoransteuerung // Infos: http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html#ac62cae590c2f9c303519a3a1c4adc8ab AccelStepper Achse_X(1,9,8), Achse_Y(1,9,8), Achse_Z(1,9,8); // Funktion zur Ansteuerung der jeweiligen Achse erstellen (Interface, Output-Pin für Step, Output-Pin für Direction) double X_Schritte = 0.0, Y_Schritte = 0.0, Z_Schritte = 0.0, F_Geschw = 0.0, U_Schritte = 0.0, V_Schritte = 0.0, W_Schritte = 0.0; // Variablen zur Berechnung der Anzahl der Schritte double X_Soll = 0.0, Y_Soll = 0.0, Z_Soll = 0.0, F_Soll = 0.0; // Variablen zur Berechnung der Sollposition in mm double U_Referenz = 0.0, V_Referenz = 0.0, W_Referenz = 0.0; // Variablen zur Referenzierung char Zeichen; // Variable zur Identifizeriung Achse im String double Sollposition = 0; // Variable zum Zwischenspeichern des Sollwerts (aller Achsen) in der Funktion "string_auslesen" double Schrittverhaeltnis = 0.033; // Verhältnis zur Eingabe absoluter Wege // Verhältnis Verfahrweg pro Umdrehung in mm/Schritte: 66/200 = 0,33 (Umdrehung besteht bei 1,8° pro Schritt aus 200 Schritten) // Verhältnis Schrittmotortreiber zu Schrittmotor: 1/10
- void setup()
{ Serial.begin(115200); // Serielle Kommunikation starten Serial.println(""), Serial.println(""); Serial.print("Initialisiere..."); Achse_X.setPinsInverted(false,true,true); // Richtung: false=rechts, stepInvert, enableInvert Achse_X.setMaxSpeed(1000); // Begrenzung maximale Geschwindwigkeit der Achse Achse_Y.setPinsInverted(false,true,true); Achse_Y.setMaxSpeed(1000); Achse_Z.setPinsInverted(false,true,true); Achse_Z.setMaxSpeed(1000); Serial.println("fertig."); Serial.println(""), Serial.println(""); }
- void loop()
{ if (Serial.available() > 0) // Prüfen ob Daten am Seriellen Port verfügbar sind { Serial.println("Neue Werte empfangen:"); Zeichen = Serial.read(); // erstes Byte (=erstes Zeichen) des seriellen Ports einlesen if(Zeichen == 'X') // Prüfen ob das Zeichen ein X,Y,Z oder F ist (Sollwertvorgaben der jeweiligen Achsen) { X_Soll = string_auslesen(); Serial.print("X-Soll [mm]:"), Serial.print(X_Soll); Zeichen = Serial.read(); } if(Zeichen == 'Y') { Y_Soll = string_auslesen(); Serial.print(" | Y-Soll [mm]:"), Serial.print(Y_Soll); Zeichen = Serial.read(); } if(Zeichen == 'Z') { Z_Soll = string_auslesen(); Serial.print(" | Z-Soll [mm]:"), Serial.print(Z_Soll); Zeichen = Serial.read(); } if(Zeichen == 'F') { F_Soll = string_auslesen(); Serial.print(" | F-Soll [mm/min]: "), Serial.println(F_Soll), Serial.println(""); Zeichen = Serial.read(); } if(Zeichen == 'U') // Prüfen ob das Zeichen ein U,V oder W ist (Übergabe eines neuen Referenzpunkt der jeweiligen Achse) { U_Referenz = string_auslesen(); U_Schritte = U_Referenz/Schrittverhaeltnis; Achse_X.setCurrentPosition(U_Schritte); X_Soll = 0; Serial.print("X-Achse-Referenz gesetzt [mm]: "), Serial.print(U_Referenz); Zeichen = Serial.read(); } if(Zeichen == 'V') { V_Referenz = string_auslesen(); V_Schritte = V_Referenz/Schrittverhaeltnis; Achse_Y.setCurrentPosition(V_Schritte); Y_Soll = 0; Serial.print(" | Y-Achse-Referenz gesetzt [mm]: "), Serial.print(V_Referenz); Zeichen = Serial.read(); } if(Zeichen == 'W') { W_Referenz = string_auslesen(); W_Schritte = W_Referenz/Schrittverhaeltnis; Achse_Z.setCurrentPosition(W_Referenz); Z_Soll = 0; Serial.print(" | Z-Achse-Referenz gesetzt [mm]: "), Serial.println(W_Referenz), Serial.println(""); Zeichen = Serial.read(); } } X_Schritte = X_Soll/Schrittverhaeltnis; // Berechnung der Anzahl der Schritte zur Übergabe an den Schrittmotortreiber der jeweiligen Achse Y_Schritte = Y_Soll/Schrittverhaeltnis; Z_Schritte = Z_Soll/Schrittverhaeltnis; F_Geschw = (F_Soll/(60*Schrittverhaeltnis)); // Berechnung der Anzahl der Schritte pro Sekunde für die Geschwindigkeitsvorgabe der Achsen Achse_X.moveTo(X_Schritte); // Übergabe der Anzahl der Schritte an den jeweiligen Schrittmotortreiber Achse_Y.moveTo(Y_Schritte); Achse_Z.moveTo(Z_Schritte); Verfahren(); }
- double string_auslesen()
- void Verfahren()