PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schrittmotor zuckt und blockiert



chaosmaker
28.05.2007, 20:44
Ich habe ein leichtes Problem mit meiner Schrittmotorsteuerung. Das Forum habe schon so gut es geht durchsucht, habe dabei auch vergleichbare Fehler gefunden. Aber die angebotenen Lösungen haben mir leider nicht geholfen.

Der Motor zuckt beim Einschalten kurz (er geht keinen kompletten Schritt, ich vermute er geht einfach in den nächsten "Haltezustand").
Danach blockiert er einfach und macht nichts mehr.

Die L298/L297-Motorhardware habe ich aus einem der Artikel der RN-Wiki nachgebaut.

Ich habe 3 verschiedene Motoren getestet, die aber alle das gleiche machen.

Als Controller nutze ich einen ATmega16 mit folgendem Code:


#define F_CPU 11059000 // Clock Speed

#include <avr/io.h>
#include <util/delay.h>

#define LED1_Pin1 6
#define LED1_Pin2 7
#define LED1_Pin1_Port PORTD
#define LED1_Pin2_Port PORTD

#define MOTOR_CcW 5
#define MOTOR_Clock 7
#define MOTOR_Enable 6
#define MOTOR_PORT PORTA

void Port_Init(void)
{
DDRA = 0b00000000;
DDRD = 0b11111100;
}

void LED1(char option) //Duo LED r/g
{
if(option == 'r')
{LED1_Pin1_Port |= (1 << LED1_Pin1); LED1_Pin2_Port &= ~(1 << LED1_Pin2);}
else if(option == 'g')
{LED1_Pin2_Port |= (1 << LED1_Pin2); LED1_Pin1_Port &= ~(1 << LED1_Pin1);}
else
{LED1_Pin1_Port |= (1 << LED1_Pin1); LED1_Pin2_Port |= (1 << LED1_Pin2);}
}

void DELAY(void)
{
int p;
for(p=0;p<=100;p++)
{
_delay_ms(10);
}
}

void pulseMOTOR(void)
{
LED1('r');
MOTOR_PORT |= (1 << MOTOR_Clock);
DELAY();

MOTOR_PORT &= ~(1 << MOTOR_Clock);
LED1('g');
DELAY();
}

int main(void)
{
Port_Init();
LED1('g');

MOTOR_PORT |= (1 << MOTOR_CcW);
MOTOR_PORT &= ~(1 << MOTOR_Enable);

while(1)
{
pulseMOTOR();

DELAY();
}
}

Da ich mich erst seit kurzem mit AVRs und C befasse, vermute ich den Fehler im Code.

CsT
28.05.2007, 20:52
DDRA = 0b00000000;

Dort wird Port A als Eingang gekennzeichnet .. soweit ich das sehe, hängt da aber dein Motor dran und sollte deshalb auf Ausgang stehen ..

Weiterhin solltest du mit deinem DELAY spielen .. der erscheint mir ein bisschen sehr lang.

Viele Grüße
CsT

chaosmaker
28.05.2007, 21:25
Stimmt! Habe das nun geändert und es tut sich leider jetzt gar nichts mehr der Motor zuckt anfangs nichtmals.

Das Delay hatte ich so extrem lang gemacht um besser per LED sehen zu können was passiert.

hier der aktuelle Code:

#define F_CPU 11059000 // Clock Speed

#include <avr/io.h>
#include <util/delay.h>

#define LED1_Pin1 6
#define LED1_Pin2 7
#define LED1_Pin1_Port PORTD
#define LED1_Pin2_Port PORTD

#define MOTOR_CcW 5
#define MOTOR_Clock 7
#define MOTOR_Enable 6
#define MOTOR_PORT PORTA

void Port_Init(void)
{
DDRA = 0b11111111;
DDRD = 0b11111100;
}

void LED1(char option) //Duo LED r/g
{
if(option == 'r')
{LED1_Pin1_Port |= (1 << LED1_Pin1); LED1_Pin2_Port &= ~(1 << LED1_Pin2);}
else if(option == 'g')
{LED1_Pin2_Port |= (1 << LED1_Pin2); LED1_Pin1_Port &= ~(1 << LED1_Pin1);}
else
{LED1_Pin1_Port |= (1 << LED1_Pin1); LED1_Pin2_Port |= (1 << LED1_Pin2);}
}

void DELAY(int w)
{
int p;
for(p=0;p<=w;p++)
{
_delay_ms(10);
}
}

void pulseMOTOR(void)
{
LED1('r');
MOTOR_PORT |= (1 << MOTOR_Clock);
DELAY(1);

MOTOR_PORT &= ~(1 << MOTOR_Clock);
LED1('g');
DELAY(1);
} --- Hauptprogramm ---

int main(void)
{
Port_Init();

LED1('g');

MOTOR_PORT |= (1 << MOTOR_CcW);
MOTOR_PORT &= ~(1 << MOTOR_Enable);


while(1)
{
pulseMOTOR();

DELAY(100);
}
}

CsT
28.05.2007, 23:14
MOTOR_PORT &= ~(1 << MOTOR_Enable);

Dort legst du doch den Anschluss auf Masse, oder? Somit gibts keine Motorspannung und damit keine Motorumdrehungen .. also probiers mal mit:

MOTOR_PORT |= (1 << MOTOR_Enable);
Ansonsten sieht das Programm jetzt meiner Meinung nach i.O. aus.

Viele Grüße
CsT

PS: Sei vorsichtig, manche Motoren sind nicht für Dauerbetrieb ausgelegt und fressen viel Leistung und werden damit schnell (zu) warm .. also immer eine Hand an der Stromzufuhr haben .. (eigene Erfahrung .. :( )

chaosmaker
28.05.2007, 23:26
Super! Besten Dank!

Hätte ich aber selber drauf kommen sollen. Nun funktioniert alles fehlerfrei!

CsT
29.05.2007, 11:21
Kein Problem .. manchmal liest man sich halt blind durch seine Programme, geht mir öfter mal genauso .. :)
Schön, dass es funktioniert.

Viele Grüße
CsT

zumgwadrad
29.05.2007, 13:34
Hi,
noch kurz zum Zucken beim Einschalten, der Motortreiber setzt beim Einschalten oder nach Unterspannung den Motor in die sogenannte "Home Microstep Position".
Das muss er tun, da die Schrittmotorbewegung durch eine bestimmte Stromlaufreihenfolge der 2 phasen erzeugt wird. Da der Treiber ja diese Reihenfolge irgendwo anfangen muss, beginnt er beim einschalten meist mit beide Phasen positiv. Da nun der Schrittmotor aber nicht zwingend in der dieser bestromung entsprechenden Position stehen muss, zu Beginn. Springt der Motor eben beim einschalten in diese Position.
Viel Spass noch