sketch_84_schrittmotoren_test

sketch_84_schrittmotoren_test
  /*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                                                         
   }
  }