Schrittmotor ohne delay

Janfly

Neues Mitglied
12. Feb. 2009
3
0
0
Sprachen
Hallo zusammen,

ich bin eigentlich Bauingenieur aber habe trotzdem interresse für kleine Stromtierchen die Digital durch mein Atmeg8L sausen.

Ich habe gleich eine Frage:

Ich möchte einen kleinen Schrittmotor ansteuern.
In dem Programm habe ich eine Variable s die mit einem delay-takt hochzählt.
Diesen möchte ich durch einen Time/Counter oder PWM ersetzen, damit gleichzeitig ein Schalter/Sensor/Poti abgefragt werden kann.

Hier die Daten:
WinAVR-20080610
Programiersprache: C (aboluter Anfänger)
Microcontroller: Atmega8L
Brenner: myAVR
_________________________________________________________
# include <avr/io.h>
# include <avr/iom8.h>
# include <util/delay.h>

int main (void) {

unsigned int s, s1, s2, s3, s4, U;


U = 10;
s = 0;
s1 = U;
s2 = s1+U;
s3 = s2+U;
s4 = s3+U;


DDRC |= ((1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3));

// Datenrichtung Register C => Ausgang für PIN 0 bis 3 (LED) "|=" entspr. 1



while (1){


// ---------------------Taktvorgabe-----------------------------------------

for (s=1;;s++){
// geht das auch mit PWM
_delay_ms(100); // oder Time Counter ???


//----------------------Bipolar Vollschritt---------------------------------

if ( s <= s1){
PORTC |= ((1<<PC0) | (1<<PC2));
PORTC &= ~((1<<PC1) | (1<<PC3));
}

else if (s > s1 && s <= s2){
PORTC |= ((1<<PC1) | (1<<PC2));
PORTC &= ~((1<<PC0) | (1<<PC3));
}

else if ( s > s2 && s <= s3){
PORTC |= ((1<<PC1) | (1<<PC3));
PORTC &= ~((1<<PC0) | (1<<PC2));
}

else if ( s > s3 && s <= s4){
PORTC |= ((1<<PC0) | (1<<PC3));
PORTC &= ~((1<<PC1) | (1<<PC2));
}

else if ( s > s4){
s = 0;
}
}


}
}


Schöne Grüße aus Hildesheim
Jan
 
Hallo
Mit welcher Leistungsstufe treibst du den Schrittmotor?
evtl hilft diese seite: http://www.roboternetz.de/wissen/index.php/Schrittmotor
wenn du den die dort empfohlene kombi aus L298 und L297 verwendest,
dann entfällt das ganze gezetere weiter unten im code
du kannst das zählen ohne probleme in einen Timer auslager und dann per overflow interrupt ne variable hochzählen lassen. genaueres entnimmst du am besten dem tutotial von microcontroller.net
 
Kleine Schritte mit dem Schrittmotor in C

Hallo TSE,

zur Zeit treibe ich keinen Schrittmotor an. Ich habe mir eine Platine mit vier roten und vier grünen LED's zusammengelötet, die mir die Polrichtung eines Schrittmotors simmulieren.
Erst wenn das Programm funktioniert gehts an die Hardware.

Im AVR-Praxisforum wurde als Treiber der L293D vorgeschlagen, da dieser schon Dioden gegen induktion aus dem Schrittmotor enthält.

Brauche ich dann nur ein IC?

In meinem Programm habe ich zusätzlich eine Variable U. Mit dieser möchte ich unabhängig vom Vorteiler die Drehzehl bestimmen.

Außerdem habe ich bis hier C verstanden. Die vielen Register machen mich fertig.

Aber ich gebe nicht auf.

Gruß
Jan
 
Schrittmotor in c

Hallo Kani,

mit dem Register

TCCR0 |= (1<<CS00)|(1<<CS02);
TIFR |= (1<<TOV0);

wird mir ein Bit zwischen 255 und 0 gesetzt.
Also muß ich das Bit beim Hochzählen irgendwann 0 setzen, damit ich einen Takt bekomme.

Gibt es ein Register welches mir ein Bit anbietet das zwischen 0 und 1 wechselt.

Wie kann ich das Bit an meiner Variablen s dazu addieren?

