Forum: Mikrocontroller und Digitale Elektronik Simple Schrittmotor-Ansteuerung


von JK (Gast)


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.

von Falk B. (falk)


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

von Johannes M. (johnny-m)


Angehängte Dateien:

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.

von JK (Gast)


Lesenswert?

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

gruß

von JK (Gast)


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!

von sechsnullfuenf (Gast)


Lesenswert?

Den timer interrupt ?

von JK (Gast)


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

von Uhu U. (uhu)


Lesenswert?

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

von JK (Gast)


Lesenswert?

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


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

0.3 %    program memory


oder so ähnlich.

von Falk B. (falk)


Lesenswert?

@ JK (Gast)

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

Eher so.
1
void MacheVerzoegerung(uint16_t delay)
2
{
3
   for (; delay>0; delay--) _delay_ms(1);
4
}
5
6
7
int main (void)
8
{
9
   DDRA = 0xFF;
10
11
   PORTA = 0x01;
12
13
   MacheVerzoegerung(20000);  // 20 Sekunden
14
}

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

Macht AVR-Studio nach jedem Compilerlauf automatisch.

MFG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.