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


  • Jaaa - aber die Richtung ist derzeit auch futsch.

    Ich denke, wir gehen den einfachten Weg und prüfen die Speeds auf positive oder negative Werte und setzen die Geschwindigkeit entsprechend.

    Abgesehen davon ist auch noch ein Denkfehler bei den Steps...
    (Derzeit halten wir nicht an.)

    Nicht wirklich schön aber richtig wäre somit:

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

  • Yep:

    Deswegen schau mal oben, was bei einer Speed von 0 passiert...


    Fehlt nur noch die Skalierung der Sollwinkel auf 16it:

    DMXsoll= ch1*255+ch2
    WinkelSoll= (DmxSoll*MaxSchritte)/2^16

    Da "*255" einem Linksschieben um 8bit entspricht (Val<<8)
    und einem Teieln durch 2^16 ein Rechtsschieben um 16bit
    (Val>>16)

    Funktioniert so etwas mit:

    Code
    uint32_t tmp= ((uint32_t)DmxField[0]<<8) +(uint32_t)DmxField[1];
    tmp= ((tmp * X.Max)>>16);
    Xtarget= tmp;

    Das (uint32_t) ist ein sogenannter TypeCast:
    Damit werden die Daten von DmxField auf 32bit aufgeblasen, damit es bei der späteren Multiplikation nicht zu Überläufen kommt.

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

  • also so

    void check_step(void)
    {
    if (X.State &(1<<NXT))
    {
    check_accel(&X, Xtarget);
    if (X.Speed > 0)
    {
    PORTA |= (1<<PA6); //Schritt
    PORTA |= (1<<PA7); //pos. Richtung
    }
    else if (X.Speed < 0)
    {
    PORTA |= (1<<PA6);
    PORTA &= ~(1<<PA7); //neg. Richtung
    }
    X.State &= ~(1<<NXT);
    PORTA &= ~(1<<PA6);
    }

    if (Y.State &(1<<NXT))
    {
    check_accel(&Y, Ytarget);
    if (Y.Speed > 0)
    {
    PORTA |= (1<<PA4); //Schritt
    PORTA |= (1<<PA5); //pos. Richtung
    }
    else if (Y.Speed < 0)
    {
    PORTA |= (1<<PA4);
    PORTA &= ~(1<<PA5); //neg. Richtung
    }
    Y.State &= ~(1<<NXT);
    PORTA &= ~(1<<PA4);
    }
    }

  • Fehlt nur noch die Skalierung der Sollwinkel auf 16it in der DMX-Auswertung:

    DMXsoll= ch1*255+ch2
    WinkelSoll= (DmxSoll*MaxSchritte)/2^16

    Da "*255" einem Linksschieben um 8bit entspricht (Val<<
    und einem Teieln durch 2^16 ein Rechtsschieben um 16bit
    (Val>>16)

    Funktioniert so etwas mit:

    Code
    uint32_t tmp= ((uint32_t)DmxField[0]<<8) +(uint32_t)DmxField[1];
    tmp= ((tmp * X.Max)>>16);
    Xtarget= tmp;


    Das (uint32_t) ist ein sogenannter TypeCast:
    Damit werden die Daten von DmxField auf 32bit aufgeblasen, damit es bei der späteren Multiplikation nicht zu Überläufen kommt.

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

  • so habe aus dem code mal ne *.hex gemacht und auf den atmel geladen.

    sieht noch nicht gut aus, meine dmx led am transceiver blinkt??im gleichen takt wie led1 von hennes transceiver. ebenso der stepper, summt im takt der led's.

    hab also erstmal ausgemacht und nicht weiter getestet.

    mal schaun wann henne wieder da ist:D

    mfg maik

  • Bei 50Einträgen geht die Rampe über 50Steps.

    Die Endgeschwindigkeit ist abhängig von dem von Dir gewählten Beschleunigungsfaktor und der Tabellengröße.

    Viele Grüße,
    Hendrik

    Die Tabelle hatte ich mit Matlab erzeugt. Ich versuche mal, die Formel zu finden...

  • anbei das Matlab-Script:

    Die Formeln zur Berechnung stammen aus einer Application Note von ATMEL. (Ich glaube es war die linear speed control...)

  • ich habe da auch was gefunden:rolleyes:

    zum thema rampe:
    [url=http://www.fernando-heitor.de/component/opti…pic,469.msg2149]http://www.fernando-heitor.de/component/opti…pic,469.msg2149[/url]

    eine berechnung der werte im atmel ?? geht das von der rechen zeit her??
    so ähnlich hatte ich mir das auch gedacht, das er einfach bei jedem schritt die frequenz um einen bestimmten wert erhöht oder verringert.

    wenn die rampe also 100 steps lang ist , und bei jedem step um 5 Hz erhöht wird, kommt mann von 0 auf 500 hz in 100 steps.
    das wäre natürlich linear.

    mfg maik

  • Da Du in einem AVR mit Wurzeln, Brüchen und trigonometrischen Funktionen nicht weit kommst, macht man sowas mit Lookup Tables.

    meine Quelle und mein Script dafür habe ich Dir gegeben.

  • also die Application Note von ATMEL habe ich gefunden.

    aber ich habe kein matlab. auch ein download der trialversion davon ist fehlgeschlagen.


    oki lassen wir de rampe erstmal weg:rolleyes:
    wie gehts weiter, habe eine hex file erzeugt mit winavr, aus der make-file von avrstudio.
    habe diese nun mit ponyprog übertragen. sie geht aber nicht!!
    die rote led (led1) blinkt, der motor summt im takt dazu, und auch die dmx-led meines interfaces blinkt im gleichen takt.

    mfg maik

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