Gruß
Jan
 
Mit
TCCR0 |= (1<<CS00)|(1<<CS02);
sagst du dem Timer, dass er bei jeder fallenden Flanke an TO einen hochzählen soll.
Mit TIFR |= (1<<TOV0); stellst du dein, dass wenn der Timer überläuft, daher von 255 zu 0, das Bit TOV0 gesetzt also logisch 1 ist.

Soviel dazu. Wenn es nicht richtig ist bitte korrigieren, bin auch noch Anfänger.

Was hast du jetzt genau vor?
Gibt es ein Register welches mir ein Bit anbietet das zwischen 0 und 1 wechselt.
Wann soll es denn wechseln?
 
Soviel dazu. Wenn es nicht richtig ist bitte korrigieren, bin auch noch Anfänger.
Aber gerne.:)

Mit
TCCR0 |= (1<<CS00)|(1<<CS02);
sagst du dem Timer, dass er bei jeder fallenden Flanke an TO einen hochzählen soll.
Ist leider Controllerabhängig, es kann genausogut auch der Systemtakt geteilt durch 1024 sein.

Mit TIFR |= (1<<TOV0); stellst du dein, dass wenn der Timer überläuft, daher von 255 zu 0, das Bit TOV0 gesetzt also logisch 1 ist.
Knapp daneben.
Das TOV0(Timer Overflow Flag) Bit im TIFR(Timer Interrupt Flag Register) ist ein Flag(Bit) das vom TimerCounter immer auf High(1) gesetzt wird wenn, wie Kani schon schreibt, der Zählwert von 255 auf 0 kippt(mit 8Bit lässt sich eben nicht weiter zählen). Das Bit bleibt danach solange auf High(1) bis ein Timer Overflow-Interrupt, welchen man aber vorher konfigurieren muss, ausgelöst wird oder es vom Programm auf High(1) gesetzt wir. Ja genau richtig verstanden: Um das TOV0-Bit von HIGH auf LOW zu setzen muss man es auf High setzen, und das macht eben diese besagte Zeile.
 
Im Manual steht's noch ausführlicher:
Zusammenfassung:

Bei allen AVRs so ziemlich gleich:
TCNT Timer-Counter-Register:
Der eigentliche Zähler.

TCCR1x:
Timer Counter Control Register:
Hier stellt man ein, was der Zähler überhaupt machen soll.
Aufwärtsztählen Abwärtzszählen.
ETC.


Dann die Pufferregister für Vergleichsoperationen:

Also Zähler zählt hoch bis zum Erreichen des Vergleichsregisterwertes in

OCCR1n


Zähler kann auch selbständig auf- und abwärtszählen.

Dazu muß im Controlregister der WAVE Genarating Mode

mit WGM02 und WGM 01 bei dem einen 1A-Register bei dem zweiten 1B nur 01 gesetzt werden.

Dann hat man schon in etwa den gewünschten Pulsweiten-Modus zur Ansteuerung von Schritt-Motoren.

Wie gesagt, Seite 53 ff im Manual sind da wärmstens empfohlen.


Gruß von Oskar01
 
Hallo,

Im AVR-Praxisforum wurde als Treiber der L293D vorgeschlagen, da dieser schon Dioden gegen induktion aus dem Schrittmotor enthält.

wenn du den die dort empfohlene kombi aus L298 und L297 verwendest,
dann entfällt das ganze gezetere weiter unten im code

Die Kombination L297/L298 hat auch noch den Vorteil, das man Voll-/Halbschritt-
Betrieb einfach umschalten kann, das sich die Teile um die Stromsteuerung
selber kümmern usw. Man kann sich also einfach auf das Impulse geben und
Rampe erzeugen konzentrieren. Der L293D ist glaube ich eher ne kleinere
Version des Brückentreibers L298 und ohne Stromsteuerung.

Sieh dir mal die Datenblätter der 3 ICs an. Das ist bestimmt interessant.

Der Einfachheit halber hier die Datenblätter ...
Anhang anzeigen L293D_PushPull-4Ch-Driver.pdf
Anhang anzeigen L297_StepperMotorController.pdf
Anhang anzeigen L298_DualFullBridgeDriver.pdf

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)