Hallo liebe Forumsteilnehmer, ich möchte mit einem Atmega32 einen Schrittmotor steuern. Ich programiere mit ASM auf AVR Studio4. Mein Timer1 läuft im CTC-Modus und stellt die Frequenzen zur Verfügung. Dabei kann ich 32 verschiedene Word-Konstanten aus einer Tabelle holen und als OCR-Werte laden und somit 32 verschiedene Drehzahlen auswählen. Die habe ich so gewählt, dass die Drehzahlen von der kleinsten bis zur größten linear verlaufen. Das klappt alles so weit. Jetzt habe ich zu Testzwecken im Timer0 diese 32 Drehzahlen nach einander geladen und durch verändern des Vorteilers die Zeiten verkürzt (also diese Rampe hat jetzt ungeführ 1 Sekunde. Funktioniert auch so weit, aber teilweise mit etwas Ruckeln zwischen den einzelnen Geschwindigkeiten. Ich habe jetzt schon soviel im Forum nach einer Rampensteuerung gesucht und gelesen, dass es für mich komplett verwirrend ist, wie eine Rampe realisiert werden kann. Habe auch die Appnote ATMEL446 schon gelesen,steige aber trotzdem nicht durch. Jetzt meine Fragen: Wieviele verschiedene Drehzahlen brauche ich denn für eine Rampe? Wenn ich von 0 bis Max beschleunige brauche ich doch mehr Stufen, als von mittlerer Geschwindigkeit zum Max? Mir ist nicht klar, nach welcher Logik ich mit dem Timer0 die Rampenwerte lade (Geschwindigkeit erhöhe). Alle x ms Wert erhöhen? oder muss sich die Zeit von einer zur nächsten Stufe verändern? Wäre schön, wenn mir das jemand verständlich erklären könnte. Danke im Vorraus Axel
Dafür gibt es ja schon fertige Boards und/oder fertige Libs. Axel schrieb: > Wieviele verschiedene Drehzahlen brauche ich denn für eine Rampe? Wenn > ich von 0 bis Max beschleunige brauche ich doch mehr Stufen, als von > mittlerer Geschwindigkeit zum Max? Willst du wirklich verschiedene Drehzahlen? Schrittmotoren wollen ja normal nur so schnell wie möglich einen Zielpunkt erreichen. Die Drehzahl verändert man eigentlich nur deswegen, weil die Massenträgheit sonst zum Problem wird. Deswegen halbiert man die Strecke zum Zielpunkt und hat so die erste Hälfte zum beschleunigen und die zweite zum bremsen. Für große Entfernungen gibt es dann noch einen Mittelteil mit gleichbleibender Drehzahl. Das kommt aber nur daher, weil man eine maximale Drehzahl wählt.
Axel schrieb: > Wieviele verschiedene Drehzahlen brauche ich denn für eine Rampe? Das hängt von deinen Ansprüchen und der Massenträgheit des gesamten Aufbaus ab. Viele Spielzeugaustos von Kindern fahren mit einer einzigen Stufe ohne ruckeln sanft an - nur um ein Extrembeispiel zu nennen. > Alle x ms Wert erhöhen? oder muss sich die > Zeit von einer zur nächsten Stufe verändern? Auch das hängt primär von mechanischen Faktoren ab.
Axel schrieb: > Jetzt habe ich zu Testzwecken im Timer0 diese 32 Drehzahlen nach > einander geladen und durch verändern des Vorteilers die Zeiten verkürzt > (also diese Rampe hat jetzt ungeführ 1 Sekunde. Funktioniert auch so > weit, aber teilweise mit etwas Ruckeln zwischen den einzelnen > Geschwindigkeiten. Genau letzteres gilt es durch eine gleichmäßige Rampe zu vermeiden. Jeder Spung (Ruck ≠ 0) ist kontraproduktiv, wenn das System drehmomentmäßig an der Grenze ist. > Ich habe jetzt schon soviel im Forum nach einer Rampensteuerung gesucht > und gelesen, dass es für mich komplett verwirrend ist, wie eine Rampe > realisiert werden kann. Habe auch die Appnote ATMEL446 schon > gelesen,steige aber trotzdem nicht durch. In der AVR446: "Linear speed control of stepper motor" steht es doch genau drin. Ziel ist eine konstante Bescheunigung/Bremsung und dazu wird in 2.3.1 die Formel für rekursive berechnung der Schrittweite abgeleitet.
Axel schrieb: > Mir ist nicht klar, nach welcher Logik ich mit dem Timer0 die > Rampenwerte lade (Geschwindigkeit erhöhe). Alle x ms Wert erhöhen? oder > muss sich die Zeit von einer zur nächsten Stufe verändern? Idealerweise rechnet man nach jedem Schritt die Dauer des nächsten Intervalls aus.
Hallo, mit dem Motor will ich den Oberschlitten meiner Drehmaschine verstellen. Der Motor schafft das auch bei allen Drehzahlen. Aber während der Motor läuft, bleibt die Drezahl schon konstant. Mit einen Encoder will ich den Vorschub einstellen können (32 verschiedene Drehzahlen sind vorgegeben). Mir geht es um das Grundverständnis, wie eine Rampe funktioniert. Erst dann kann ich mich an die Umsetztung/Programmierung machen. Axel
rµ schrieb: > Idealerweise rechnet man nach jedem Schritt die Dauer des nächsten > Intervalls aus. Genau das ist in der AVR446 mit
1 | c_n = c_n-1 - (2 ‧ c_n-1) / (4 ‧ n + 1) |
versucht worden, auszudrücken. Und in Fig 2-7 ist veranschaulicht, bei welchem Schritt die Bremsung eingeleitet werden muss, damit der Motor an einer bestimmten Position zum Stehen kommt (bei festgelegten Beschleunigungswerten).
Axel schrieb: > Mir geht es um das Grundverständnis, wie eine Rampe funktioniert. Erst > dann kann ich mich an die Umsetztung/Programmierung machen. Auf der Rampe berechnest du die Zeitverzögerung zwischen zwei Schritten so, dass die resultierende Beschleunigung konstant ist. Mehr steckt nicht dahinter. Etwas komplizierter wird es, wenn die Beschleunigung auch noch sanft ein- und ausgeleitet werden soll, aber das führt erstmal zu weit.
Axel schrieb: > [...] > Mir geht es um das Grundverständnis, wie eine Rampe funktioniert. Erst > dann kann ich mich an die Umsetztung/Programmierung machen. Nun, das ist aber nun schon gefühlt 100.000 Mal erklärt worden. Ich nehme daher an, dass nicht die Erklärungen unverständlich formuliert sind, sondern das Dir die Grundlagen fehlen, diese Erklärungen zu verstehen. Das ist ja kein unlösbares Problem. Aber dann ist es sinnvoll an Deinen Grundlagen zu arbeiten und nicht, nun noch die 100,001te Erklärung zu erstellen. Meinst Du nicht auch? Ich schlage vor, Du nimmst die Erklärung, die Dir trotz aller Schwierigkeiten zunächst am besten erscheint (vorzugsweise eine, die wir auch nachlesen können, also Internet) und Du schreibst, welchen Satz, welchen Absatz usw. oder welchen grösseren Zusammenhang Du nicht verstehst. Ich halte das für wesentlich effektiver.
rµ schrieb: > Axel schrieb: >> Mir ist nicht klar, nach welcher Logik ich mit dem Timer0 die >> Rampenwerte lade (Geschwindigkeit erhöhe). Alle x ms Wert erhöhen? oder >> muss sich die Zeit von einer zur nächsten Stufe verändern? > > Idealerweise rechnet man nach jedem Schritt die Dauer des nächsten > Intervalls aus. Exakt! Wobei ich da Rechnen durch, LUT aus dem EEPROM/Speicher ersetzen würde. Aber darauf läuft es hinaus das man bei jedem Timerinterupt den nächsten neu setzen muß. Die Schweinerei dabei ist alles andere als linear. Wer den Bogen raus hat beschleunig den Stepper nach Vorgabe an enier Speedlinie entlang. Und "Knicke" sollte man vermeiden, vorallem unter Last und bei hohem Tempo. Also nach der groben Rampe noch Gedanken um den Übergang von Beschleunigen zum Endgeschwindigkeit machen. Das aber nur wenn der Stepper beim der Kante abreißt.
Axel schrieb: > nach welcher Logik ich mit dem Timer0 die > Rampenwerte lade Auf jeden Fall bevor sie überschritten ist sonst läuft der Timer einmal rund bevor der nächste Schritt ausgeführt wird. Die nötige Anzahl von Schritten würde sich aus der Drehzahl ergeben. Ist die Enddrehzahl nur halb so groß entfallen alle Schritte die schneller wären. Somit gibts bei 1/16stel Drehzahl nur eine Zwischenschritt als Rampe.
Thomas W. schrieb: > Willst du wirklich verschiedene Drehzahlen? > Schrittmotoren wollen ja normal nur so schnell wie möglich einen > Zielpunkt erreichen. Was Schrittmotoren wollen ist unwichtig. Wenn eine Meßaufgabe vorsieht, an mehreren Punkten einer Bahn langsamer zu fahren, dann muß das so passieren. Jetzt die ganze Fahrt im Schneckentempo durchzuführen, kann dann sehr ineffizient sein. Das Programm "step_m328.c" macht "Rampenmusik": http://mino-elektronik.de/Generator/takte_impulse.htm#bsp7 Nur schreibt man so etwas nicht in Assembler.
Assembler geht schon für ne Rampe, ist auch nur eine Programmiersprache. Ich hatte damals sowas mit einem 89S8252 realisiert, mit ASM. Per PC-GUI konnte eine Tabelle erzeugt und ins EEPROM geladen werden wo die Timerwerte für eine gewünschte Rampe abgelegt waren. Der Knackpunkt ist eben die nicht-lineare Timeransteuerung. Je nach aktuellem Speed muß der nächste Wert gesetzt werden. Startspeed war glaub 1000Hz, das klappte aus dem Stand heraus immer. Und dann wird per Rampe bis zur gewünschten Sollfrequenz die Pulspause verringert. Was passiert wenn man bei jedem Pulse den Timerwert um 1 verkleinert hatte ich an anderer Stelle schonmal graphisch gezeigt.
Hallo, also ich fang mal bei Adam & Eva an: Wenn ich die AppNote446 2.3 richtig verstehe, dann ist - während der Rampe Beschleunigung konstant. - während der Rampe die Geschwindigkeit linear steigend/fallend Ich habe mal Beispielwerte hergenommen und in Excel eingegeben. Dann erhalte ich für s im Diagramm eine Parabel mit anschließenden linearen Linienverlauf. a*t*t s = ----- + Vo*t + So 2 Jetzt vestehe ich aber die Figure 2-6 nicht. Ich sehe den linearen (angestrebten) Geschwindigkeitsverlauf. Aber warum sind die t's unterschiedlich lang, bzw in meinem Beispiel oben sind alle t's gleich lang. Was hat das eine für Auswirkung, wenn alle t-Abschnitte gleich lang sind? Axel
NichtWichtig schrieb: > Startspeed war glaub 1000Hz, das klappte aus dem Stand heraus immer. Schrittverluste unbekannt? Wie hast Du gebremst? Auch bis 1000 und dann direkt auf 0?
Hugo H. schrieb: > NichtWichtig schrieb: >> Startspeed war glaub 1000Hz, das klappte aus dem Stand heraus immer. > > Schrittverluste unbekannt? Wie hast Du gebremst? Auch bis 1000 und dann > direkt auf 0? Motorprüfstand, da war nur wichtig das der Motor die Solldrehzahl erreicht und dann per Bremsscheibe bis zur Blockade belastet wurde. Gemessen wurde das Drehmoment bei Drehzahl X Schrittverluste wurden mit einem Encoder erfaßt und ein AVR90S1200 hat SOLL und IST Steps verglichen und bei Verlust den Motor "abgeschaltet". Die Testmotoren waren mit der Bremsscheibe unterfordert und konnten das Ding locker hoch drehen da die Bremszange erst bei Solldrehzahl zu fuhr.
NichtWichtig schrieb: > Motorprüfstand, da war nur wichtig das der Motor die Solldrehzahl > erreicht Wozu / warum nimmt man da einen Schrittmotor?
:
Bearbeitet durch User
Hugo H. schrieb: > NichtWichtig schrieb: >> Motorprüfstand, da war nur wichtig das der Motor die Solldrehzahl >> erreicht > > Wozu / warum nimmt man da einen Schrittmotor? Weil der Auftraggeber CNC Dreh- und Fräsmaschine damit ausgerüstet hat und somit die verfügbaren Motoren "ausmessen" wollte.
NichtWichtig schrieb: > Was passiert wenn man bei jedem Pulse den Timerwert um 1 verkleinert > hatte ich an anderer Stelle schonmal graphisch gezeigt. Für eine konstante Beschleunigung soll die Geschwindigkeit linear ansteigen. Geschwindigkeit ist delta_Winkel/delta_Zeit. Beim Schrittmotor ist delta_Winkel konstant. Nun kannst du mal selber ausrechnen, was mit der Geschwindigkeit passiert, wenn du deine Timerdekremente von Puls zu Puls machst.
Sag ich doch :-) Da steckt schon Hirn hinter wenn man den Stepper linear beschleunigen will. Und das in Assembler mit einem 8052. Anbei eine Messung wo ein Stepper bis auf knapp 11KHz beschleunigt wird.
Bitte entschuldigt, dass ich nochmal ganz doof frage. Wieviele Timer brauche ich denn für Rampe? 1 oder 2? Ich bin von 2 ausgegangen. Der 1. Timer stellt die Pulse für den Motor zur Verfügung (CTC-Modus). Und der 2. Timer läd in vorgegebenen Abständen den Vorteiler (OCR) für Timer 1. Axel
Bei einem ATmega32 brauchst Du für zwei Schrittmotore mit Rampen allein Timer1. Ein Beispiel hatte ich oben verlinkt.
Axel schrieb: > Bitte entschuldigt, dass ich nochmal ganz doof frage. Wieviele > Timer brauche ich denn für Rampe? 1 oder 2? Im Prinzip immer nur 1, aus dem lässt sich dann alles weitere softwaretechnisch ableiten - wenn man programmieren kann. Praktisch kann man den Timer eine Liste von Ereignissen abarbeiten lassen, da steht z.B. in 1ms setze 0x50 auf das Schrittmotorport, in 7ms setze 0x40 auf das Schrittmotorport, in 52ms setze 0x01 auf das Schrittmotorport usw. Die Timerroutine setzt, alls die Liste nicht leer ist, den port wie es im nächsten Eintrag der Liste steht und setzt den nächsten Timerintervall auf die Zeit. Die Programm-Hauptschleife hat immer zu tun um die LIste zu füllen mit den nächsten Ereignissen. Ist die Liste voll, rechnet die Hauptschleife noch nicht weiter. Ist die Liste leer, muss sie nicht nur einen Eintrag machen, sondern auch den Timer starten. Die eingetragenen Zeitpunkte der Ereignisse berechnen sich nach der gewünschten Geschwindigkeit, steigende Gechwindigkeit bei Beginn der Rampe macht also die Zeiten immer kürzer. Besonders schwierig wird der Code, wenn man nicht bremsen will, aber bremsen muss, weil man noch keine weiteren Wegdaten (GCode seriell übermittelt, Puffer wurde leer) hat. Dann rechnet man erst eine Bremsrampe aus, speichert sie in der Liste, und so bald die Daten für den weiteren Weg kommen, muss man den Bremsweg wieder aus dem Ende der Liste entfernen, so weit er noch nicht abgearbeitet wurde, so weit also noch nicht real abgebremst, und dann den weiteren Weg, ggf. mit Wideraufnahme des Tempos, anflanschen.
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.