- fchao-Sinus-Wechselrichter AliExpress         
Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 34

Thema: ASURO: Motorsteuerungslibrary

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Anzeige

    Powerstation Test
    Danke, hatte gerade den gleichen Gedanken. Wir sollten, soweit es möglich ist, mit der gleichen Lib arbeiten.

    Der PI-Regler ist HIER auf den Seiten 27 bis 30 beschrieben :
    http://ag-vp-www.informatik.uni-kl.d...sanleitung.pdf
    Wer sich auch mal dran versuchen möchte - ich habe das Programm für den Motorola 6811 mal abgeschrieben:

    Code:
    /******************************************************************************* 
    * 
    * Description: Asuro PI-Regler 0.01
    * 
    *****************************************************************************/ 
    
    
    
    /*  Bestandteile der Geschwindigkeitssteuerung der Motoren:         */
    /*  Steuerkette zur Pulsbreiten-Modulation                          */
    /*  Geschwindikeitsregelkreis                                       */
    
    
    /*  >>>>>>>>> Steuerkette zur Pulsbreiten-Modulation <<<<<<<<<<    */
    
    
    int DDRD = 0x1009;          /* Port D Datenrichtung */
    int OC1M = 0x100c;          /* Ausgabevergleich 1 Maske */
    int OC1D = 0x100d;          /* Ausgabevergleich 1 Daten */
    int TOC1 = 0x1016;          /* Ausgabevergleich-Zeitgeber 1*/
    int TOC2 = 0x1018;          /* Ausgabevergleich-Zeitgeber 2 (inker Motor)  */
    int TOC3 = 0x101a;          /* Ausgabevergleich-Zeitgeber 3 (rechter Motor) */
    int TCTL1= 0x1020;          /* Zeitgeber-Steuerung 1, 8Bit Register  */
    
    /* motor_index: 0 => Linker Motor, 1 => Rechter Motor */
    int sign[2] = {1,1};            /* Vorzeichen fuer Motorlaufrichtung */
    
    
    /* Hilfsfunktionen */
    
    float abs(float arg)            /* Absolutwet */
    {
      if (arg < 0.0) return -arg;
      else           return arg;
    }
    
    int get_sign(float val)     /* Vorzeichen des arguments finden */
    {
      if (val > 0.0) return 1;
      else           return -1;
    }
    
    
    /* Einschrenkung des wertebereichs von val */
    float limit_range(float val, float low, float high)
    {
      if (val < low) return low;
      else if (val > high) return high;
      else return val;
    }
    
    void init_pwm()         /* initia. der Pulsbreiten-Modulation */
    {
      poke(DDRD,0b00110010); /* Port D; ausgabe 5,4,3,1; eingabe 0 */
      poke(OC1M,0b01100000); /* Ausgabevergleich aendert PA5 und PA6 */
      poke(OC1D,0b01100000); /* OC1-Vergleich schaltet PA5 und PA6 */
      bit_set(TCTL1,0b10100000); /* OC3 schaltet PA5 aus, OC2 schaltet PA6 aus */
      pokeword(TOC1,0);     /* wenn zeitgeber (TCNT) = 0, OC1 erfolgreich */
      pokeword(TOC2,1);     /* Mindestzeit fuer OC2 */
      pokeword(TOC3,1);     /* Mindestzeit fuer OC3 */
    }
    
    /* das Vorzeichen wird gesondert behandelt
       da wir nur einen Kanal-Encoder haben */
    float pwm_motor(float vel, int motor_index)
    {
      float vel_1;
      if (sign[motor_index] > 0)    /* wahl der laufrichtung */
        bit_set(portd,dir_mask[motor_index]);
      else
        bit_clear(portd,dir_mask[motor_index]);
      vel_1 = limit_range(vel,1.0,99.0); 
      /* 1 < Pulsbreiten-Modulation - Tastverhaeltnis 100 */
      pokeword(TOCx[motor_index], (int) (655.36 * vel_1));
      return vel_1;
    }
    
    
    /* Pulsbreiten_Modulationsbefehl hoechster Prioritaet */
    void move(float l_vel,float r_vel)  /* R,L vel: [-100.0. 100.0] */
    {
      sign[0] = get_sign(l_vel);    /* Laufrichtung */
      sign[1] = get_sign(r_vel);
      pwm_motor(abs(l_vel),0);      /* Pulsbreitenmod. setzen */
      pwm_motor(abs(r_vel),1);
    }
    
    
    /*    >>>>>>>>>>>>>>>>>>>>>>>>> Regelkreis <<<<<<<<<<<<<<<<<<<<<<<<    */
    
    float control_interval = 0.25;   /* Regelkreis so oft durchlaufen    */
    float des_vel_clicks   = 0.0;   /* Geschw.-Sollwert in Imp. per Zeitinterw. */
    float des_bias_clicks  = 0.0;   /* Gewuenschte Vorspannung in Imp. per Zeitinterw. */
    float power[2] = {0.0,0.0};     /* Einschaltbefehl zum Motor    */
    float integral = 0.0;           /* Integral der Geschw.differenz */
    float k_integral = 0.10;        /* Integraler Fehlerzuwachs     */
    float k_pro     = 1.0;          /* Proportionaler Zuwachs       */
    
    /* Setzen, Speichern von power */
    void alter_power(float error,int motor_index)
    {
      power[motor_index] = limit_range(power[motor_index] + error, 0.0, 100.0);
      pwm_motor(power[motor_index], motor_index);
    }
    
    float integrate( float left_vel, float right_vel, float bias)
    {
      float integral = limit_range((integral + left_vel + bias - right_vel), -1000.0,1000.0);
      return integral;
    }
    void speed_control()
    {
      int left_vel, right_vel,  lweg=0,rweg=0;
      float integral_error, left_error, right_error;
      while(1)
      {
        left_vel =  get_left_clicks();
        right_vel = get_right_clicks();
        rweg += right_vel;
        lweg += left_vel;
         integral_error = k_integral * integrate((float)left_vel, (float)right_vel, des_bias_clicks);
        left_error = k_pro * (des_vel_clicks - (float)left_vel - integral_error);
        right_error = k_pro * (des_vel_clicks - (float)right_vel + integral_error);
        alter_power(left_error, 0);
        alter_power(right_error, 1);
    printf("vel=%d:%d",right_vel,left_vel);
    printf(" weg=%d:%d\n",rweg,lweg);
    /* printf(" err=%d:%d\n",righterror,left_error); */
        sleep(control_interval);
      }
    }
    
    float k_clicks = 8.0 / 100.0;
    
    void set_velocity(float vel, float bias)
    {
      des_vel_clicks = k_clicks * vel;
      des_bias_clicks = k_clicks * bias;
      sign[0] = get_sign(vel -bias);
      sign[1] = get_sign(vel + bias);
    }
    
    void start_speed_control()
    {
      init_pwm();
      init_motors();
      init_velocity();
      get_right_clicks();
      get_left_clicks();
      start_process(speed_control());
    }
    
    
     
    
    
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    Hä? Ich versteh jetzt leider nicht, was das von dir jetzt genau bringt.

    Könnte mir mal jemand erklären, was ein PI-Regler ist?

    Danke

    Also ich hab jetzt mal die Lib erweitert, bzw. die Go() geändert.

    Leider kennt C ja keine Vorgabeargumte.

    Hier erstmal der Code:
    Code:
    void Go(int distance, int speed)
    {
    	int enc_count = 0;
    	int tot_count = 0;
    	int diff = 0;
    	int l_speed = speed, r_speed = speed;
    	enc_count=abs(distance);
    	
    //	enc_count=distance*10000;
    //	enc_count/=12823;
    	
    	Encoder_Set(0,0);		// reset encoder
    
    	MotorSpeed(l_speed,r_speed);
    	if(distance<0) MotorDir(RWD,RWD);
    	else MotorDir(FWD,FWD);
    
    	while(tot_count<enc_count) {
    		tot_count += encoder[LEFT];
    		diff = encoder[LEFT] - encoder[RIGHT];
    		if (diff > 0) { //Left faster than right
    			if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
    			else r_speed += 10;
    		}
    		if (diff < 0) { //Right faster than left
    			if ((r_speed > speed) || (l_speed > 244)) r_speed -= 10;
    			else l_speed += 10;
    		}
    	Encoder_Set(0,0);		// reset encoder
    	MotorSpeed(l_speed,r_speed);
    	Msleep(1);
    	}
    	MotorDir(BREAK,BREAK);
    	Msleep(200);
    }
    Noch kurz eine Erklärung:
    Diese Konstruktion "if ((l_speed > speed) || (r_speed > 244))" dient dazu, dass der Wert erstens nicht unter den eingestellten Speed und 2. nicht über 255 geht. Ich denke, der Rest ist ersichtlich.

    Es ist also ratsam, als maximal Geschwindigkeit, vielleicht 230 zu verwenden.

    Bitte mal test, und sonst nochmal melden, wenn Fehler drin sind.

    So long

    Andun
    Angehängte Dateien Angehängte Dateien
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Hallo Andun,

    zum PI-Regler:
    Ein Regler ist im allgemeinen in einer Regelschleife eingebaut.
    Zuerst wird die Differenz zwischen Soll- und Ist- berechnet und mit diesem Wert der Regler angesteuert.
    Bei einem PI-Regler ( proportional- integral- Regler ) wird die Differenz einfach mit einem Faktor multipliziert und zusätlich der Integrallwert der Differenz hinzuaddiert. (http://de.wikipedia.org/wiki/PID-Regler)

    Zu den Motorsteuerroutinen:
    Meiner Meinung nach ist der beste Test für Motorsteuerung das Zeichnen des Haus vom Nikolaus (https://www.roboternetz.de/phpBB2/ze...uro+wettbewerb)

    1. Nur wenn die Motorsteuerung wirklich exakt arbeitet kommt der Roboter wieder zum Ausgangspunkt zurück.

    2. Wenn man einen Stift an den Roboter montiert, ist sehr genau dokumentiert. wie gut der Gleichlauf der Regelung funktioniert.

    Gruss,
    stochri
    [/url]

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Hier die selbe, etwas verbesserte Libray.
    ( ausro.c endlich mit verbesserter Printstr-Funkiton, bei der man nicht die Buchstaben zählen muss )

    siehe auch:
    https://www.roboternetz.de/phpBB2/vi...r=asc&start=66

    Gruss,
    stochri
    Angehängte Dateien Angehängte Dateien

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.04.2005
    Ort
    Weilburg
    Beiträge
    676
    Zitat Zitat von stochri
    wenn Dein PI-Regler läuft, kannst Du das Ergebnis ja mal posten.
    Mein erstes Ergebniss ! Der ASURO fährt auch bei belastung geradeaus. Auch das langsam fahren sieht garnichtmal so schlecht aus.
    Angehängte Dateien Angehängte Dateien
    Prostetnic Vogon Jeltz

    2B | ~2B, That is the Question?
    The Answer is FF!

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    12.06.2005
    Ort
    Südwestdeutschland
    Beiträge
    1.147
    Blog-Einträge
    3
    Hallo Vogon,
    ich habe Deinen Code mal überflogen. Sieht nicht schlecht aus von weitem und ist sauber strukturiert.

    Du bist der erste hier im Forum, der mal einen PI-Regler auf dem ASURO realisiert hat. Gratulation.

    Heute komme ich leider nicht mehr dazu, das ganze zu auszuprobieren, aber demnächst ...

    Kleiner Tip: es wäre nicht schlecht, wenn Du Deinen Nickname in den Header der Files schreibts, dann kann man das Ganze Dir zu ordnen. Wenn Du Dir schon so viel Arbeit mit dem Programmieren machst, solltest Du ( bzw. Dein Nick ) auch die Loorbeeren ernten.

    Viele Grüße,
    stochri

  7. #17
    Benutzer Stammmitglied
    Registriert seit
    10.08.2005
    Beiträge
    32
    ich hab dazu mal ne frage:
    wie berücksichtigt ihr unterschiedliche untergründe und die beiden möglichen Odometrieauflösungen?
    Sollte man nicht noch einen proportionalitätsfaktor einbauen und eine dokumentation zur messung schreiben?

    oder konkret:
    wie habt ihr den proportionalitätsfaktor berechnet? ich hab die gröber odometriescheibe benutzt und nun dreht der roboter zu weit...

  8. #18
    Benutzer Stammmitglied
    Registriert seit
    05.01.2006
    Ort
    Frankfurt/zeilsheim
    Alter
    32
    Beiträge
    49
    Hey habe ien frage mit welchen pogramm kann man die sahcne an sehen

    mfg robotcool

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    36
    Beiträge
    826
    also wir haben die feine scheibe verwendet. Du müsstest halt die Berechnungen alle umrechnen ....

    Ansehen kann man die Programme so wie aller anderen Dateien auch: Im Editor ... Wenn du das allerdings nciht weißt, dann kannst du mit dem Inhalt wahrscheinlich auch nciht viel anfangen.

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  10. #20
    Benutzer Stammmitglied
    Registriert seit
    10.08.2005
    Beiträge
    32
    und an eben diesen berechnungen bin ich interessiert.
    ihr seid ihrgendwie auf einen faktor von 166/360 gekommen - nach meiner Messung stimmt er, wenn ich ihn auf 100/360 ändere.

    bei der Go Funktion ist der faktor jedoch auskommentiert, sodass sich die angabe wohl auf die anzahl der "ticks" bezieht.

    naja ich bin grad sowieso dabeid as ganze etwas umzukrempeln...

Seite 2 von 4 ErsteErste 1234 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test