Hallo,
ich habe ein Baggermodell mit Arduino MEGA und 6 Schrittmotoren. Fast alles klappt zZ prima mit einer Ausnahme.
Für die Schrittmotoransteuerung habe ich ein selbsterstelltes Unterprogramm geschrieben, dessen Aufruf für einen Motor z.B. so aussieht:
M1_drive(41, 43, 45, 47, n, 30, 0); // 41, 43, 45, 47 sind die Ausgänge, n = Anzahl der Umdrehungen,
// 30 = Anzahl der Umdrehungen/min; 0 = Drehrichtung
Mit den Geschwindigkeiten, die die Zahnstangenantriebe fahren, bin ich für den normalen Ablauf zufrieden. Es gibt jedoch eine Unterprogramm "Justierung" mit dem ich nach einander alle Antriebe in eine definierte Ausgangsstellung fahren kann. Bei dieser Betriebsart schleichen die Antriebe jedoch nur, auch wenn ich den Parameter für die U/min in den entsprechenden Aufrufen vergrößere. Die Unterprogramme Mx_drive benutze ich in jedem Fall, jedoch für jeden Motor ein separates.
Zunächst hatte ich die Library Bounce2 in Verdacht, mit der ich das Prellen eines Tasters, der mit Erreichen der Grundstellung eines Antriebs betätigt wird, unterdrücken will. Die Einstellung von 1 ms reichte dafür aus. Aber auch wenn ich 100 ms einstellte, liefen die Antriebe nicht langsamer, so dass ich meine, dass diese Library den normalen Programmzyklus nicht verzögert. Oder liege ich da falsch?
Evtl. fällt jemandem spontan auf, was die Ursache für diese unterschiedlichen Geschwindigkeiten sein könnte.
Ich habe den Teil des Codes für Motor1 aus dem Unterprogramm Justierung angefügt und ein Bild des entsprechenden Flussdiagramms.
Code:
// ************************************** UP Justierung **************************************
void Justierung() {
static boolean M1_fertig = false;
static boolean M2_fertig = false;
static boolean M3_fertig = false;
static boolean M4_fertig = false;
static boolean M5_fertig = false;
static boolean M6_fertig = false;
static boolean M1_laeuft = false;
static boolean M2_laeuft = false;
static boolean M3_laeuft = false;
static boolean M4_laeuft = false;
static boolean M5_laeuft = false;
static boolean M6_laeuft = false;
static boolean Z_EIN; // true, solange Timer 1 läuft
if (M1_fertig == true) {
goto M2_Sprung; // M1 wird übersprungen
}
if (JustPin == HIGH) {
M1_laeuft = true;
M1_drive(41, 43, 45, 47, 30, 3, 1); // 41, 43, 45, 47, Mx_n, Mx_v, Mx_dir ; für den MEGA
return;
} // *********** ENDE if (JustPin == HIGH)
if (Zeit_EIN(M1_laeuft) == true) { // Aufruf des UPs Zeit_EIN(), das die Zeit startet, in der JustPin LOW sein muss, damit eine Motor übersprungen wird.
return; // Sprung aus UP Justierung
}
timer1.disable(zeitId); // Timer1 löschen
M1_fertig = true; // wenn Auftrag vom Hauptprogramm erledigt ist
M1_Start == true;
Zeitueberlauf = false; // eigenes Zeitsignal löschen
TimerAktiv = false;
lzahn1_alt = 1.0;
digitalWrite(41, LOW); // alle LOW, damit der Motor im Stillstand stromlos ist.
digitalWrite(43, LOW);
digitalWrite(45, LOW);
digitalWrite(47, LOW);
M2_Sprung: // >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ab hier Start Motor 2
Mir ist klar, dass das mit diesen Informationen keine einfache Frage ist.
Welche Möglichkeiten kennt ihr, den Verursacher zu finden?
Noch zur Erklärung:
Zahnstangengeschwindigkeit von 13 mm/s ist ok
Bei Justierung nur ca. 2 mm/s
vG
fredyxx
Lesezeichen