ASURO Library  2.80
Funktionen
encoder.c-Dateireferenz

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

#include "asuro.h"
#include "myasuro.h"
Include-Abhängigkeitsdiagramm für encoder.c:

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]distanceDistanz in mm (- rueckwaerts, + = vorwaerts)
Bei 0 wird degree fuer einen Turn benutzt.
[in]degreeWinkel (- rechts, + links)
[in]speedGeschwindigkeit (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.
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.

{
unsigned long enc_count;
int tot_count = 0;
int diff = 0;
int l_speed = speed, r_speed = speed;
/* stop the motors until the direction is set */
MotorSpeed (0, 0);
/* if distance is NOT zero, then take this value to go ... */
if (distance != 0)
{
/* calculate tics from mm */
enc_count = abs (distance) * 10000L;
enc_count /= MY_GO_ENC_COUNT_VALUE;
if (distance < 0)
else
}
/* ... else take the value degree for a turn */
else
{
/* calculate tics from degree */
enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE;
enc_count /= 360L;
if (degree < 0)
else
}
/* reset encoder */
EncoderSet (0, 0);
/* now start the machine */
MotorSpeed (l_speed, r_speed);
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;
}
/* reset encoder */
EncoderSet (0, 0);
MotorSpeed (l_speed, r_speed);
Msleep (1);
}
Msleep (200);
}