Möchte mit dem Arduino ein Taktsigal für einen Schrittmotortreiber erzeugen.
Habe mal was versucht bin aber nicht so richtig Glücklich damit.
Gibt es noch eine andere möglichkeit sowas zu Schreiben?
for (int i=0; i<=5; i++) // Schleife wird 5 mal durchlaufen
{
digitalWrite(vorschub, HIGH); // Takt
delayMicroseconds(1000); // Zeit
digitalWrite(vorschub, LOW); // Takt
delayMicroseconds(1000); // Zeit
}
delay(30); // Pause
Danke euch schon mal.
Was ich noch Vergessen habe ist est möglich das anfahren und stoppen lagsamer auszuführen da die Masse die Bewegt wird sehr schwer ist.
-Schrittmotor 1.8° 8Nm mir 1 zu 2 Getriebe
-Leadshine M556 Treiber
Mit der Veränderung dieser 3 Variablen kannst Du, wie ich finde, sehr komfortabel herumspielen. Lade den Code auf Deinen Arduino und lass ihn laufen. Der Motor macht 1600 Steps in die eine Richtung, wartet 2 Sekunden, dann 1600 Steps in die andere Richtung. Die Anzahl der Motorsteps sollte natürlich größer als 2 x Rampenlaenge sein. Hier ist es größer als 600 Steps. Ansonsten die Rampenlaenge verkleinern.
Der Puls für den Motor ist PIN 4, die Richtung PIN 5. Ich verwende den Pololu Schrittmotortreiber A4988.
#include <math.h>
int Mot1Step = 4; //Mot1 Step
int Mot1Dir = 5; //Mot1 DIR
int PulseDelay = 80; //Delay HIGH/LOW Mikrosekunden
//-----------------------------------------
//##### Anfang lineare Rampe ####
float BeschleunigungsFaktor = 3;
float Highspeed = 600.0; //Mikrosekunden
float Rampenlaenge = 300.0; //Rampenlaenge Steps
float Beschleunigung = Highspeed * BeschleunigungsFaktor;
float RampenCoeff = float(Beschleunigung / Rampenlaenge); //Rampenkoeffizient
//##### Ende lineare Rampe ######
//-----------------------------------------
//###########################
void setup()
{
pinMode(Mot1Dir, OUTPUT); //Pin 5
pinMode(Mot1Step, OUTPUT); //Pin 4
}
//###########################
//###########################
void loop()
{
digitalWrite(Mot1Dir, HIGH); //Vorgabe Drehrichtung des Motors
FahrtXYZ(1600); // Fahrt hin
delay(2000);
digitalWrite(Mot1Dir, LOW); //Vorgabe Drehrichtung des Motors
FahrtXYZ(1600); //Fahrt zurueck
delay(2000);
}
//###########################
//###########################
void FahrtXYZ(int Steps)
{
//Echtzeit....................
int StepCount = 1; //Schrittzaehler
int Geschwindigkeit = 0;
int indexCoeffAnfahrt = 0;
int indexCoeffBremse = 0;
//Echtzeit....................
indexCoeffAnfahrt = int(Rampenlaenge);
indexCoeffBremse = 1;
while (StepCount <= Steps)
{
//Anfahren
if (StepCount <= int(Rampenlaenge))
{
Geschwindigkeit = Highspeed + round(indexCoeffAnfahrt * RampenCoeff);
indexCoeffAnfahrt--; //Pausenzeit von lang --> kurz
}
//Highspeed
if (StepCount > int(Rampenlaenge) && StepCount < Steps - int(Rampenlaenge))
{
Geschwindigkeit = Highspeed;
}
//Bremsen
if (StepCount > (Steps - int(Rampenlaenge)) && StepCount <= Steps)
{
Geschwindigkeit = Highspeed + round(indexCoeffBremse * RampenCoeff);
indexCoeffBremse++; //Pausenzeit von kurz --> lang
}
//Uebergabe der Geschwindigkeit an den Motor (PIN 4)
digitalWrite(Mot1Step, HIGH); //PIN on
delayMicroseconds(PulseDelay); //hier 80 Microsekunden s.o.
digitalWrite(Mot1Step, LOW); //PIN off
delayMicroseconds(Geschwindigkeit);
StepCount++;
}//Ende: while-Schleife
} //Ende: void FahrtXYZ(int Steps)
//###########################
In meinem Projekt AdeTeK kannst Du sehen, wie 3 Schrittmotoren parallel über die Rampen gesteuert werden.