[AVR GCC Kurs2] Stepper-Interface

We proudly present: The release of DMXControl 3.3.3!


On September 29, 2026, we held our release show for DMXControl 3.3.3. During our usual “hour-long” session, we showed you all the new features in this version and what it now has to offer.
Read all about it in the corresponding news article: We proudly present: The release of DMXControl 3.3.3!


  • Die letzten Werte werden weggelassen.

    Ich vermute, Du hattest nicht berücksichtigt, dass die Einträge der Tabelle ab 0 gezählt werden. (100Einträge -> Länge= 99)

    Bei Tabellen >150Einträgen würde ich vielleicht doch eine Berechnung zur Laufzeit vornehmen. Dazu hatte ich ja schon eine AN von ATMEL genannt. Du müsstest nur versuchen, die Geschichte so umzuschreiben, dass die Berechnung anstatt mit Zielpositionen mit einem Positionsstream (DMX) klarkommt. Die Rechenzeit könnte also bei der Wurzelberechnung kritisch werden.

    "Wartezeiten" beim Richtungswechsel sollten über die Beschleunigungstabelle realisiert werden.

    Bevor Du irgendwelche Sinustabellen aufschnappst, befass Dich doch erstmal mit der Physik und der Funktionsweise. Du bastelst mir mittlerweile einfach zu viel und rechnest zu wenig ;)

    Vielleicht fällt Dir ja auch ein neues Konzept für die Geschwindigkeiten ein, das wir dann hier durchgehen können. Wie firm bist Du eigentlich in der Antriebstechnik?

    VG,
    Hendrik

  • holla

    also zu den punten:

    1.
    Ich vermute, Du hattest nicht berücksichtigt, dass die Einträge der Tabelle ab 0 gezählt werden. (100Einträge -> Länge= 99)

    nein hatte ich nicht, aber beim wechsel von letztem tabellen wert auf voll speed, macht er immer nen riesen satz.

    2.
    Bei Tabellen >150Einträgen würde ich vielleicht doch eine Berechnung zur Laufzeit vornehmen.


    ich würde gerne die "tabelle" in echtzeit berechnen um noch genauerer zu werden, aber wie ich schon einigemale gesagt habe bin ich der sprache nicht mächtig. leider !!

    3.
    "Wartezeiten" beim Richtungswechsel sollten über die Beschleunigungstabelle realisiert werden.

    werds probieren.

    4.
    Bevor Du irgendwelche Sinustabellen aufschnappst, befass Dich doch erstmal mit der Physik und der Funktionsweise. Du bastelst mir mittlerweile einfach zu viel und rechnest zu wenig ;)


    das mit der sinuskurve, hat ja den sinn das er langsam beschleunigt und dann immer schneller wird.
    und zwar nicht linear sondern eben in einer sinus-kurve, diese infos habe ich von einer microcontroller seite. und nicht etwa ausgedacht. zum basteln, :D nur so komme ich weiter.

    5.
    Wie firm bist Du eigentlich in der Antriebstechnik?


    öhm, ich habe nichts in der richtung gelernt oder gar studiert. alles nur angeeignet.

    mfg maik

  • Da ich keinen fertigen Code für Deinen Stepper mehr zu bieten habe (und ich auch momentan keine Zeit und Motivation habe, mir einen völlig neuen Algorithmus auszudenken), gibt es nun ein paar Grundlagen Antriebstechnik.

    Somit verstehen vielleicht auch die Schüler, Informatiker (ihr habt keine Mechanik, oder?) und "Geisteswissenschaftler" unter Euch, was wir hier eigentlich machen :D

    Die Basis von jedem mechanischen System (und ein Movinglight ist ein solches...) ist das Krafterhaltungsgesetz nach Newton:
    Die Summe aller Kräfte ist Null.
    In unserem Fall heißt das:
    0= Mt +Mr +Man
    Dabei sind Mt das Trägheitsmoment der zu bewegenen Masse, Mr das Reibmoment (Haftreibung, Gleitreibung und viskos wegen Schierfett - also schön nichtlinear) und Man das Antriebsmoment Deines Steppers.

    Trägheitsmoment:
    Nach Newton gilt: Ft=m*a (Kraft=Masse*Beschleunigung)
    Da wir uns drehen gilt: Mt= J*a (Moment=Massenträgheitsmoment*Winkelbeschleunigung)
    Formeln zur Berechnung der Trägheitsmomente verschiedener Körper findet Ihr auf Wikipedia.

    Nun haben wir mit verschiedenen Massen zu tun: Der Flower und der Rotor des Steppers. Um beide zu berücksichtigen, reduziert man in der Antriebstechnik alle Massen auf die Antriebswelle. In unserem Fall heißt das:
    J_ges= J_mot +J_flower/i^2
    i ist dabei die Übersetzung Deines Riementriebs (z_flower/z_ritzel)

    Reibmoment:
    das dürfte bei Dir verhältnismäßig klein sein. Da keine Daten vorliegen, setze es auf 0 und rechne später einen Sicherheitsfaktor mit ein...

    Antriebsmoment:
    Das Antriebsmoment ist abhängig vom Strom und der aktuellen Drehzahl und sollte aus einem Diagramm im Datenblatt ablesbar sein.


    Auf diese Weise erhalten wir durch Umstellen der Gleichungen die maximale Beschleunigung, die der Motor bei einem bestimmten Strom und Drehzahl liefern kann.

    Ein Problem ist die Resonanzdrehzahl: In diesem Bereich haben wir fast kein Antriebsmoment und können nur wenig beschleunigen - wir sollten also darunter bleiben.

    Rechne mit einem Sicherheitsfaktor von 25%..50%, damit wir auch ja keine Schrittverluste erhalten :D

    Edited once, last by Hendrik Hölscher (August 24, 2008 at 8:45 PM).

  • Kommen wir nun zur Bahnsteuerung:

    Die Zustandsgrößen unseres mechanischen Systems sind
    r = der Ruck (der den Head wackeln lässt)
    a = die Beschleunigung (die durch den Motor begrenzt wird)
    w= die Drehzahl (omega; sollte limitiert werden, damit Du in einer vernünftigen Zeit abbremsen kannst)
    s = der Winkel (eigentlich phi - was soll's...)

    Der momentane Bewegungszustand Deines Heads kann durch folgende Differentialgleichungen berechnet werden:

    s(t)= v(t)*t +s_0

    [X(t) bedeutet, dass die Variable sich mit der zeit ändern kann, t ist die aktuelle Zeit und X_0 ist der Ausgangswert der Variable, zu dem Zeitpunkt, an dem wir mit der betrachtung des Systems beginnen...]

    v(t)= a(t)*t +a_0

    a(t)= r*t +a_0

    Bei meinen Tabellen habe ich keine Ruckbegrenzung (deswegen kann es evtl. wackeln...) und ich rechne mit den Ausgangswerten:
    a_0= 0
    v_0= 0
    s_0= 0
    (also Stillstand @home position)

    Somit vereinfacht sich meine Rechnung zu:
    s(t)= (a/2)*t^2
    (einfache Integration...)

  • Wie funktioniert derzeit mein Code?

    Die Basis von allem ist eine Tabelle mit den Schrittdauern für die Geschwindigkeiten. Sie berechnet sich nach AN446 von ATMEL:

    Die Schrittzeit des ersten Schrittes aus dem Stillstand ist
    t= sqrt(2*s/a), wobei s dem Winkel eines (Mikro-)schrittes entspricht.
    (Die Formel sollte Euch bekannt vorkommen :rolleyes:)

    Die Anzahl der Timer-Ticks ist
    n_clk= t/t_clk, wobei t_clk die Zeitdauer eines Timer-Ticks ist.

    Die Zeitdauer des ersten Schrittes ist also t_2 -t_1

    t_1 =sqrt(1*2*s/a)
    t_2 =sqrt(2*2*s/a)

    (da s der Winkel des ersten Schrittes und 2s der Winkel nach zwei Schritten ist)
    also:

    delta_t= sqrt(2*s/a) *(sqrt(2)-1)

    oder allgemein für den n-ten Schritt:
    delta_t_n= sqrt(2*s/a) *(sqrt(n+1)-sqrt(n))

    Und das ergibt meine Tabelle.

  • Was macht nun check_accel() ?

    Zunächst vergleiche ich die Differenz zwischen Soll- und Istposition, also den sogenannten Schleppabstand, mit der aktuellen Geschwindigkeit.
    Wenn der Schleppabstand kleiner als die Geschwindigkeit ist, bremse ich ab. (neg. Geschw. ist linksdrehend, pos. Geschw. ist rechtsdrehend, 0 ist Stillstand)

    Ansonsten beschleunige ich bis zur maximalen Geschwindigkeit, also RAMP_LEN.

    Abschließend lade ich die zur berechneten Geschwindigkeit gehörende Schrittdauer aus der Tabelle (s.o.)

    Die Aufgabe wäre also nun, einen Weg zu finden, ohne Tabelle aus dem Schleppabstand die maximal zulässige Geschwindigkeit zu gewinnen, bei der man noch durch Abbremsen das Ziel trifft.

    Edited once, last by Hendrik Hölscher (August 24, 2008 at 10:44 PM).

  • Ich schätze, ich habe einen neuen Ansatz für die Geschwindigkeitsführung bei Steppern gefunden:

    Schleppabstand:
    e= Sollposition -Istposition;

    Sollgeschwindigkeit:
    v_soll= e *kp;
    if (v_soll > v_max) v_soll= v_max;
    else if (v_soll < v_min) v_soll= v_min;
    (Also ein einfacher Proportionalregler mit Sättigung. Das Finden des richtigen Proportionalfaktors kp könnte noch interessant werden...)

    Nun muss die Motorgeschwindigkeit der Zielgeschwindigkeit mit der zulässigen Beschleunigung (s.o.) nachgeführt werden:

    if (v_soll > v_ist) v_ist += a;
    else if (v_soll < v_ist) v_ist -= a;

    (a wäre die Beschleunigung. Ich schätze dieser Teil ist suboptimal, da die Geschwindigkeit ziemlich grob mit der Stufung der maximalen Beschleunigung geführt wird. Besser wäre wohl ein weiterer P-Regler, sodass eine Kaskade gebildet wird...)

    Das sähe dann so aus:
    ev= v_soll -v_ist;
    a= ev *kp_v;
    if (a > a_max) a= a_max;
    else if (a < a_min) a= a_min;
    v_ist += a;

    Wahrscheinlich kann man den Proportionalfaktor auf 1 setzen und direkt ev als a nutzen...

    Was halten die Elektrotechniker unter Euch davon?

    VG,
    Hendrik

  • Da keine Divisionen oder Wurzeln nötig sind, könnte man das bei jedem Universe-Refresh durchrechnen lassen.

    Offen gestanden, bin ich aber zunächst gespannt, was Michael, Mathias und Dirk dazu sagen... Es ist durchaus möglich, dass ich ja was übersehen habe.

  • @ henne

    so nachlangem testen, bin ich zu der erkenntnis gekommen, das du recht hast.
    die rampe die ich selber berechnet habe ist *sch....e*:D

    nun meine frage könntest du mir eine rampe berechnen??

    2000 werte sollte sie min haben, da ich mitlerweile einen 0,9° stepper verwende.
    mit 16tel stepp und 8 fach untersetzung.

    bei meiner rampe ist die resonanz bei einigen geschwindigkeiten extrem stark!
    und er verliert schritte beim langsam fahren;( .

    die daten der stepper findest du hier

    tilt--->http://de.nanotec.com/downloads/pdf/…04%20Layout1%20(1).pdf
    pan-->http://de.nanotec.com/downloads/pdf/1144/ST4209M1206.pdf

    mfg maik

  • Hat jetzt zwar nichts mit der Stepperfirmware hier zutun, aber ich bin auch gerade dabei was im AVR Studio zu programmieren.

    Ich nutze einen ATMega32, soweit funktioniert auch alles. Nur wenn der ne simple Rechenaufgabe machen soll, springt er einfach drüber.
    Das macht er auch im Simulator so.
    Ich habe absolut keine Ahnung warum.

  • Grundsätzlich: Wenn es nicht zum Thema passt, lieber erst einmal nach anderen Threads suchen und dann ggf. einen neuen aufmachen.

    Ansonsten reicht Deine "Fehlerbeschreibung" natürlich nicht aus:

    Projekt mit vollst. Code (zip-Archiv) seh ich nicht.
    Beschreibung müsste genauer sein
    Sprache, Compiler und Toolchainversion fehlt...

    Für mich hört sich das derzeit nach einem zerschossenen Stack an.

    VG,
    Hendrik

  • Naja recht einfache Sache. Hab die neueste Avr Studio Version + winavr installiert.
    War dann fleißig am programmieren und lief auch alles, bis der avr nen Prozentsatz berechnen sollte.
    Da springt der Simulator einfach über die Zeile.
    Direkt nachdem ich den simulator gestartet habe steht da schon nen Fehler vonwegen unbekannter Aufruf call bei addresse 0x0043 oderso.
    Kanns gerade nicht nachschauen, da ich im Buss sitze

    Vieleicht kannste damit ja schon was anfangen.

  • So, ich kann auch endlich mal was zum Thema bewegtes Licht sagen.
    Und zwar haben wir nen neues Projekt am Start. Wir haben da nämlich 4 alte Coemar Jupiter Scanner für 35 Öre das Stück bekommen und da konnten wir einfach nicht nein sagen...

    Wie viele warscheinlich wissen, können die Geräte kein DMX. Jetzt haben wir es uns zum Ziel gemacht, das sie das in Zukunft lernen.

    Bis jetzt haben wir folgendes versucht:
    Hennes Tranciever mit l298 dahinter --> führt nach ca 10 Sekunden zu einem netten Feuerwerk...

    Das liegt aber daran, das der l298 keine Stromüberwachung hat und die stepperversorgung im Scanner ca 37V macht. Na ja, ihr könnt ja alle rechnen wie hoch der Strom bei ca 1 Ohm Spulenwiderstand wird... :D

    Nächster Anlauf wären die von Maik benutzten Karten gewesen, aber bei 16 Achsen wird das ganze nen "bischen" teuer. ;)

    Ok also schauen wir mal wie Coemar das damals gelöst hat... *scanner aufschraub*
    Die haben damals pro Motor 2 PBL 3717 eingesetzt. Das sind laut Datenblatt Schrittmotortreiber bis 1A mit integrierter Stromüberwachung. Das schöne ist, das man den Strom sogar von Außen beinflusssen kann. Hier gehts zum Datenblatt: click mich hart!

    Blöder Weise braucht man mit diesem Chip 6 Ausgänge vom Controller pro Motor.


    So, jetzt habe ich mir gedacht, das wir basierend auf hennes Code und nem "etwas" :rolleyes: modifiziertem Transciever das ganze ans laufen kriegen.

    Hier mal der Plan:
    [Blocked Image: http://img514.imageshack.us/img514/1185/dmxschwi8.th.gif]

    Auf Pa2-Pa7 liegt der erste Motortreiber, auf Pa1 der erste Referenzschalter.
    Gleiches spiel auf Port d mit dem zweiten Motor.
    Dann ist noch Led 2 auf Pe1 umgezogen, da der 10. Dip ja nicht gebraucht wird.
    Was auf Portb abgeht ist erst mal unwichtig, das ist später für die Goboeinheit. Dann ist noch die galvanische Trennung des DMX-Signals von DE dazu gekommen.
    Soweit die Hardware.

    Als Basis für die Software dient das erste von Henne gepostete ustep Archiv ohne Microstepping. Was ich bisher gemacht habe:
    - Ausgang für die zweite Led angepasst
    - Schrittfolge für die Treiber Ics eingegen
    -Ausgansport für den zweiten Motor angepasst und alles (bis auf's Dmx In) rausgeschmissen, was da vorher war

    Was jetzt passiert ist folgendes:

    -Er referenziert mit kleinen Aussetzern während der Fahrt und Stoppt mit reduziertem Haltestrom, so wie es eingestellt ist.
    -nach der Referenzfahrt reagiert er auf alle Dmx Fehler (Kein Signal, falsche Adresse)
    -Aber Daten bekommt er keine rein. Sprich die grüne Led leuchtet dauerhaft (das hab ich umgestellt) und am Motor tut sich auch nix.

    Hat jemand ne Idee, woran es liegt?

    Anbei mal das geänderte Projektarchiev.

  • hab noch eine kleine Frage zu deinem Transciever: Warum die galvanische Trennung? Beim DE Interface macht das Sinn, weil eben ein PC oder Laptop dran hängt, aber bei sowas... Da kostet der DC-DC Konverter und der Optokoppler mehr als die Bauteile für ein neues Board falls mal ein bisschen Spannung auf den Bus kommt
    Eventl. würde noch ein Elko auf der Seite nach außen nicht schaden

  • Henne:
    Auf deiner Site steht:

    Quote

    Zur Konfiguration von Beschleunigungen und maximalen Winkeln - also dem Verfahrbereich - befindet sich eine Software für Windows im Archiv, die eine Datei für das EEPROM des AVRs generiert.


    Welches Archive meinst du? Resources? Wie heißt die Datei denn?

  • Newly created posts will remain inaccessible for others until approved by a moderator. The last reply was more than 365 days ago, this thread is most likely obsolete. It is recommended to create a new thread instead.