PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfängerfrage L298 L297 ATmega8



kaufparkangucker
16.09.2009, 19:54
Hallo,

ich bin Einsteiger im Elektronikbereich und versuche mich da langsam weiter vor zu Tasten.
Derzeit bastel ich an einem Steppermotor der über die bekannte L298-L297 Kombi angesteuert wird.
Der Motor soll sich 100 Schritte in die eine und dann 100 Schritte in die andere Richtung bewegen.
Jetzt benötigt Clock je ein negatives Signal damit der Motor einen Schritt macht - aus dem Atmega8 kann ich aber nur positive Signale abgreifen - muss ich das jetzt umständlich invertieren?

Da giebt es doch bestimmt eine Lösung wie man einen AVR mit dieser Treiberkombination verbindet - leider finde ich nichts passendes.

Vielen Dank für Eure Hilfe.

fg Rocco

Michael
16.09.2009, 20:18
Hallo kaufparkangucker,

der L297 braucht keine negativen Signale, vielleicht verwechselst du das mit fallenden Flanken.
AVR und L297 arbeiten mit positiven Signalen wunderbar zusammen ;)

Gruß, Michael

kaufparkangucker
17.09.2009, 09:01
Hallo Michael,
ja stimmt, Du hast recht.

Vieleicht kann mir nochmal jemand helfen.
Programmieren möchte ich gern mit C und mit dem AVR Studio. Das klappt auch so weit. kann den Motor auch schon bewegen.
Allerdings kapiere ich nicht wie man eine Schleife schreibt die den Motor sagen wir 100 Schritte in die eine und dann 100 Schritte in die andere Richtung drehen lässt.
Clock hängt bei mir an Port B0 vom Atmel
und CW/CCW würde ich gern an Port B2 hängen.

Bitte habt verständniss, auch im Programmieren bin ich noch ein Anfänger.

Mein zusammengeschusterter Ansatz sieht z.Z. so aus:

/* Standard Includes */
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 1000000UL
#include <util/delay.h>

/* Pin defs für Atmega */

#define Draht1 _BV(PB0) //hier CLOCK dran hängen
#define Draht2 _BV(PB1) //unbelegt!!! verhilft nur Draht1 zu einer Pause
#define Draht3 _BV(PB2) //hier CW / CCW dran hängen
#define Draht4 _BV(PB3) //mal sehen wofür der noch gebraucht wird

int main(void){

const uint8_t delay = 1; // Taktrate am CLOCK Pin bzw an Draht1


DDRB = 0xff; /* alle B Port Pins sind Outputs */
PORTB = 0x00; /* fangen alle bei 0V an */

for (int i=0;i<100;i++){ /* Schleife lässt Draht1 und 2abwechselnd 100 mal "blinken" */
PORTB = Draht1;
_delay_ms(delay);

PORTB = Draht2;
_delay_ms(delay);

// PORTB = RED;
//_delay_ms(delay);

//PORTB = YELLOW;
//_delay_ms(delay);

}
PORTB = 0x00; /*Endwert alle Pins von Port B auf 0V*/
return 0;
}

cmock
17.09.2009, 09:21
du solltest mit den einzelnen bits im port wackeln; so wie gezeigt schaltest du ja nur zwischen PB0 und PB1 um.


PORTB |= Draht1; // Draht1 einschalten
PORTB &= ~Draht1; // Draht1 ausschalten

dann kannst du nämlich mit


PORTB |= Draht3; // drehrichtung CCW

die drehrichtung umschalten und mit dem obigen die pulse generieren, ohne daß dein drehrichtungsport sich ändert.

nebenbei: es ist üblich, makros komplett in großbuchstaben zu schreiben. und es wird übersichtlicher, wenn du die die dinger gleich nach ihrer funktion benennnst:


#define CLOCK _BV(PB0)
#define RICHTUNG _BV(PB2)

cm.

kaufparkangucker
17.09.2009, 09:45
Hallo cmock,

danke für die schnelle Hilfe.
Werde ich gleich mal probieren.

fg Rocco