-
Schrittmotor-Problem..!
hallo,
ich versuche einen Schrittmotor anzusteuern, aber er macht leider nur komische Halbdrehungen, woran kann das denn liegen?
Das wichtige Teil des Codes:
Code:
#define F_CPU 8000000
#include <avr/io.h>
#include <stdio.h>
#include <stdbool.h>
#include<util/delay.h>
uint8_t step[6] = {0xE6, 0xBC, 0xE8, 0xBA, 0xBC, 0xE8};
void rotate(direction)
{
int i;
if(direction)
{
PORTD |= 0x80 ;//LED1 geht an
//PORTA = 0x82;
//PORTA = 0x84;
for(i=0;i<6;i++)
{
_delay_ms(250);
PORTA = step[i];
};
}
else
{
PORTD |= 0x20;//LED2 geht an
}
}
P.S: - Die 250ms habe ich nur so da eingefügt, da ich nicht weiss, wie ich diese Zeit berechnen kann.
- ich benutze TCA3727G als Motortreiber.
Danke.
-
hier zumindest mal das datenblatt (braucht n paar sekündchen zum laden:
http://pdf1.alldatasheet.co.kr/datas.../TCA3727G.html
da is auch ne anschlussbelegung dabei.
könnte es sein, dass du eine spule deines schrittmotors ausversehen an den falschen anschluss gesetzt hast, oder so....
-
Danke A|KI!
Das Datenblatt habe ich auch sorgfältig gelesen, und die Anschlussbelegung habe ich mit Multimeter Überprüft das ist Einwandfrei!
Ich glaube aber das es an der Delay Funktion liegt
Der Schrittmotor bekommt Die Kommandos zu schnell von dem Prozessor aber diese Verzögerungszeit kann ich leider nicht berechnen, hast du vielleicht eine Idee?
-
mit prozessor proggen hab ich noch keine ahnung, aber der wird doch au irgendwo n schwingkreis (oszilator?) haben, welcher ihn taktet. vlt den mal etwas "abändern", also nen gröseren kondensator reinhaun, wenn der auserhalb liegt.
ansonsten erkundig dich mal nach dem sleep-teil (_delay_ms_ oder was das ist) ob der richtig ist. ansonsten, dieses
for(i=0;i<6;i++)
ist doch irgendwie quatsch, oder? damit machst du aus i irgendwie immer 1, und dann wieder null nach dem durchlaufen der schleife, und bevor sie wieder gestartet wird, wieder 1. zumindest wärs in C++ so, oder der compiler regt sich auf...
schau mal, wie es mit dem wär:
Code:
...
int i=0 ... ; //sollte glaub auserhalb der funktionen sein :-)
void rotate(direction)
{
...
while(i<6)
{
PORTA =step[i];
_delay_ms(1000);
i++;
}
}
zumindest kenn ichs so mit C++ progs
(evtl das while durch for ersetzen)
-
step[i] ist ein array(Platzhalter) und wenn i durch 0 ersetzt ist ,heisst nicht dass step[0]=0
sondern der inhalt von Platzhalter step[0] ,also in meinem Programm 0xE6
-
ok, und wenn du i um 1 erhöhst, dann rufst du quasi den inhalt vom nächsten platz auf?
wenn ja, dann rufst du doch irgendwie immer das ausm platz i auf, oder blick ichs grad net?
-
genau, und so soll es auch sein.
-
lol, warum so umständlich?
wenn du doch immer dasselbe aufrufst, da i ja irgendwie immer 1 ist, warum machst du dann sowas in der art von
Code:
mach aus i (wieder) 0; // i=0
zähle zu i 1 dazu; // jetzt ist i=1
rufe i auf;
warte Xms;
und wieder von vorn;
geht doch einfach so:
Code:
rufe i auf;
warte Xms;
wieder von vorn;
was du machen wolltest, war wohl sowas:
Code:
while(true)
{
if (i<6) //du hast 5 schritte? oder nur die 4 schritte 1-5?
{
führe den ablauf von i aus;
warte Xms;
i++;
}
// wenn das ganze ne endlosschleife werden soll, dann noch:
if (i=6)
{
i=0 // oder 1, wenn du nur die schritte 1-5 hast
}
}
-
die i ist doch nicht immer 1,die i kann Werte von 0 bis 5 annehmen je nachdem welche Array wir benutzen.
-
ja, aber i ist doch so, wie ich deine funktion da oben verstehe, immer 1, da du aus i nach dem durchlaufen wieder 0 und gleich darauf wieder 1 machst. es ist doch nach deiner formel egal, was i nach dem durchlaufen der for() bedingung ist, denn du machst ja daraus wieder 1.
guck dir nochmal die codes an, die ich da oben geschrieben hab. wenn ich da irgendwas falsch verstehe, sags mir.
du willst ja nach und nach i als:
0; 1; 2; 3; 4; 5; 1; 2; 3; 4; 5; 1; 2; undsoweiter
haben
nurist i bei dir, so wie ich deinen code oben verstehe
0; 1; [wird ausgeführt]; 0; 1; [wird ausgeführt]; 0; 1; undsoweiter
das 0; 1; passiert in der for()-funktion