/*Test Ansteuerung der Schrittmotor-Treiber A4988. Schrittmotor-Treiber-Modul mit A4988: auf 1/8 Schritt-Betrieb einstellen, an MS3 LOW und an MS1+MS2 HIGH. Am Potentiometer Einstellung Stromstaerke in den Wicklungen.*/ /* Pins am ESP8266 fuer Verbindung zu den Schrittmotor-Treibern: */ #define MotLinksD D6 // Drehrichtung Motor links von Pin D6 #define MotLinksS D5 // Schritt Motor links von Pin D5 #define MotRechtsD D0 // Drehrichtung Motor rechts von Pin D0 #define MotRechtsS D3 // Schritt Motor rechts von Pin D3 #define MotEN D4 // EN/ beide Motoren, aktiviert wenn LOW int MotLinksGeschwind = 200; // Schrittfrequenz in Schritten/Sek. Bei 200 ergibt sich... // ...1000000/200 = 5000 Mikrosek zwischen zwei 1/8 Schritten a 0,225 Grad = 0,125 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(MotEN, OUTPUT); digitalWrite(MotEN,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, sonst: digitalWrite(MotLinksS, LOW); // A4988-Eingang STEP auf LOW setzen, notwendig noch delay... delayMicroseconds(3); // ...weil der A4988-Eingang STEP eine min Impulslaenge 1 Mikrosek verlangt static long LetzterSchritt = 0; // Variable mit "static": Wert 0 wird nur beim ersten Durchlauf zugewiesen long MicrosProSchritt = 1000000 / abs(MotLinksGeschwind); // Berechn der Zeit zwischen zwei Schritten (1/8 Schritten 0,225 Grad) digitalWrite(MotLinksD, MotLinksGeschwind > 0 ? LOW : HIGH); // Richtungsangabe setzen, Ausgabe an Pin Motor1D // Ergebnis ist LOW, wenn Motor1Geschwind > 0 ist. Sonst HIGH. if(micros() - LetzterSchritt > MicrosProSchritt) { // Wenn die Zeit ueberschritten ist erfolgt ein Schritt digitalWrite(MotLinksS, HIGH); // A4988-Eingang STEP auf HIGH setzen, ein 1/8 Schritt 0,225 Grad wird ausgefuehrt 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, sonst: digitalWrite(MotRechtsS, LOW); // A4988-Eingang STEP auf LOW setzen, notwendig noch delay... delayMicroseconds(3); // ...weil der A4988-Eingang STEP eine min Impulslaenge 1 Mikrosek verlangt static long LetzterSchritt = 0; // Variable mit "static": Wert 0 wird nur beim ersten Durchlauf zugewiesen long MicrosProSchritt = 1000000 / abs(MotRechtsGeschwind); // Berechn der Zeit zwischen zwei Schritten (1/8 Schritten 0,225 Grad) digitalWrite(MotRechtsD, MotRechtsGeschwind > 0 ? LOW : HIGH); // Richtungsangabe setzen, Ausgabe an Pin Motor1D // Ergebnis ist LOW, wenn Motor1Geschwind > 0 ist. Sonst HIGH. if(micros() - LetzterSchritt > MicrosProSchritt) { // Wenn die Zeit ueberschritten ist erfolgt ein Schritt digitalWrite(MotRechtsS, HIGH); // A4988-Eingang STEP auf HIGH setzen, ein 1/8 Schritt 0,225 Grad wird ausgefuehrt LetzterSchritt = micros(); // Variable wird wieder aktualisiert, fuer erneuten Vgl mit micros } }