[AVR GCC Kurs2] Stepper-Interface

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

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

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

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