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.
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.