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.
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
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.