-         

Ergebnis 1 bis 7 von 7

Thema: Schrittmotor zuckt und blockiert

  1. #1

    Schrittmotor zuckt und blockiert

    Anzeige

    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:

    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.

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    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

  3. #3
    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:
    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);
    	}
    }

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    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 .. )

  5. #5
    Super! Besten Dank!

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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    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

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    10.07.2004
    Ort
    Nürnberg
    Alter
    36
    Beiträge
    186
    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
    Ich bin keine Signatur ich mach hier nur sauber

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •