Forum: Mikrocontroller und Digitale Elektronik Schrittmotorsteuerung mit Atmega8?


von Andreas (Gast)


Lesenswert?

Hallo zusammen!

Ich habe eine Frage bezüglich der Realisierbarkeit einer Idee.

Ich habe eine Positionierungsaufgabe (Koordinatentisch), die von 2 
Schrittmotoren übernommen wird. Als Schrittmotor-Treiber setze ich die 
klassische L297/298-Schaltung ein. Momentan läuft das ganze über den 
Parallelport eines Windows-PCs. Die Taktgenerierung läuft mittels 
Sleep-Zeiten. Da die minimale Sleep-Zeit scheinbar auf etwa 10ms 
begrenzt ist und die Steuerung zudem eigentlich recht zeitkritisch ist, 
läuft das ganze nur unbefriedigend.

Ich möchte nun im Hinblick auf die beiden Probleme mit der Aufgabe einen 
Mikrocontroller beauftragen. Zusätzlich zur Steuerung der beiden 
Schrittmotoren (Takt,Richtung) (4 Pins) sind 5-6 Eingänge (Endschalter 
u.ä.) sowie 2-3 Ausgänge vorgesehen. Zur Geschwindigkeitsoptimierung bei 
längeren Verfahrstrecken sollen die Schrittmotoren mittels Rampen bis zu 
etwa 5Khz ansteuerbar sein. Schrittverlust darf nicht passieren, da 
keine zusätzlichen Drehgeber vorhanden sind.

Der Mikrocontroller soll jedoch nicht nur vom PC übergebene Positionen 
anfahren, sondern autark anhand eines Programms Muster abfahren können.
Typische Beispielprogramme mit Mustern haben momentan etwa 5kB.

Ich dachte an eine Realisierung mit einem Atmega8, da ich damit schon 
(wenn auch nur grundlegende) Erfahrungen habe. Funktioniert das? Schafft 
er das? Bietet sich hier irgendwas besser an, gerade im Hinblick auf 
Erweiterbarkeit des Systems mit z.B. 2 weiteren Schrittmotoren?

Vielen Dank für eure Einschätzung!

Andi

von Stephan H. (stephan-)


Lesenswert?

ich denke das wird eng.
Der "Pieter" hier im Forum hat sowas gerade fertig.
Dort werkelt aber ein Silabs 8051 mit 100 MHz und math. Kprozessor 
soweit ich weis. Ich schicke ihm mal nen Link. Vielleicht meldet er sich 
mal dazu.
Ist alles nicht ganz trivial.

von Olaf (Gast)


Lesenswert?

> Momentan läuft das ganze über den Parallelport eines Windows-PCs.

Das ist schlecht.

> läuft das ganze nur unbefriedigend.

Wisssen wir. :-)

> Ich dachte an eine Realisierung mit einem Atmega8, da ich damit schon
> (wenn auch nur grundlegende) Erfahrungen habe. Funktioniert das?

Grundsaetzlich machbar. Aber eher dumm. Nimm dir einen Controller
der ein paar kb mehr Ram hat, mehr Timer kennt, und vor allem 
Interruptprioritaeten!

> gerade im Hinblick auf
> Erweiterbarkeit des Systems mit z.B. 2 weiteren Schrittmotoren?

Es ist natuerlich etwas Geschmacksache was man nimmt. Ich wuerde
einen M16C nehmen. Aber es gibt sicherlich auch andere Controller
die das koennen. vielleicht sogar von Atmel. Aber nicht diese magere
alte Schrulle. Bei drei Motore wirst du eine Menge Timer zu schaetzen
wissen, und sehr wichtig du musst einstellen koennen welcher Interrupt
dir wichtig ist damit die Motoren auch ohne Ruckler laufen.

Wenn du nun da ein 5kb grosses "Programm" reinlaedst welches jedes
mal die Ablaeufe steuert, dann sollte dein Controller schon so 10kb
Ram haben.

Olaf

von Olaf (Gast)


Lesenswert?

> Ist alles nicht ganz trivial.

