Anzeige:

Schrittmotorsteuerung

Hier finden sie die archivierten Beiträge des alten PHPBB Forums von www.loetstelle.net

Schrittmotorsteuerung

Von fishkowhow am 03.10.2011 12:09

Heyy

Ich weis, sicherlich ist diese steuerung total kompliziert geschrieben, aber ch bin ein anfänger und wollte mich mal in der schrittmotoransteuerung probieren.

Ich habe es geschafft, dass der schrittmotor sich vorwärts und rückwärts dreht in bestimmten zeitabständen. Nun wollte ich auf einem tiny2313 die Funktion eines l297 nacharmen, aber irgendwie funkt es nicht, wie ich will!

Hat jemand tipps zu meinem programm?1]
#include <util/delay.h>
#include <stdlib.h>
#include <avr/io.h> //den librarys


int main (void){ //hier startet das Programm

//hier stehen befehle die nur einmal aufgeführt werden

DDRD |= _BV(PB2); //PB2 als output
DDRD |= _BV(PB3); //PB3 als output
//-> PB2 + PB3 bilden Phase 1
DDRD |= _BV(PB4); //PB4 als output
DDRD |= _BV(PB5); //PB5 als output
//-> PB4 + PB5 bilden Phase 2


uint8_t Taktung =0; //Input ->Taktung
uint8_t Richtung =0; //Input ->Richtung
uint8_t HalfFullstep =0; //Halb-Vollschrittjumper


PORTB |= (1<<PB2); //Standarteinschaltung
PORTB |= (1<<PB4); //Standarteinschaltung


while(1){ //hier startet die Endlosschleife

while(!bit_is_clear(PIND, PIND2))
{
Taktung = 1;
}

while(!bit_is_clear(PIND, PIND3))
{
Richtung = 0;
Richtung = 1;
}

while(!bit_is_clear(PIND, PIND4))
{
HalfFullstep =1;
HalfFullstep =0;
}
// Vollschritt vorwärts anfang
if ((Taktung == 1) && (Richtung ==1) && (HalfFullstep ==0) && (PINB & (1 << PB2)) && (PINB & (1 << PB4)))
{
PORTB |= (1<<PB2);
PORTB |= (1<<PB5);
}

if ((Taktung == 1) && (Richtung ==1) && (HalfFullstep ==0) && (PINB & (1<<PB2)) && (PINB & (1<<PB5)))
{
PORTB |= (1<<PB3);
PORTB |= (1<<PB5);
}

if ((Taktung == 1) && (Richtung ==1) && (HalfFullstep ==0) && (PINB & (1<<PB3)) && (PINB & (1<<PB5)))
{
PORTB |= (1<<PB3);
PORTB |= (1<<PB4);
}

if ((Taktung == 1) && (Richtung ==1) && (HalfFullstep ==0) && (PINB & (1<<PB3)) && (PINB & (1<<PB4)))
{
PORTB |= (1<<PB2);
PORTB |= (1<<PB4); //Vollschritt vorwärts ende
}



// Vollschritt rückwärts anfang
if ((Taktung == 1) && (Richtung ==0) && (HalfFullstep ==0) && (PINB & (1<<PB3)) && (PINB & (1<<PB4)))
{
PORTB |= (1<<PB3);
PORTB |= (1<<PB5);
}

if ((Taktung == 1) && (Richtung ==0) && (HalfFullstep ==0) && (PINB & (1<<PB3)) && (PINB & (1<<PB5)))
{
PORTB |= (1<<PB2);
PORTB |= (1<<PB5);
}

if ((Taktung == 1) && (Richtung ==0) && (HalfFullstep ==0) && (PINB & (1<<PB2)) && (PINB & (1<<PB5)))
{
PORTB |= (1<<PB2);
PORTB |= (1<<PB4);
}

if ((Taktung == 1) && (Richtung ==0) && (HalfFullstep ==0) && (PINB & (1<<PB2)) && (PINB & (1<<PB4)))
{
PORTB |= (1<<PB3);
PORTB |= (1<<PB4);
} //Vollschritt rückwärts ende





} //ende endlosschleife

return 0; //wird nie erreicht
} //ende Programm
1]

MfG
Michael

Von Sepp am 19.01.2012 20:09

Hallo,
mit _BV(PB2) setzt du PINS als eingang nicht als ausgang Wink

DDRC = 0xFF versuchs mal so deine Pins als ausgang zu setzen

Hier mal mein Code dazu:

Code:

DDRD |= _BV(PB2);                //PB2 als output
DDRD |= _BV(PB3);               //PB3 als output
//-> PB2 + PB3 bilden Phase 1
DDRD |= _BV(PB4);               //PB4 als output
DDRD |= _BV(PB5);               //PB5 als output


DDR steht für DataDirectionRegister das letzte D für Port D Wink

Zur erklärung:
0xFF steht für deine 8 Ports
F F = 1111 1111
von rechts nach links steht dein register nun auf eins um jetzt nur die 2 3 4 5 als output zu setzen machs so:
0001 1110 --> 0x1E
daraus folgt dieser Code

So wärs meiner Meinung nach besser
Code:

DDRB = 0x1E;                //PB2 als output
              //PB3 als output
              //-> PB2 + PB3 bilden Phase 1
              //PB4 als output
             //PB5 als output

Anzeige: