Forum: Mikrocontroller und Digitale Elektronik A4988 maximale drehzahl & beschleunigung


von jeff o. (Firma: none) (pongo)


Lesenswert?

hi Leute,

Ich hab jetzt endlich einen Treiber bekommen und hab meine MOtoren jetzt 
auch etwas schneller am laufen wie bisher.

ich hab mir hier einen code gebastelt der den Motor eigentlich 
beschleunigen sollte um zu testen wie schnell ich maximal drehen kann. 
Aber igendwie versteh ich das ganze nicht. hier mal der code:

1
#define stepPin 3
2
#define dirPin 9
3
#define enablePin 4
4
void setup()
5
{
6
  pinMode(enablePin, OUTPUT);
7
  digitalWrite(enablePin, LOW);
8
  digitalWrite(enablePin, HIGH);
9
  pinMode(stepPin, OUTPUT);
10
  pinMode(dirPin, OUTPUT);
11
}
12
13
void loop()
14
{
15
  unsigned long mydelay = 1e6; //This schoul be 1 second right????
16
  unsigned long orgmydelay = mydelay;
17
  digitalWrite(enablePin, LOW);
18
  delayMicroseconds(20);
19
  
20
  while(1)
21
  {
22
    digitalWrite(dirPin, HIGH);
23
    digitalWrite(stepPin, LOW);
24
    delayMicroseconds(mydelay);
25
    digitalWrite(stepPin, HIGH);
26
    delayMicroseconds(mydelay);
27
    
28
    if ( mydelay> orgmydelay-10000)
29
    {
30
      mydelay -=10; 
31
   
32
    }
33
  } 
34
}


ich denke der sollte selbsterklären sein.
my delay setz ich am anfang so hoch um ihn ganz langsam anzufahren aber 
bei dieser hat er schon ne geschwindigkeit von um die 200 U/min.
bei allen anderen anfangswerten von mydelay macht der Motor einige 
schritte und dann eine pasue die ich nicht versteh. also 
brrrrrr,Pause(1/1s) brrrr...


hier noch die eckdaten:

motor:
http://www.sorotec.de/shop/product_info.php/info/p2599_schrittmotor-4-2a-bipolar---3nm-ds.html

Spannung: ca.24 V
Ampere begrenzung: keine da der A4988 max 2 ausgibt und ich hab den 
motor so geschaltet dass ich 2.12A brauche.
chip belegung: MS1,MS2,MS3 sind auf masse gelegt und die SLEEP und RESET 
hängen aneinander. der rest ist versorgungsspannung, motorausgänge und 
step, dir die im code erwähnt sind.

wo mach ich meinen fehler?? hab schon gedacht ich sachies über den 
wertebereich von unsigned int hinaus aber kleiner machen funktionniert 
auch nicht...

please help

thx Pongo

von gatsby (Gast)


Lesenswert?

Hallo Pongo,

die folgende Zeile funktioniert nicht
    delayMicroseconds(mydelay);

Der Übergabe parameter muss ein unsigned int Wert sein, d.h. es darf 
keine Variable sein, sondern muss ein fester Zahlenwert.

mfg
gatsby

von jeff o. (Firma: none) (pongo)


Lesenswert?

servus gatsby,

danke fÜr die antwort.

d.h ich kann die geschwindigkeit so nicht anpassen.

das ganze soll eine cnc maschine werden also 3 motoren. und ich wollte 
so auch die geschwindigkeit bestimmen, was ist ne alternative??

nur dass ich dich richtig versteh:

unsigned int i = 20;
delayMicroseconds(i); // wird nicht funktionnieren
delayMicroseconds(20);// funktionniert

von spess53 (Gast)


Lesenswert?

Hi

>was ist ne alternative??

Timer.

MfG Spess

von gatsby (Gast)


Lesenswert?

Hallo Pongo,

das hier sollte funktionieren

  for (int i=0; i < mydelay; i++){
     delayMicroseconds(20);
  }

Nicht schön, aber zum testen kann man's mal machen.

mfg
gatsby

von R. W. (quakeman)


Lesenswert?

Welchen Controller, oder besser, welche Controller Familie benutzt du 
eigentlich (hast du nirgendwo erwähnt)?

Woher stammen deine Methoden PinMode(), digitalWrite(), 
delayMicroseconds(), da ich keine Definition oder Include irgendwo sehe?
Am besten wäre, wenn du den gesamten Code mal mit anhängen würdest.

Und ein Schaltplan wäre auch nicht verkehrt um zu helfen.

Ciao,
     Rainer

von spess53 (Gast)


Lesenswert?

Hi

>Woher stammen deine Methoden PinMode(), digitalWrite(),...

Das ist hier die Fortsetzung von:

Beitrag "arduino L298 stepper beschleunigen"

MfG Spess

von jeff o. (Firma: none) (pongo)


Lesenswert?

ich benutze einen arduino uno

@ gatby:
das hier sollte funktionieren

  for (int i=0; i < mydelay; i++){
     delayMicroseconds(20);
  }
Nicht schön, aber zum testen kann man's mal machen.

so verändert er die geschwindigkeit aber nicht.

Das problem ist ja dass ich nicht zu schnell losfahren kann sonst 
vibriert er nur

von gatsby (Gast)


Lesenswert?

Hallo Pongo,

also wenn du in deinem Programm dort wo
   delayMicroseconds(mydelay);

die Zeilen
  for (int i=0; i < mydelay; i++){
     delayMicroseconds(20);
  }

einfügst, dann bekommst du dort variable Wartezeiten in 20usec 
Rasterung.

Ach ja, dann noch folgendes. Das ist unnötig, kostet RAM und Zeit
  unsigned long mydelay = 1e6;
  unsigned long orgmydelay = mydelay;

Das Folgende reicht aus
  unsigned int mydelay = 1e6;
  unsigned int orgmydelay = mydelay;

Ich empfehle, diese Zeile
    digitalWrite(dirPin, HIGH);

aus der while(1) Schleife herauszunehmen und vor die while(1) Schleife 
zu ziehen. Der Ausgangspin ist somit bestimmt und braucht nicht ständig 
beackert zu werden.


mfg
gatsby

von jeff o. (Firma: none) (pongo)


Lesenswert?

hi, super danke für die antwort,

ich versteh nur deine aussage "  dann bekommst du dort variable 
Wartezeiten in 20usec
Rasterung." nicht richtig.

er wartet da immer 20e-6 sekunden

ich werd mal hiermit probieren und berichten wies funktionniert
http://www.pjrc.com/teensy/td_libs_AccelStepper.html

danke für den hinweis mit dem while, das ist echt etwas unnötig

von Heinervdm (Gast)


Lesenswert?

Hallo Pongo,
ich habe mehrere dieser Treiber und kenne das Phenomen, dass der Motor 
ständig pausen einlegt. Bei mir lag dass daran, dass der Treiber 
schlicht zu heiß geworden ist und dann die Temperaturabschaltung des 
Chips diesen ausgeschaltet hat, bis er wieder kalt genug war und dann 
wieder von vorne...

Mach einfach mal einen Kühlkörper auf den Chip und es sollte wesentlich 
besser laufen.

von gatsby (Gast)


Lesenswert?

Hallo Pongo,

vor dem Befehl
    delayMicroseconds(20);

steht doch noch
  for (int i=0; i < mydelay; i++){
     delayMicroseconds(20);
  }

Das ist doch eine for-Schleife die i-mal hintereinander durchlaufen wird 
und jedesmal 20usek wartet.
Und wie oft wird sie durchlaufen?
Sooft bis der Wert von mydelay erreicht wurde. Da sich mydelay nun aber 
ändern kann, es ist ja schliesslich eine Variable, so erhälst du 
variable Wartezeiten und somit variable Low und High Signale an deinem 
Ausgang.

Nun alles klar?

Wenn nicht, probier es doch einfach mal aus bevor wir hier noch lange 
weiterdiskutieren.

mfg
gatsby

von spess53 (Gast)


Lesenswert?

Hi

Hört doch mit den delayMicroseconds auf. Das soll (in ferner Zukunft) 
etwas mit 3 Motoren in Richtung CNC werden. Und da sind Delays das 
letzte, was man braucht.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.