Hallo Forum!
Ich weiß mal wieder nicht weiter. Ich bastle schon länger an einem Projekt herum, was grundsätzlich auch prima funktioniert … aber manchmal eben nicht.
Zur Erklärung: Ich bewege einen Schlitten mit einem Schrittmotor über eine Kreissäge, um damit Zinkungen zu sägen. Wenn alles fertig ist wird der Schlitten den ganzen Weg zurückgefahren, bis ein induktiver Näherungsschalter ausgelöst wird und die Rückfahrt per Interrupt beendet wird. Dann wird noch ein kleines Stück weitergefahren (um das Spindelspiel loszuwerden) und wieder zurückgefahren. Wenn der Näherungsschalter wieder auslöst, wird die Position nullkalibriert. So funktioniert es auch absolut zuverlässig - einfach geil, hochpräzise.
Aber eben nicht immer. Manchmal zeigt der Motor das Verhalten, was im folgenden Video zu sehen ist (25 MB):
https://nx17140.your-storageshare.de/s/mmcZRExY7bLCasD
Erst fährt der Schlitten 2x korrekt zurück, beim dritten mal knörzt er ordentlich, bewegt sich deutlich langsamer und fährt auch eine unkorrekte Position an, wie an der Messuhr zu sehen ist. Woran könnte das liegen? Ich habe gegoogelt und bin auf das "overshooting"-Problem gestoßen, aber es ist eher das genaue Gegenteil, wie mir scheint.
So, welche Infos könnten benötigt werden?
Ich verwende:
- Arduino Nano
- DRV8825 von Ti
- 18V Spannungsversorgung aus einem BOSCH-Akku (keine Sorge, ist voll)
- Step-Down-Wandler auf 7V für Arduino VIN, Rest geht in Nema17-Schrittmotor
- ich benutze die Accesstepper-Library, Herumspielen mit MaxSpeed und Acceleration löst das Problem nicht
- Das Problem taucht immer nur nach einem Richtungswechsel im Interrupt auf!
- Das Problem ist nicht sicher reproduzierbar, ca 85% der Fahrten sind absolut i.O.
- es gibt keine mir bekannten Bugs, wie Hitzeprobleme oder sowas, der Sketch funktioniert auch nach Stunden noch, der Motor wird bei Nichtbenutzung ausgeschaltet
void setup() {
Serial.begin(9600);
pinMode(notaus_pin, INPUT_PULLUP); // I N T E R R U P T !
attachInterrupt(digitalPinToInterrupt(notaus_pin), not_aus, CHANGE); // Not-Aus-Knopf
/****************************************
Einstellungen für den Schrittmotor:
****************************************/
pinMode(richtung_pin, OUTPUT); // Richtung
pinMode(schritt_pin, OUTPUT); // Schritt
pinMode(ms0, OUTPUT); // Microsteps 1
pinMode(ms1, OUTPUT); // Microsteps 1
pinMode(ms2, OUTPUT); // Microsteps 2
pinMode(enable, OUTPUT); // Enable Motor
digitalWrite(enable, LOW); // LOW = Motor an, HIGH = Motor aus!
stepper.setMaxSpeed(4800);
stepper.setAcceleration(12000);
stepper.runToNewPosition(320 * ms_mm * motorpositionsfaktor);
stepper.runToNewPosition(-20 * ms_mm * motorpositionsfaktor);
}
void loop() {
}
void not_aus() {
stepper.setAcceleration(40000);
if (drehrichtung() == 'r'){
stepper.stop();
stepper.moveTo(30 * ms_mm * motorpositionsfaktor); // Position wird nie erreicht, weil sie vorher unterbrochen wird!
}
if (drehrichtung() == 'l'){
stepper.setCurrentPosition(0);
stepper.moveTo(3 * ms_mm * motorpositionsfaktor);
}
}
Das Video zeigt das fehlerhafte Verhalten, das bei diesem Code auch gezeigt wurde. Der Codeschnipsel wird aber im Video nicht abgespielt.
Also: Wo kann ich anfangen zu suchen - oder was wird noch benötigt?
Danke und Gruß, kuahmelcher.