PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : L298N direkt am Microkontroller (Schrittmotor)



RobbyMartin
03.10.2014, 19:01
Hallo,

lange nicht mehr hier gewesen, aber jetzt habe ich ein Problem...

Ich habe einen L298N an einem MSP430 2553 von Texas Instruments angeschlossen.

So nun zum Problem:

Vorwärts drehen lassen kein Problem, doch wenn ich die Reihenfolge im Code drehe dann dreht er sich trotzdem in die selbe Richtung:confused:

Das klappt:


void vor(int schritte){ P1OUT |= (ENA);
P1OUT |= (ENB);
P1OUT |= (LED_r);


int i=0;


for(i=0;i<schritte;i++){
P1OUT |= (BIT1);
P1OUT &= ~(BIT2);
P1OUT |= (BIT3);
P1OUT &= ~(BIT4);
__delay_cycles(100000);
P1OUT |= (BIT1);
P1OUT &= ~(BIT2);
P1OUT &= ~(BIT3);
P1OUT |= (BIT4);
__delay_cycles(100000);
P1OUT &= ~(BIT1);
P1OUT |= (BIT2);
P1OUT &= ~(BIT3);
P1OUT |= (BIT4);
__delay_cycles(100000);
P1OUT &= ~(BIT1);
P1OUT |= (BIT2);
P1OUT |= (BIT3);
P1OUT &= ~(BIT4);
__delay_cycles(100000);
}


P1OUT &= ~(ENA);
P1OUT &= ~(ENB);
P1OUT &= ~(LED_r);
}

Warum dreht er hierbei nicht Rückwärts?:


void rueck(int schritte){ P1OUT |= (ENA);
P1OUT |= (ENB);
P1OUT |= (LED_g);


int j=0;


for(j=0;j<schritte;j++){
P1OUT &= ~(BIT1);
P1OUT |= (BIT2);
P1OUT |= (BIT3);
P1OUT &= ~(BIT4);
__delay_cycles(100000);
P1OUT &= ~(BIT1);
P1OUT |= (BIT2);
P1OUT &= ~(BIT3);
P1OUT |= (BIT4);
__delay_cycles(100000);
P1OUT |= (BIT1);
P1OUT &= ~(BIT2);
P1OUT &= ~(BIT3);
P1OUT |= (BIT4);
__delay_cycles(100000);
P1OUT |= (BIT1);
P1OUT &= ~(BIT2);
P1OUT |= (BIT3);
P1OUT &= ~(BIT4);
__delay_cycles(100000);


}


P1OUT &= ~(ENA);
P1OUT &= ~(ENB);
P1OUT &= ~(LED_g);
}

Ich hoffe Ihr könnt mir helfen :rolleyes:

Gruß
Martin

Che Guevara
03.10.2014, 23:15
Hi,

ich hab mir deine "Programme" jetzt nicht sehr detailiert angesehen (auch weil einige Sachen Fehlen, u.a. deklaration von BIT1/2/3/4), was mir aber auffällt:
- Du übergibst der Funktion eine Anzahl an Schritten, es werden aber immer 4x so viele gemacht.
- Um den Motor in die andere Richtung laufen zu lassen, reicht es, die (in deinem Fall) Vollschritte einfach rückwärts durchlaufen zu lassen.

Um wirklich die richtige Anzahl an Schritten zu fahren, könnte man eine Statemachine anwenden, das wäre hier eine elegante Lösung. Dann könntest du die Routine sogar in einer ISR ablaufen lassen und so währenddessen noch andere Sachen erledigen.
Wenn das dann noch mit Bitmasken der Steuerausgänge kombiniert wird, hat man eine (wie ich finde) sehr schöne Lösung. Außerdem wäre dann das ändern, sofern nötig, der Steuerausgänge bei einer neueren Version sehr schnell gelöst und man muss nicht lange im Code rumsuchen.

Gruß
Chris