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: 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                                                         
   }
  }