www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Simple Schrittmotor-Ansteuerung


Autor: JK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute!

Ich habe vor, mit meinem ATmega8515 einen Schrittmotor anzusteuern, 
allerdings mit einer einfachen Transistorschaltung: ich gehe vom Portbin 
meines Atmega8515 auf die Basis des Transistors, am Emitter hängt die 
jeweilige Leitung(1,2,3,4) des Schrittmotors).

Ich habe vorher noch nie etwas mit Schrittmotoren gebaut und möchte eine 
Bestätigung von euch über mein bisheriges Wissen:

Schrittmotoren haben eine gewisse Anzahl an internen Spulen. Umso mehr 
Spulen, desto genauer die "Rasterauflösung" des Schrittmotors. Durch das 
Nacheinander-Takten der einzelnen Spulen (über die jeweilige 
Versorgungsleitung), wird der Schrittmotor zum Laufen gebracht. Die 
Drehzahl des Motors wird durch die Taktfrequenz bestimmt, die 
Versorgungsspannung der einzelnen Leitungen ist dabei konstant. Ein 
Richtungswechsel erfolgt durch eine Umkehrung des Taktzykluses.
Die benötigte Taktanzahl für eine Umdrehung hängt von der Anzahl der 
internen Spulen ab (Schrittmotor mit 4 Spulen macht pro Takt 90° 
Umdrehung).

Nun habe ich folgendes vor:

Ich möchte nun (wie oben beschrieben) die Basen der einzelnen 
Transistoren nacheinenader von meinem µC aus ansteuern.
NUR: Mein Controller ist mit 8 MHz (int Osc.) getaktet und ich möchte 
den Motor nicht unbedingt gleich überdrehen ;-)

Wie und Wo kann ich eine gewisse Verzögerung in meinem C-Code einbauen, 
damit der Controller nicht mit 8 MHz die einzelnen Pins (Basen) taktet?

Mein subtiler Code müsste wie folgt aussehen:


//----------------------------------------------------

#include <avr/io.h>

int main (void)
{
   DDRA = 0xFF;            //PortA als Ausgang
   int i;                  //Zählervariable definieren

  for(i=0; i<100; i++)     //Sollte 100 Umdrehungen machen
  {
    PORTA = 0x01;         //schalte die 1. Spule ein...
    PORTA = 0;            //Schalte die 1. Spule aus...

    delay(int i);         //Variable i -> Verzögerung in µs

    PORTA = 0x02;         //schalte die 2. Spule ein...
    PORTA = 0;            //Schalte die 2. Spule aus...

    delay(int i);

    PORTA = 0x04;        //schalte die 3.Spule ein....
    PORTA = 0;           //Schalte die 3. Spule aus...

    delay(int i);

    PORTA = 0x08;       //schalte die 4. Spule ein...
    PORTA = 0;          //Schalte die 4. Spule aus...

    delay(int i);

  }
}


Wie kann ich diese Verzögerung realisieren? Die Verzögerunsfunktion 
sollte nicht viel Speicherplatz im Programmspeicher meines Controllers 
benötigen.

Vielen Dank für euere Hilfe.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ JK (Gast)

>Ich habe vor, mit meinem ATmega8515 einen Schrittmotor anzusteuern,
>allerdings mit einer einfachen Transistorschaltung: ich gehe vom Portbin

Warum? Es hat schon seinen Grund, warum es fertige Treiber-ICs gibt.

>meines Atmega8515 auf die Basis des Transistors, am Emitter hängt die
>jeweilige Leitung(1,2,3,4) des Schrittmotors).

Klingt nicht gut. Zeichne mal einen Schaltplan. Vorher solltest du dich 
aber besser informieren.

Bipolare Schrittmotoren

Allerdings gibt es noch UNIpolare Schrittmotoren, die kann man mit 
einfachen Transistoren ansteuern.
Such mal im Netz.

>Die benötigte Taktanzahl für eine Umdrehung hängt von der Anzahl der
>internen Spulen ab (Schrittmotor mit 4 Spulen macht pro Takt 90°
>Umdrehung).

Nöö, das stimmt nicht.

>Wie und Wo kann ich eine gewisse Verzögerung in meinem C-Code einbauen,
>damit der Controller nicht mit 8 MHz die einzelnen Pins (Basen) taktet?

Wann? nach jedem Schritt.
Wie? Mit der _delay_ms() Funktion. Siehe

AVR-GCC-Tutorial

>Wie kann ich diese Verzögerung realisieren? Die Verzögerunsfunktion
>sollte nicht viel Speicherplatz im Programmspeicher meines Controllers
>benötigen.

Ist den Controller soooooo klein?

MFg
Falk

Autor: Johannes M. (johnny-m)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Zum Thema "Was für Schrittmotoren gibt es" und (grob) "Wie werden 
bipolare Schrittmotoren angesteuert" anbei mal ein Auszug aus einer 
Versuchsanleitung für einen Laborversuch zu dem Thema. Vielleicht kannst 
Du damit schon mal was anfangen.

Autor: JK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja vielen Dank! Echt nett von dir, dass du mir es geschickt hast. Hat 
einiges klar werden lassen ;-)

gruß

Autor: JK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JA es ist wirklich wichtig, dass diese delay_ms() nicht zu groß ist, 
denn ich habe auch vor, einen Schrittmotor mit einem ATTiny zu machen.

Gibt es da nicht diese Compiler-Optimierung? Was bedeuten diese 
kryptischen "0c",....?

ansonsten...welche Möglichkeit gäbe es für die Delay-FUnktion noch als 
Alternative?


Danke!

Autor: sechsnullfuenf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den timer interrupt ?

Autor: JK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm...stimmt, muss ich mal sehen ob das überhaupt notwendig ist, denn 
auch die kleinen AVRs haben doch beachtlichen speicher.


Ich bin auf folgende Idee gekommen, es müsste doch einen Unterschied 
machen das Programm so zu schreiben:

//---------------------------------------------
...

int MacheVerzoegerung(void)
{
   _delay_ms(5);
}


int main (void)
{
   DDRA = 0xFF;

   PORTA = 0x01;

   MacheVerzoegerung();
....

//______________________________________________





als wenn ich jedesmal die Funktion delay einfüge oder? Weil so ist es ja 
im prinzip immer nur ein Sprung auf EINE funktion und nicht auf mehrere, 
oder denke ich da falsch?


danke

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das spart nur den Parameter-Ladebefehl, also nicht sehr viel. Dafür 
kostet die Ausführung ein paar Takte mehr.

Autor: JK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weißt du zufällig, wie man die Speicherbelegung im AVR studio anzeigen 
lassen kann??


-----------------------------------

0.3 %    program memory


oder so ähnlich.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ JK (Gast)

>Ich bin auf folgende Idee gekommen, es müsste doch einen Unterschied
>machen das Programm so zu schreiben:

Eher so.
void MacheVerzoegerung(uint16_t delay)
{
   for (; delay>0; delay--) _delay_ms(1);
}


int main (void)
{
   DDRA = 0xFF;

   PORTA = 0x01;

   MacheVerzoegerung(20000);  // 20 Sekunden
}

>weißt du zufällig, wie man die Speicherbelegung im AVR studio anzeigen
>lassen kann??

Macht AVR-Studio nach jedem Compilerlauf automatisch.

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.