Ich habe so eine Steuerung, also drei Schrittmotore an einem
8052 mal vor 10Jahren gemacht. Das ist mit diesem Controller
im gegensatz zu einem AVR noch loesbar. Allerdings musste ich
da einiges in Assembler loesen. Wuerde ich heute gewiss so
nicht mehr machen.

Olaf

von Gast (Gast)


Lesenswert?

>Das ist mit diesem Controller im gegensatz zu einem AVR noch loesbar.

Was man hier alles ertragen muß! Heute ist der 1. Dezember und nicht der 
1. April!

Ein Atmega8 reicht für einen Motor; besser ist es, einen AVR zu nehmen, 
bei dem mehrere 16bit Timer vorhanden sind, die Timer1 entsprechen. 
Hiermit lassen sich fein abstimmbare Lauffrequenzen erzeugen.
z.B. Atmega64 oder..640

von Olaf (Gast)


Lesenswert?

> Ein Atmega8 reicht für einen Motor; besser ist es, einen AVR zu nehmen,

Das wissen wir, und habe ich auch gesagt.

Wenn du aber lesen koenntest dann wuesstest du das er aber spaeter
mal auf drei Motore erweitern will. Und wie du 5kb Steuerdaten zur
Laufzeit in den Mega8 bekommst, kannst du uns dann ja auch mal gleich
erklaeren.

> Ein Atmega8 reicht für einen Motor; besser ist es, einen AVR zu nehmen,

Dumme Loesung wenn die Motoren abhaengig voneinander beschleunigen 
sollen. Vielleicht moechte er ja x1,y2 ---> x2,y2 als gerade oder 
definiert Kurve fahren?

> bei dem mehrere 16bit Timer vorhanden sind, die Timer1 entsprechen.

Und wenn man mehrere Motore hat dann sollte man noch einstellen koennten
welcher IRQ wichtig ist und welcher nicht.

Olaf

von Stephan H. (stephan-)


Lesenswert?

wenn ich richtig gelesen habe, sollen die Daten per Stuerbefehle 
gesendet werden. Ähnlich dem G-Code. Da ist dann die Fahrrichtung ob 1 
oder 2 Achsig wohl das kleinste Problem. Hier geht es um gehobene 
Mathematik. Und da wirds dann richtig eng. 5KB ist deutlich zu wenig. 
Die Software von Pieter belegt ca. 20 -30 KB, alles in ASM.

von Andreas (Gast)


Lesenswert?

Vielen Dank schon mal für die Hilfe!

Ich dachte mir schon fast, dass ich damit nicht weit komme...

Also was neues. Ich suche vorerst mal nach einer fertigen Platine, die 
mal "fliegend" verdahten kann, bzw. eben auf ne Lochrasterplatine 
stecken kann.
Wenn alles läuft und für gut befunden wird, kann die komplette Schaltung 
auf einer Platine entstehen (mit L297/L298, paar Optokoppler etc).
Ja, die beiden Motoren sollen auf jeden Fall in Abhängigkeit voneinander 
verfahren werden können.

Was ist hiervon zu halten?

http://www.chip45.com/index.pl?page=Crumb2560&lang=de&tax=ecde

Das sollte auch für Erweiterungen reichen, oder?

Oder gibt es auch brauchbare Sachen vielleicht günstiger, oder was 
besseres zum selben Preis?

Danke,
Andi

von Stephan H. (stephan-)


Lesenswert?

ich würde nicht auf alte Sachen wie L297/298 setzen.
Ehr auf TA8435 /IMT901 oder besser TB6560.

von Max (Gast)


Lesenswert?

Im Gegensatz zu allen bin ich der Meinung, dass das mit dem mega8 
einwandfrei läuft.

Ich empfehle fogenden Programmaufbau:
1.
Eine Timerinterrupt mit ca 2ms erstellen.

2. Im Hauptprogramm die Kommunikation über die Serielle Schnittstelle.
( Mit scanf- Kommando einlesen und in einem switch die einzelnen Fällen 
initialisieren. Würde im Switch globale Variabe setzen und diese in der 
ISR auswerten. )

