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