Forum: Mikrocontroller und Digitale Elektronik Rampe Atmega32


von Axel (Gast)


Lesenswert?

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

von Thomas W. (diddl)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von (Gast)


Lesenswert?

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.

von Axel (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Theor (Gast)


Lesenswert?

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.

von NichtWichtig (Gast)


Lesenswert?

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.

von Achim H. (pluto25)


Lesenswert?

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.

von m.n. (Gast)


Lesenswert?

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.

von NichtWichtig (Gast)


Lesenswert?

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.

von Axel (Gast)


Lesenswert?

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

von Hugo H. (hugohurtig1)


Lesenswert?

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?

von NichtWichtig (Gast)


Lesenswert?

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.

von Hugo H. (hugohurtig1)


Lesenswert?

NichtWichtig schrieb:
> Motorprüfstand, da war nur wichtig das der Motor die Solldrehzahl
> erreicht

Wozu / warum nimmt man da einen Schrittmotor?

: Bearbeitet durch User
von NichtWichtig (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von NichtWichtig (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Axel (Gast)


Lesenswert?

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

von m.n. (Gast)


Lesenswert?

Bei einem ATmega32 brauchst Du für zwei Schrittmotore mit Rampen allein 
Timer1. Ein Beispiel hatte ich oben verlinkt.

von MaWin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.