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
voidsetup()
5
{
6
pinMode(enablePin,OUTPUT);
7
digitalWrite(enablePin,LOW);
8
digitalWrite(enablePin,HIGH);
9
pinMode(stepPin,OUTPUT);
10
pinMode(dirPin,OUTPUT);
11
}
12
13
voidloop()
14
{
15
unsignedlongmydelay=1e6;//This schoul be 1 second right????
16
unsignedlongorgmydelay=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
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
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
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
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
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
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
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
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.
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
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