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.
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 | } |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.