- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 14

Thema: Aktelle Lib 2.7.1 und MY_MOTOR_DIFF

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    So, da habe ich es nun geschafft nach Hause zu kommen.

    Hier erst einmal der Code für die Funktion MotorSpeed()
    Wer es selber einbauen möchte, findet die Funktion je nach LIB-Version in unterschiedlichen Dateien.
    - Asuro-Original-CD in asuro.c
    - Asuro-LIB bis Version V02.70rc2 in motor.c
    - Asuro-LIB ab Version V02.70rc3 in motor_low.c
    - In der nächsten Asuro-LIB dann auch vorhanden.

    Code:
    inline void MotorSpeed (
      unsigned char left_speed,
      unsigned char right_speed)
    {
               int  l_speed;
               int  r_speed;
    
      if (MY_MOTOR_DIFF != 0)
      {
        /*
          Das Ganze macht nur Sinn, wenn mindestens ein Motor fahren soll.
        */
        if (left_speed  > 0  ||
            right_speed > 0)
        {
          /*
            Bei positivem MY_MOTOR_DIFF wird der rechte Motor verstaerkt.
            Bei negativem MY_MOTOR_DIFF wird der linke  Motor verstaerkt.
          */
          l_speed = left_speed  - MY_MOTOR_DIFF / 2;
          r_speed = right_speed + MY_MOTOR_DIFF / 2;
    
          /*
            Wertebereich von 0 bis 255 pruefen.
            Unterscheiden nach positiver, bzw. negativer Vorgabe.
          */
          if (MY_MOTOR_DIFF > 0)
          {
            /*
              Bei positivem MY_MOTOR_DIFF kann nur die rechte Seite > 255 werden.
            */
            if (r_speed > 255)
            {
              /*
                Um die Differenz von MY_MOTOR_DIFF weiterhin zu erhalten, wird nun
                die linke Seite noch weiter reduziert, und die rechte Seite auf
                das zulaessige Maximum gesetzt.
              */
              l_speed -= (r_speed - 255);
              r_speed  = 255;
            }
            if (l_speed < 0)
            {
              /*
                Die linke Seite ist nun unter dem zulaessige Minimum von 0.
                Auch dies muss korrigiert werden.
              */
              l_speed = 0;
            }
          }
          else
          {
            /*
              Bei negativem MY_MOTOR_DIFF kann nur die linke Seite > 255 werden.
            */
            if (l_speed > 255)
            {
              /*
                Um die Differenz von MY_MOTOR_DIFF weiterhin zu erhalten, wird nun
                die rechte Seite noch weiter reduziert, und die linke Seite auf
                das zulaessige Maximum gesetzt.
              */
              r_speed -= (l_speed - 255);
              l_speed  = 255;
            }
            if (r_speed < 0)
            {
              /*
                Die rechte Seite ist nun unter dem zulaessige Minimum von 0.
                Auch dies muss korrigiert werden.
              */
              r_speed = 0;
            }
          }
    
          left_speed  = l_speed;
          right_speed = r_speed;
        }
      }
    
      OCR1A = left_speed;
      OCR1B = right_speed;
    }
    Keine Bange vor der Länge der Funktion.
    Ist der Define für MY_MOTOR_DIFF mit 0 angegeben, wird gar kein zusätzlicher Code erzeugt. Sonst werden gerade mal um 45 Byte zusätzlich benötigt.

    Gruß Sternthaler

    P.S.: Ich habe mal mit verschiedenen Geschwindigkeiten die Wirkung getestet. Natürlich bekommt man keine gerade Fahrt über alle Geschwindigkeiten, allerdings sind die Abweichungen sehr gering.
    Angehängte Dateien Angehängte Dateien
    Lieber Asuro programieren als arbeiten gehen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test