Go Down

Topic: Taktsignal für Schrittmotortreiber (Read 859 times) previous topic - next topic

Kreidler

Mar 19, 2013, 06:09 pm Last Edit: Mar 19, 2013, 08:54 pm by uwefed Reason: 1
Wünsche euch einen schönen Tag.

Habe folgende Frage:

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?

Code: [Select]
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

pylon

Hast Du zu Deinem Treiben ein Datenblatt?

Du könntest einen PWM-Ausgang nehmen und den Timer entsprechend programmieren. Ist denn eine Frequenz von 500Hz angestrebt?

uwefed

Als Taktgenerator kannst Du millis() verwenden.
Siehe blink without delay(); http://playground.arduino.cc/Learning/BlinkWithoutDelay_de

Die meisten Treiber brauchen kein symetrisches Taktsignal sondern eines mit einer minimalen H-Zeit. es müßte ein
Code: [Select]
H
delaymicros(5);
L

genügen.

Mit einen Timer kann man auch eine Rechtecksignal mit verschiedenes Frequenz an einem Ausgang erzeugen.

Zum Anlaufen eine Rampe definieren und die werte nacheinander aufrufen.

Grüße Uwe

Kreidler

Also ich danke euch schon mal.

Ich habe mal in der Anleitung des Treibers nachgesehen und da steht dass das 5v sowie 0v Sigal nicht kleiner als 2,5?s sein soll.

Mein ziel ist es ja einfach zu sagen das ich z.b 80 a 1.8° machen will.

Wie könnte ich das den mit dem Rampe am besten definieren???

schönen Abend euch noch.

Gruß Stephan

uwefed

#4
Mar 19, 2013, 10:26 pm Last Edit: Mar 20, 2013, 09:16 am by uwefed Reason: 1
Es gibt die Stepper- Bibliothek
http://arduino.cc/en/Reference/Stepper

oder eine andere mit Rampen-Funktion:
http://interface.khm.de/index.php/lab-log/arduino-stepperlab3-motor-library/

Grüße Uwe

Piccus

Hallo Kreidler,

das mit den Rampen habe ich folgendermaßen gelöst:
Es gibt 3 Variablen, mit denen ich die Anfahrt- und Bremsrampe bediene (s. Code).

float BeschleunigungsFaktor = 3;
float Highspeed = 600.0; //Mikrosekunden
float Rampenlaenge = 300.0; //Rampenlaenge Steps

Daraus ergeben sich:
float Beschleunigung = Highspeed * BeschleunigungsFaktor;
float RampenCoeff = float(Beschleunigung / Rampenlaenge); //Rampenkoeffizient

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.

Code: [Select]
#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.

http://www.youtube.com/watch?v=CX_fx0mjpUI

Viele Grüße
Peter

Go Up