[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!


  • Dieser Thread baut auf dem vorigen GCC-Kurs (Steuerung von DC-Motoren) auf:

    Die ganzen Grundlagen mit AVR-Studio, LED-Indikator, DMX-Empfang sind somit durch und werden nicht mehr speziell thematisiert!

    Hier soll nun der Transceiver als Interface zu einer Schrittmotorkarte von Tippfehler eingesetzt werden. (Ich selbst halte eigentlich mehr von den integrierten Trinamic Treibern/Controllern à la TMC222 - aber was hab ich schon zu melden ;)

    zunächst die Frage an Tippfehler:
    Wie heißt die Karte und Hersteller?
    Was brauchst Du für Signale?
    Welchen Winkel hat ein Schritt bei Dir mit der Karte?
    Welche Winkel willst Du abfahren können?
    Wie läuft das Homing (Finden des Referenzpunktes) ab?
    Ist die Firmware der Karte verfügbar? Was für eine MCU werkelt darauf? (Evtl. könnte man irgendwann die Karte selbst RDM-fähig machen...)

    Los geht's!

  • sooo

    also ich wäre bereit

    mh ist verkabelt
    treiber ist verkabelt (smc11von nanotec)
    transceiver ist verkabelt (von henne)

    porta pa7 = Richtung(DIR) L(<0,8V) , H(3,15V<H<5,5V)
    porta pa6 = Takt (CLK) Low<0,8V, 3,15V<High<5,5V Pulsbreite > 2¼s, Pulspause >2¼s

    also der mh soll sich 360° drehen

    der motor macht 200 steps, der treiber macht 16tel schritt, und die mechanik untersetzt 8:1
    = 25600 schritte (steps) pro 360° umdrehung.
    wenn man nun 8bit nimmt, wären das pro geänderten dmx-wert 100 steps

    ich denke wir fangen mit 8bit modus an

    wenn alles geht kann man ja mal 16bit probieren . oder was sagst du henne??

  • Dann fangen wir mal an:

    Lösche aus dem Motorprojekt den ganzen Krempel mit der Richtungsänderung und die Soft-PWM raus.

    Übrig bleibt bei mir in der DMX-Behandlungsfunktion:

    Code
    if (Flags &(1<<EVAL_DMX))	//DMX universe wurde refreshed
         {
         Flags &= ~(1<<EVAL_DMX);
         IndFlags |= (1<<VALID_DMX); //gültiges DMX-Signal angekommen
         }

    Inkludiere nun die Stepper Library genauso wie die DMX- und die Indikator Library.

    Rufe bei der Initialisierungsfunktion auch die Initialisierung der Stepper-Lib auf.

    Edited once, last by Hendrik Hölscher (August 17, 2008 at 12:55 PM).

  • LED bleibt drin.

    Die Stepper Lib habe ich in Deinem Endlos-Thread zum MH auf den letzten Seiten verlinkt...

    Ich habe gerade das Datenblatt durchgelesen: Das Ding scheint eher besser als der TMC222 für unsere Zwecke geeignet zu sein 8)
    (Ich nehm also mein Genörgel zurück und behaupte das Gegenteil...)

    Korrektur: Pulsweite ist minimal 1us.

    Edited once, last by Hendrik Hölscher (August 17, 2008 at 1:07 PM).

  • Nun wird's tricky:

    Ich nutze in der Lib die Delay-Funktion. Das ist eine automatisch generierte Warteschleife, wozu aber dem GCC Deine Taktfrequenz bekannt sein muss.

    Die gibst Du für den GCC bei dem Zahnrad-Icon Fenster ein.
    Für die korrekte Simulation gibst Du die Frequenz auch nach der Kompilierung unter Debug, AVR Simulator Options ein.

    Wir werkeln mit 8MHz.

  • Nun zur Simulation:

    Es gibt häufig mal Dinge, die dich nicht interessieren aber viel Zeit in der Simulation verschlingen (Warteschleifen, Arrays kopieren, Sortieren,...)

    Zum "Überspringen" markierst Du die Zeile, ab der es wieder interessant wird und drückst F9. So erstellst Du einen Breakpoint.
    Drückst Du nun F5 (Run), wird schnell alles runtersimuliert (ohne Anzeige) bis zu Deinem Breakpoint.

  • Nun etwas Anderes:

    Wir haben momentan den 16bit-Timer1 würde die Stepper verplant - aber eigentlich nicht viel zu tun und auch nicht besonders schnell.

    Da wäre es doch sinnvoller, wieder Timer0 als Zeitbasis zu nehmen und den Rest wieder durch Runterzählen von Countervariablen zu erledigen...

    Was meinst Du? Mal nachrechnen?

  • Quote

    Original von Hendrik Hölscher

    Wir haben momentan den 16bit-Timer1 würde die Stepper verplant - aber eigentlich nicht viel zu tun und auch nicht besonders schnell.

    Da wäre es doch sinnvoller, wieder Timer0 als Zeitbasis zu nehmen und den Rest wieder durch Runterzählen von Countervariablen zu erledigen...

    wo haben wir den 16bit-Timer1 benutzt ??

    bei mir steht timer0

    uint8_t count= 1; //counter
    .
    .
    .
    //Timer0
    TCCR0= (1<<CS00);
    TIMSK= (1<<TOIE0);

  • Dazu müssen wir den Code verstehen:

    Wir sehen oben eine Tabelle für die Beschleunigung.
    Der kleineste Wert ist 4522, der nächst größere 4566.

    Durch Klicken auf das Fernglas-Icon und "mark all" sehen wir, dass diese Tabelle in der Funktion check_accel() verbraten wird.
    Dort wird der Wert abschließend skaliert:

    uint32_t tmp= (uint32_t)pgm_read_word(&Ramp[abs(Stp->Speed)]);
    Stp->StpRate= (tmp * (0xFF -ACC))>>8;

    Die zweite Zeile bedeutet:
    Schrittzeit= Tabellenwert*(255 -KONSTANTE)/255
    (Die Konstante entspricht Deiner Beschleunigung.)

    Gehen wir mal von einem mittleren Wert aus: 128

    Wir kommen auf:
    2252
    2274

    Damit werden nun die Vergleichsregister des Timer1 geladen:
    "Nächste Interruptzeit"= "letzte Interruptzeit"+Schrittzeit

    Nun schauen wir uns an, wie Timer1 initialisiert wird: Der Timer wird mit 1/8 der Quarzfrequenz getaktet.

    Der Unterschied zwischen den beiden letzten Schrittzeiten beträgt also gerade mal 176 Quarztakte...

    Ich denke wir sollten daher von der Timer0-Geschichte die Finger lassen, da wir das nicht vernünftig aufgelöst bekommen...

    Edited once, last by Hendrik Hölscher (August 17, 2008 at 1:40 PM).

  • Schau mal, was die Initialisierung der Stepper-Lib macht ;)

    Timer0 ist ein Rest aus der DC-Motorsteuerung...

  • jetze:rolleyes:

    du warst in der lib_stepper.c

    und meinst diese tabelle

    const uint16_t Ramp[] PROGMEM = { //acceleration, deceleration (step durations)
    27145, 20829, 17560, 15471, 13987, 12862, 11972, 11244, 10635, 10115, 9665, 9270, 8920, 8606,
    8324, 8068, 7834, 7619, 7421, 7238, 7067, 6908, 6760, 6620, 6489, 6366, 6249, 6138,
    6033, 5933, 5839, 5748, 5662, 5579, 5500, 5424, 5351, 5281, 5214, 5149, 5087, 5026,
    4968, 4912, 4858, 4805, 4754, 4705, 4657, 4611, 4566, 4522
    };

    mfg maik

    kann ich timer0 also rausnehmen ??

  • T0 kann wech.

    Also wir sind an dem Punkt:
    Timer1 müsste so bleiben. Timer0 würde ich gern frei lassen.
    Uns fehlt eine Zeitbasis für das LED-Geblinke.

    Was siehst Du denn im Simulator noch für eine Interruptquelle für Timer1 (Register dafür ist TIMSK - Timer interrupt mask)?

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