PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schrittmotor läuft nur sehr sehr langsam



becherglas
27.03.2004, 22:09
Hallo,
ich habe mir mal zu Testzwecken auf Steckbrett einen L293D an einen Atmega16 angeschlossen, daran einen Schrittmotor aus dem tecshop:

http://www.w-r-e.de/shop/images/smo1.jpg

Der Motor funktioniert auch tatsächlich un dreht sich - einziges Problem: Das ganze funktioniert nur wenn ich die Abstände zwischen den Poländerungen rel. lang mache. Ich weis jetzt überhaupt nicht wieso dieses Problem auftritt bzw wo ich suchen muss ... vl ist es was triviales und ich bin einfach nur zu müde aber ich stehe im Moment einfach ziemlich im Wald.

So funktioniert der Motor:



#include <io.h>

unsigned int beats;
unsigned int counter;
unsigned int nop;

int main(void) {
outp(0xff, DDRA);
while(1)
{
outp(0x5,PORTA);
wait(40000);
outp(0x6,PORTA);
wait(40000);
outp(0xA,PORTA);
wait(40000);
outp(0x9,PORTA);
wait(40000);
}
}

void wait(beats) {
for(counter = 1;counter > beats;counter = counter + 1) {
nop++;
}
}

(Den n00b-haften Code bitte ich zu entschuldigen - bin in sachen C noch blutiger Anfänger)

Ändere ich die wait Attribute jedoch auf sagen wir 5000 oder so bewegt sich der Motor einfach nicht mehr. Ich habe auch leider kein Oszi da um ohne Motor die Ausgänge zu überprüfen aber irgendwie kann ich mir die Ursache dieses Fehlers nicht erklären.

Ich hoffe jemand kann mir helfen. Danke schonmal !

Mfg
Johannes

Kjion
27.03.2004, 23:37
Schau dir doch mal die erzeugte .lss Datei ( da steht der erzeugte Assemblercode drin ) an oder häng sie hier an. Es kann sein, dass GCC Warteschleifen wegoptimiert wenn sie "sinnlos" sind ;).
Eine Möglichkeit wäre die counter Variable als "volatile unsigned int counter;" zu deklarieren.

Meckert der Compiler eigentlich nicht, dass die Funktion "wait" nicht deklariert ist ??
Eigentlich gehört an den Anfang ein "void wait(unsigned int beats);" oder so was in der Art.

Noch ein paar allgemeine Anmerkungen:
Benutzt doch bitte:
#include <avr/io.h>
und zum Beispiel
PORTA = 0x50;

Die anderen Schreibweisen sind veraltet und werden irgendwann nicht mehr unterstüzt werden...

Und um noch was konstruktives beizutragen ;) :

#include <avr/io.h>

#define SYSCLK 4000000 // Taktfrequenz

void wait(unsigned int us);

int main(void)
{

DDRA = 0xff;

while(1)
{
PORTA = 0x05;
wait(100);
PORTA = 0x06;
wait(100);
PORTA = 0x0A;
wait(100);
PORTA = 0x09;
wait(100);
}
}

/* Wartet us µSekunden */
void wait(unsigned int us)
{
unsigned int zaehler;

while (us)
{
zaehler = SYSCLK / 5000000;
while (zaehler)
{
asm volatile ("nop");
zaehler--;
}
us--;
}
}

MfG Kjion

becherglas
28.03.2004, 00:56
Hey danke für die Unterstützung .. hat geklappt ;)

Danke & n8

hoer173
05.04.2004, 20:53
ich hab auch n problem mit schrittmotoren unzwar dieses:


der eine motor hat mehr kraft als der andere...

woran kann das liegen?

ich geh mit 9V und 3,5A auf die Motortreiber (motoren spannung)

es kommt von einer spannung aus also einem spannungsteiler.

ausserdem dreht sich der eine motor geschmeidiger als der andere.

selbst phase vertauschen bringt nix. wenn ich die motoren gegeinander tausche an dem stecker hat der der zuvor zuwenig hatte das was der andere hatte also ist so die kraft wieder auf dem motor aber nicht auch den anderen..

was ist falsch was kann sowas verursachen
?
der motor :

http://www.kemo-electronic.com/p5336_d.html

CastorTroy
08.04.2004, 10:19
Hallo Becherglas
ich bin ein absoluter Anfänger auf dem Gebiet, kannst du vielleicht mal deine Ansteuerschaltung ins Forum stellen?

MfG CastorTroy