Bei einem 20 Mhz Quarz kann man sich auch in einem gewissen Rahmen 
sub-optimale Lösungen erlauben.

von Andreas (Gast)


Lesenswert?

Da hast Du natürlich recht, ist aber vorerst nicht das Problem.

Vollschritt/Halbschritt reicht locker aus, Strom auch. Schaltung ist 
aufgebaut und lässt sich mit Funktionsgenerator problemlos ansteuern.
Evtl. bei der Endversion dann.

Steuerung (Richtung,Takt) sollte sich ja nciht unterscheiden, oder?

von Andreas (Gast)


Lesenswert?

Ja, aber ich denke jetzt ist es an der Zeit, den Atmega8 rauszuwerfen 
und anstatt einer suboptimalen Lösung gleich eine optimale 
erweiterungsfähige zu benutzen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ich würde nicht auf alte Sachen wie L297/298 setzen.
> Ehr auf TA8435/IMT901 ...
Wobei letztere abgekündigt sind, die beiden ersten aber nicht  :-o

TA8435: Bei Toshiba nicht mehr zu finden.
IMT901: "Dieser Artikel ist archiviert und nicht mehr online 
bestellbar."
L297/298: beide "active"

von Stephan H. (stephan-)


Lesenswert?

@Lothar,
beim Hersteller.
Im Handel sind die immer noch erhältlich.
Ich hätte ja auch Trinamic sagen können.
Sind halt nur nicht für jeden beschaffbar.

von MaWin (Gast)


Lesenswert?

Du hast TB6560 gesagt, das reicht doch (Darisus).

von Olaf (Gast)


Lesenswert?

> Wobei letztere abgekündigt sind, die beiden ersten aber nicht  :-o

Das ist der Grund beim guten alten L297/298 zu bleiben wenn
einem die Funktionalitaet ausreicht. Die Dinger sind vermutlich
seit 15-20Jahren Industriestandard und werden es auch noch viele
Jahre bleiben.

Olaf

von Gast (Gast)


Lesenswert?

> Die Taktgenerierung läuft mittels Sleep-Zeiten. Da die minimale
> Sleep-Zeit scheinbar auf etwa 10ms begrenzt ist und die Steuerung
> zudem eigentlich recht zeitkritisch ist, läuft das ganze nur unbefriedigend.

Thread nicht gelesen, falls dir eine Verbesserung um den Faktor 10 
reicht, änder einfach die Windowstimerauflösung. Software dazu: 
http://www.lucashale.com/timerresolution/

von Andreas (Gast)


Lesenswert?

Vielen Dank für den Tipp!

Funktioniert 1A. Letztlich spinnt und ruckelt es aber doch, wenn der PC 
noch was anderes macht und 1kHz ist auch noch nicht optimal.

Deshalb muss trotzdem der Mikrocontroller kommen.

von Axel D. (axel_jeromin) Benutzerseite


Angehängte Dateien:

Lesenswert?

Angehängtes Programm werkelt in einem Mega 162. Es empfängt Daten von 
der seriellen Schnittstelle (ISEL Portokoll) und setzt diese in Takt und 
Richtungssignal für x ,y ,z um. Eine Anzeige auf einem LCD gibt es auch 
noch.


Also kein Problem mit einem Atmel.


Axel

von Basti (Gast)


Lesenswert?

Nun...Dein Projekt ist eine feine Sache. Wenn Du richtig Ahnung hast von 
der Materie, wird es ca. ein halbes mannjahr bis Du was vernünftiges 
entwickelt hast. Mit vernünftig meine ich keine Bastellösung.

Die rechenleistung eines ATMEGA, AVR reicht nocht aus, wäre dem so, 
würde eine Haidenhain-Steuerung sicherlich 10oder 20  mal weniger kosten 
gggg

Bastellösungen gibt es natürlich zuhauf.
Mußt halt Deine Ansprüche definieren.

