encoder.c-Dateireferenz

Funktionen zur Vorgabe von Fahrstrecken und Drehungen. Mehr ...

#include "asuro.h"
#include "myasuro.h"

gehe zum Quellcode dieser Datei

Funktionen

void GoTurn (int distance, int degree, int speed)
 Faehrt eine bestimmte Strecke mit einer bestimmten Geschwindigkeit. (Autor: stochri)
ODER
Dreht um einen bestimmten Winkel mit einer bestimmten Geschwindigkeit. (Autor: stochri)
Benutzt die Odometrie Sensoren im Interrupt Betrieb.
Vor dem ersten Aufruf muss deshalb EncoderInit() aufgerufen werden.


Ausführliche Beschreibung

Funktionen zur Vorgabe von Fahrstrecken und Drehungen.

Siehe auch:
Defines zum setzen von Port's und Konfigurationen in asuro.h
TRUE, FALSE, LEFT, RIGHT
Version:
V--- - KEINE original Version von der ASURO CD vom DLR

V--- - bis zum 07.01.2007 -
Bitte in Datei CHANGELOG nachsehen.
Das Grundgeruest dieser Funktionen wurde von stochri erstellt.

V001 - 13.01.2007 - m.a.r.v.i.n
+++ Alle Funktionen
Zerlegte Sourcen in einzelne Dateien fuer eine echte Library.

V002 - 27.01.2007 - Sternthaler
+++ Alle Funktionen
Kommentierte Version (KEINE Funktionsaenderung)

V003 - 20.02.2007 - m.a.r.v.i.n
+++ GO()
+++ Turn()
Korrekturfakturen aus myasuro.h verwenden

V004 - 07.06.2007 - Sternthaler
+++ Go() Entfaellt
+++ Turn() Entfaellt
+++ GoTurn() NEU
Die Funktion GoTurn() ersetzt die Funktionen Go() und Turn() ersatzlos. Um allerdings bestehende Programme nicht umbauen zu muessen, gibt es Macros, die dann GoTurn() aufrufen in asuro.h

V005 - 27.06.2007 - Sternthaler
+++ GoTurn()
Im Beispiel zur Funktion die Variablendefinition in der for()-Schleife fuer i entfernt, da sie nicht immer uebersetzbar ist.

Definiert in Datei encoder.c.


Dokumentation der Funktionen

void GoTurn ( int  distance,
int  degree,
int  speed 
)

Faehrt eine bestimmte Strecke mit einer bestimmten Geschwindigkeit. (Autor: stochri)
ODER
Dreht um einen bestimmten Winkel mit einer bestimmten Geschwindigkeit. (Autor: stochri)
Benutzt die Odometrie Sensoren im Interrupt Betrieb.
Vor dem ersten Aufruf muss deshalb EncoderInit() aufgerufen werden.

Parameter:
[in] distance Distanz in mm (- rueckwaerts, + = vorwaerts)
Bei 0 wird degree fuer einen Turn benutzt.
[in] degree Winkel (- rechts, + links)
[in] speed Geschwindigkeit (Wertebereich 0...255)
Rückgabe:
nichts
Siehe auch:
MACRO Go() und MACRO Turn() koennen weiterhin aufgerufen werden um bestehenden Programmcode nicht umschreiben zu muessen.

In der globale Variable encoder, werden die Hell-/Dunkelwechsel der
Encoderscheiben im Interruptbetrieb gezaehlt.

Hinweis:
Die Berechnung der zu fahrenden Ticks beruht auf der Annahme, dass die
Anzahl der schwarzen Teilstuecke und die Raddurchmesser wie bei stochri sind.
(Sternthaler) Vermutung, dass der Hersteller unterschiedlich grosse Raeder
ausgeliefert hat, da die Berechnung in dieser Form bei Sternthaler nicht
funktioniert.
Beispiel:
(Nur zur Demonstration der Parameter/Returnwerte)
  // Laesst den Asuro ein Quadrat von 200 mm fahren,
  // bei einer Geschwindigkeit von 150.
  EncoderInit ();
  for (i = 0; i < 4; i++)
  {
    GoTurn (200,  0, 150);  // entspricht Go (200, 150)
    GoTurn (  0, 90, 150);  // entspricht Turn (90, 150)
  }

Definiert in Zeile 128 der Datei encoder.c.

00132 {
00133   unsigned  long  enc_count;
00134             int   tot_count = 0;
00135             int   diff = 0;
00136             int   l_speed = speed, r_speed = speed;
00137 
00138   /* stop the motors until the direction is set */
00139   MotorSpeed (0, 0);
00140 
00141   /* if distance is NOT zero, then take this value to go ... */
00142   if (distance != 0)
00143   {
00144     /* calculate tics from mm */
00145     enc_count  = abs (distance) * 10000L;
00146     enc_count /= MY_GO_ENC_COUNT_VALUE;
00147 
00148     if (distance < 0)
00149       MotorDir (RWD, RWD);
00150     else
00151       MotorDir (FWD, FWD);
00152   }
00153   /* ... else take the value degree for a turn */
00154   else
00155   {
00156     /*  calculate tics from degree */
00157     enc_count  = abs (degree) * MY_TURN_ENC_COUNT_VALUE;
00158     enc_count /= 360L;
00159 
00160     if (degree < 0)
00161       MotorDir (RWD, FWD);
00162     else
00163       MotorDir (FWD, RWD);
00164   }
00165 
00166   /* reset encoder */
00167   EncoderSet (0, 0);
00168 
00169   /* now start the machine */
00170   MotorSpeed (l_speed, r_speed);
00171 
00172   while (tot_count < enc_count)
00173   {
00174     tot_count += encoder [LEFT];
00175     diff = encoder [LEFT] - encoder [RIGHT];
00176 
00177     if (diff > 0)
00178     { /* Left faster than right */
00179       if ((l_speed > speed) || (r_speed > 244))
00180         l_speed -= 10;
00181       else
00182         r_speed += 10;
00183     }
00184 
00185     if (diff < 0)
00186     { /* Right faster than left */
00187       if ((r_speed > speed) || (l_speed > 244))
00188         r_speed -= 10;
00189       else
00190         l_speed += 10;
00191     }
00192     /* reset encoder */
00193     EncoderSet (0, 0);
00194 
00195     MotorSpeed (l_speed, r_speed);
00196     Msleep (1);
00197   }
00198   MotorDir (BREAK, BREAK);
00199   Msleep (200);
00200 }


Erzeugt am Sun Nov 18 18:24:53 2007 für ASURO Library von  doxygen 1.5.1-p1