tausende if-else vermeiden?



  • Hallo liebes Forum,
    da ich jetzt schon eine geschlagene Stunde am Schreibtisch sitze und mir keine Lösung eingefallen ist, wende ich mich an euch.

    Ich steuere einen Schrittmotor mittels Arduino und Schrittmotortreiber an. Da das ganze so schnell wie möglich passieren soll, will ich die Zeit zwischen den Impulsen, die den Motor einen Schritt weiter wandern lässt, möglichst gering halten. Nun hat jeder Motor eine gewisse Beschelunigungs- bzw. Abbremsphase. Grade bei der Beschleunigung muss darauf geachtet werden, dass (in meinem konkreten Fall), die ersten 26 Schritte immer verschiedene Zeiten zwischen den Impulsen benötigt. Zwischen Impuls 1 und 2 z.b. 21ms, zwischen 2 und 3 dann 9ms, zwischen 3 und 4 dann 6,5ms usw. Leider kommt bei einer Funktionsapproximierung keine sinnvolle Funktion aus, sodass ich meine ersten 26 Zeiten manuell aufschreiben muss. Das ganze sieht dann in etwa so aus:

    digitalWrite(pinExternClock, HIGH);
    digitalWrite(pinExternClock, LOW);
    delayMicroseconds(21290);//1
    stepHelp--;
    digitalWrite(pinExternClock, HIGH);
    digitalWrite(pinExternClock, LOW);
    delayMicroseconds(8820);//2
    stepHelp--;
    digitalWrite(pinExternClock, HIGH);
    digitalWrite(pinExternClock, LOW);
    delayMicroseconds(6770);//3
    stepHelp--;
    

    Nach den 26 Schritten soll dann eine for-Schleife für die weiteren Schritte dienen, die eine konstante Latenz zwischen den Schritten hat. Jetzt ist mein Problem, dass wenn ich z.b. nur 5 Schritte mache, dass ich quasi nach dem fünften Schritt aus der Funktion springe. Ich möchte nur ungern vor jedem Schritt mit einer if-Anweisung überprüfen, wieviel Schritte noch übrig sind, weil ich sonst 26 if-Anweisungen benutzen muss. Was ich bräuchte ist so etwas wie eine while-Schleife, die kontinuierlich überprüft ob der Grenzwert erreicht wurde oder nicht. Zusätzliche Anforderung ist, dass das ganze ohne großen Rechenaufwand passieren muss, da das Arduino sonst mehr Zeit zum rechnen brauch, als die Latenz zwischen den Impulsen ist und somit Schritte verschluckt werden.

    Ich hoffe ich konnte mein Problem so gut wie möglich beschreiben.

    Grüße



  • Wahrscheinlich verstehe ich das Problem nicht ganz; trotzdem:

    int[] bla = {21290, 8820, ...};
    for(int i = 0; i < 26; ++i)
    {
      digitalWrite(pinExternClock, HIGH);
      digitalWrite(pinExternClock, LOW);
      delayMicroseconds(bla[i]);
      stepHelp--;
    }
    


  • Wahrscheinlich verstehe ich das Problem nicht ganz; trotzdem:

    Jockelx schrieb:

    Wahrscheinlich verstehe ich das Problem nicht ganz; trotzdem:

    int[] bla = {21290, 8820, ...};
    for(int i = 0; i < 26; ++i)
    {
      digitalWrite(pinExternClock, HIGH);
      digitalWrite(pinExternClock, LOW);
      delayMicroseconds(bla[i]);
      stepHelp--;
    }
    

    tatsächlich war es das schon...jetzt mach ich eine for-schleife für die ersten 26 schritte und danach einfach eine weitere, falls noch schritte übrig sind. übung macht den meister! danke für die einfache lösung, sorry für die dumme frage.

    Grüße



  • Schau Dir das Kompositum-Pattern an.
    http://de.wikipedia.org/wiki/Kompositum_(Entwurfsmuster)

    http://www.c-plusplus.net/forum/194368-full

    So fasse ich viel redundante Bedingungsfragmente zusammen. -SQL, -if, -switch etc.


Log in to reply