Nimm doch eine SMK-3M-4A und PAO3M von GRUMMES (erhältlich beim 
Hersteller oder z.B. bei Lüdecke) oder die 3D-Step von Ostermann oder 
was weiß ich.

Mir hat die Lösung SMK + PAO gut gefallen, vor Allem die PAO

Gruß, Basti

von Martin Cibulski (Gast)


Lesenswert?

Hallo Andreas,

ich habe eine Steuerung für 2 Motoren mit einem AtMega128 realisiert:

http://martin.cibulski.de/atm/mount_controller_4/index_de.htm

Die Steuerung ist eigentlich für Teleskope gemacht, kann aber auch zur 
zweiachsigen Positionierung benutzt werden.

Es werden Allegro 3973 Mikroschritttreiber verwendet.
Die Treiber bekommen die Stromwerte für die Spulen in einem festen 
Timertakt (ca. 8kHz) übermittelt. Je nach gewünschter Geschwindigkeit 
ändern sich die Ströme schneller oder langsamer. Man benötigt also NICHT 
mehrere Timer für mehrere Motoren !

Gruß,
Martin

von Gast (Gast)


Lesenswert?

>in einem festen Timertakt (ca. 8kHz)
> Man benötigt also NICHT mehrere Timer für mehrere Motoren !

Mit einem 8kHz Timer zwei Schrittmotore mit 5kHz und Rampen separat 
anzusteuern ist eine herausragende Leistung.
Hut ab, da kann ich nur staunen!

von MaWin (Gast)


Lesenswert?

> Also kein Problem mit einem Atmel.

Zumal das Programm noch Optimierungsmöglichkeiten hätte :-)

Aber: Ordentliche Kurven kann man damit nicht fräsen,
und ein Kreis-Bresenham ist doch etwas aufwändiger.

Passt meiner Meinung nach aber immer noch.

Und JA: Eine Haidenhain ist wahnwitzig überteuert.

von zwieblum (Gast)


Lesenswert?

kann nicht behaupten, dass der kreis-besenham besonders kompliziert 
wäre:
1
  void rasterCircle(int x0, int y0, int radius)
2
  {
3
    int f = 1 - radius;
4
    int ddF_x = 0;
5
    int ddF_y = -2 * radius;
6
    int x = 0;
7
    int y = radius;
8
 
9
    setPixel(x0, y0 + radius);
10
    setPixel(x0, y0 - radius);
11
    setPixel(x0 + radius, y0);
12
    setPixel(x0 - radius, y0);
13
 
14
    while(x < y) 
15
    {
16
      if(f >= 0) 
17
      {
18
        y--;
19
        ddF_y += 2;
20
        f += ddF_y;
21
      }
22
      x++;
23
      ddF_x += 2;
24
      f += ddF_x + 1;
25
 
26
      setPixel(x0 + x, y0 + y);
27
      setPixel(x0 - x, y0 + y);
28
      setPixel(x0 + x, y0 - y);
29
      setPixel(x0 - x, y0 - y);
30
      setPixel(x0 + y, y0 + x);
31
      setPixel(x0 - y, y0 + x);
32
      setPixel(x0 + y, y0 - x);
33
      setPixel(x0 - y, y0 - x);
34
    }
35
  }

von special swine flu (Gast)


Lesenswert?

Heidenhain ist ein Investitionsgut...nicht fuer Bastler entwickelt!
Was heisst da teuer ? Ein anfaelliges billiges Produkt produziert 
Ausschuss
Was haste dann gespart ?
Habe vor 30 Jahren fuer DJH gearbeitet...Klasse Produkte !
Einen Porsche kriegste auch nicht fuer 3DM50

von Karl H. (kbuchegg)


Lesenswert?

zwieblum schrieb:
> kann nicht behaupten, dass der kreis-besenham besonders kompliziert
> wäre:

:-)

>     setPixel(x0, y0 + radius);
>     setPixel(x0, y0 - radius);
>     setPixel(x0 + radius, y0);
>     setPixel(x0 - radius, y0);

Denk mal darüber nach, was wohl eine Fräsmaschine damit machen wird :-)

