/*Test Ansteuerung der Schrittmotor-Treiber A4988. Schrittmotor-Treiber-Modul mit A4988: auf 1/8 Schritt-Betrieb einstellen: HIGH an MS1+MS2 und LOW an MS3. Am Potentiometer Einstellung Phasenstrom so, dass Funktion erfuellt wird.*/ /* Pins am Nano fuer Verbindung zu den Schrittmotor-Treibern: */ #define MotLinksD 5 // Drehrichtung Motor links #define MotLinksS 9 // Schritt Motor links #define MotRechtsD 3 // Drehrichtung Motor rechts #define MotRechtsS 2 // Schritt Motor rechts #define MotEnable 4 // Enable beide Motoren, Treiber A4988 aktiviert wenn LOW int MotLinksGeschwind = 200; // Bei 200: 500000/200 = 2500 Mikrosek // zwischen zwei 1/8 Schritten a 0,225°, das sind 0,25 U/Sek. int MotRechtsGeschwind = 200; // Bei negativen Werten andere Drehrichtung void setup() { pinMode(MotLinksD, OUTPUT); pinMode(MotLinksS, OUTPUT); pinMode(MotRechtsD, OUTPUT); pinMode(MotRechtsS, OUTPUT); pinMode(MotEnable, OUTPUT); digitalWrite(MotEnable,LOW); // Motortreiber aktivieren mit LOW } void loop() { MotLinks(); // Aufruf der Unterprogramme zur Ansteuerung der Motoren MotRechts(); } void MotLinks() { if(MotLinksGeschwind == 0) return; // Wenn Null - zurueck zu Beginn von void loop // Wenn ungleich null: PORTB = PORTB & B11111101; // D9 bzw A4988-Eingang STEP auf LOW setzen, durch Portmanipulation mit bitweise UND // Wesentlich schneller als mit Befehl digitalWrite(Motor1S, LOW), aber notwendig noch... delayMicroseconds(3); // ...delay, weil der A4988-Eingang STEP eine min Impulslaenge 1 Mikrosek verlangt static unsigned long LetzterSchritt = 0; // Variable mit "static": Wert 0 wird nur beim ersten Durchlauf zugewiesen static boolean Status = false; // false ist gleichbedeutend mit 0 bzw LOW long MicrosProSchritt = 500000ul / abs(MotLinksGeschwind); // Berechnung der Zeit zwischen zwei Schritten (1/8 Schritten 0,225°) digitalWrite(MotLinksD, MotLinksGeschwind > 0 ? LOW:HIGH); // Richtungsangabe setzen, Ausgabe an Pin Motor1D // Ergebnis ist HIGH, wenn Motor1Geschwind > 0 ist. Sonst LOW. if(micros() - LetzterSchritt > MicrosProSchritt) { // Wenn die Zeit ueberschritten ist erfolgt ein Wechsel des Status PORTB = PORTB | B00000010; // D9 und damit A4988-Eingang STEP auf HIGH setzen, ein 1/8 Schritt 0,225° wird ausgefuehrt // Portmanipulation mit bitweise ODER LetzterSchritt = micros(); // Variable wird wieder aktualisiert, fuer erneuten Vgl mit micros } } void MotRechts() { if(MotRechtsGeschwind == 0) return; // Wenn Null - zurueck zu Beginn von void loop // Wenn ungleich null: PORTD = PORTD & B11111011; // D2 bzw A4988-Eingang STEP auf LOW setzen, durch Portmanipulation mit bitweise UND // Wesentlich schneller als mit Befehl digitalWrite(Motor1S, LOW), aber notwendig noch... delayMicroseconds(3); // ...delay, weil der A4988-Eingang STEP eine min Impulslaenge 1 Mikrosek verlangt static unsigned long LetzterSchritt = 0; // Variable mit "static": Wert 0 wird nur beim ersten Durchlauf zugewiesen static boolean Status = false; // false ist gleichbedeutend mit 0 bzw LOW long MicrosProSchritt = 500000ul / abs(MotRechtsGeschwind); // Berechn der Zeit zwischen zwei Schritten (1/8 Schritten a 0,225°) //Serial.print ("MicrosProSchritt= "); //Serial.println (MicrosProSchritt); digitalWrite(MotRechtsD, MotRechtsGeschwind > 0 ? HIGH:LOW); // Anders als bei void MotLinks() hier HIGH:LOW, da Drehrichtung invers sein muss... // ...weil die Achse in entgegensetzte Richt zeigt if(micros() - LetzterSchritt > MicrosProSchritt) { // Wenn die Zeit ueberschritten ist erfolgt ein Wechsel des Status PORTD = PORTD | B00000100; // D2 und damit A4988-Eingang STEP auf HIGH setzen - ein 1/8 Schritt 0,225° wird ausgefuehrt // Portmanipulation mit bitweise ODER LetzterSchritt = micros(); // Variable wird wieder aktualisiert, fuer erneuten Vgl mit micros } }