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
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.
> 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
> 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
>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
> 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
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.
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
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.
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?
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.
> 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"
@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.
> 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
> 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/
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.
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
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
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
>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!
> 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.
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
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 :-)
> 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.
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
> 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...
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