Abgesehen davon fräst man wohl eher selten Vollkreise, sondern des 
öfteren Bögen. Und dann wird ein Bresenham, der einen Kreisbogen
   Mittelpunkt   mx/my
   Radius        r
   Startwinkel   Alpha
   Endwinkel     Beta
abfahren kann, schon ein klein wenig aufwändiger :-)

von MaWin (Gast)


Lesenswert?

> kann nicht behaupten, dass der kreis-besenham besonders kompliziert wäre

Reinpassen wird er ja auch noch, selbst wenn man ihn auf Kreissegmente 
umschreibt, aber der Aufwand steigt, schon alleine weil man eine höhere 
Auflösung als 32000 Steps fahren wird (meine braucht 400000 steps für 
eine Richtung)

> Habe vor 30 Jahren fuer DJH gearbeitet...

Tja, damals waren Computer (auch solche mit so niedriger Rechenleistung 
wie sie heute eine 1 EUR AVR bringt) auch noch richtig teuer. Leider hat 
Haindenhain vergessen, seit dem seine Preise an den Fortschritt 
anzupassen.

von Pieter (Gast)


Lesenswert?

moin moin,

so, Problem mit Gasversorger erfolgreich gelöst, nun habe ich wieder 
etwas mehr Zeit.
Der Kreis-Bresenham für Kreisbogen ist mir zu aufwändig und wie MaWin 
auch schreibt werden da schnell >=32Bit Werte notwendig. Daher lasse ich 
bei mir im Hintergrund einen 8051F365 mit 100Mhz die normale 
Kreisgleichung rechnen und der HauptMC holt immer nur 1Byt mit Infos ab. 
Mit einem Timer werden  von MainMC die 3 Achsen gesteuert. Als 
Motortreiber nutze ich TB6560.
Zur Programmentwicklung: Die Steuerung wurde in Delphi am PC mit 
Bildschirmausgabe geschrieben und getestet. Dabei wurde schon auf eine 
spätere Umsetzung im Macroassembler geachtet. Das Delphiprogramm ist 
daher nicht Delphi-Optimal. Die Umsetzung einer Delphizeile in Assembler 
war dann relativ einfach.


Mit Gruß
Pieter

von Gast (Gast)


Lesenswert?

> Funktioniert 1A. Letztlich spinnt und ruckelt es aber doch, wenn der PC
> noch was anderes macht und 1kHz ist auch noch nicht optimal.
> Deshalb muss trotzdem der Mikrocontroller kommen.

Ich möchte dir das Mikrocontrollerbasteln nicht ausreden, aber wenn du 
den autonomen Betrieb nicht wirklich brauchst wäre es vielleicht 
einfacher, das bestehende Steuerprogramm auf ein 
x86-Echtzeitbetriebssystem (z. B. QNX, RTLinux, VxWorks) zu portieren.

Andererseits fehlt da der Bastelspaß und es bleibt immer noch beim 
Druckerport...

von Thorsten O. (Firma: mechapro GmbH) (ostermann) Benutzerseite


Lesenswert?

Wir haben soetwas auf einem Mega128 gemacht. Der steuert bis zu 4 Achsen 
(allerdings nur 2 simultan, die dafür aber interpoliert), zusätzlich 
werden noch grafisches LCD und Tastatur angesteuert. Die 
Motoransteuerung erfolgt über Takt/Richtung an separate Endstufen,

Die Berechnung der Rampen ist nicht so ganz trivial, wenn das über einen 
breiten Geschwindigkeitsbereich einsetzbar sein soll und auch noch 
geringer Jitter gefordert ist. Wir machen einen Großteil der Berechnung 
vorab und legen die Ergebnisse im externen RAM ab. Die Motoren werden 
dann über 2 Timer gesteuert und laufen anders als beim Bresenham nicht 
im gleichen Zeitraster, weil das bei "krummen" Winkeln auf der 
langsameren Achse zu Resonanzen führen könnte.

Mit freundlichen Grüßen
Thorsten Ostermann

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.