PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Motorgeschwindigkeit auslesen



Tausendacht
16.08.2011, 10:54
Hallo

ich habe eine eigentlich recht simple Frage, allerdings im Forum nichts dazu gefunden (vielleicht ist sie ja zu simpel).

Ich möchte meinen Asuro, wenn er gegen etwa fährt, kurz anhalten, drehen, und anschließend mit der ursprünglichen Geschwindigkeit weiterfahren lassen. Dazu würde ich den anfänglichen Wert der Motorengeschwindigkeit auslesen und speichern.

Gibt es dafür einen Befehl, wie beispielsweiße MotorSpeed.Left?

Danke
Tausendacht

Edit:
oh, ich glaube ich bin in's falsche Unterverzeichnis gerutscht. Wollte eigentlich zu c-programmierung. Könnte mich jemand dorthin schieben?

021aet04
16.08.2011, 11:28
Du weißt doch mit welchem PWM du die Motoren angesteuert hast. Diesen Wert setzt du immer wieder ein. Ansonsten kannst du den Wert in eine Variable speichern, so in etwa (schreibe es nur in Grundzügen, du musst es abändern):

Motor PWM = 128 => Motor mit PWM 128 laufen lassen
Motor PWM gesichert = Motor PWM => Die aktuelle Motor PWM in eine Variable speichern
....... => weitere Kommandos wie z.B. drehen,...
Motor PWM = Motor PWM gesichert => Die Variable wieder als Motor PWM übergeben

Hoffentlich kennst du dich aus.

MfG Hannes

Tausendacht
16.08.2011, 12:38
Danke für die Antwort.

Ich hab in der Library nachgeschaut wie MotorSpeed definiert ist und dort gefunden:

inline void MotorSpeed (
unsigned char left_speed,
unsigned char right_speed )
{
OCR1A = left_speed;
OCR1B = right_speed;
}

Also hab ich dies für mich einfach umgedreht und den Wert aus OCR1A / OCR1B in die Variablen Left_Speed / Right_Speed gespeichert.

Ein Test sah aus, als wärs richtig. Geht diese Lösung? Auf was genau greife ich mit OCR1A / OCR1B zu?

radbruch
16.08.2011, 23:01
Hallo

Die Lösung "geht" und ist auch recht pfiffig. OCR1A/B sind die Vergleichsregister für die zwei Kanäle des Timer1. Wenn das Zählregister des Timers den gleichen Wert wie das jeweilige Vergleichsregister hat, wird der entsprechende PWM-Ausgang auf low geschaltet. So wird die Leistung für die Antriebe gesteuert. Und deshalb steht, wie du selbst schon in MotorSpeed() gefunden hast, der aktuelle Wert für die Geschwindigkeit in OCR1A/B. btw: Die Funktion sollte meiner Meinung nach besser MotorPWM() heißen.

Gruß

mic

Valen
17.08.2011, 12:28
Aber, den MotorSpeed werten sind eigentlich nur Motor-kraft werten. Wann man die aktuelle Radgeschwindigkeit haben möchte, sollst man erst die Geberscheiben von den Odometrie zahlen müssen.

oberallgeier
17.08.2011, 13:38
... MotorSpeed werten sind eigentlich nur Motor-kraft werten ... Wann man die aktuelle Radgeschwindigkeit haben möchte, sollst man erst die Geberscheiben ...Genau. Gerade beim Beschleunigen und Bremsen (Verzögern) unterscheidet sich PWM-Vorgabe und Ist-Drehzahl z.T. dramatisch. Beispiel beim Anfahren "volle Kanne" ist die PWM auf Maximum und die Fahrt (noch) auf Null. Beispiel (nicht vom asuro) siehe diesen Fahrtest (https://www.roboternetz.de/community/threads/36121-Autonom-in-kleinen-Dosen-R2_D03-Nachfolger-R3D01?p=422091&viewfull=1#post422091) mit Graphen zu Motor12: Istdrehzahl I_drz12 (rote Kreise) und PWM: iy12PWM (blaue Rauten).

Arkon
17.08.2011, 14:41
Das Auslesen der Odometrie ist doch nach Aufgabenstellung uninteressant. Tausendacht möchte bei einer Kollision, dass der Asuro sich abwendet und dann mit der vorherigen Geschwindigkeit weiterfährt.



if(Kollision)
{
Speicher_Links = OCR1A;
Speicher_Rechts = OCR1B;



MotorSPEED(100,100);

MotorDIR(RWD,RWD);
_delay_ms(1000);

MotorDIR(RWD,FWD);
_delay_ms(500);

MotorDIR(FWD,FWD);
MotorSPEED(Speicher_Links,Speicher_Rechts);

}


Das noch in brauchbares Asuro-C übersetzt müsste doch eigentlich machen was du willst oder?

Valen
17.08.2011, 15:33
Das Auslesen der Odometrie ist doch nach Aufgabenstellung uninteressant. Tausendacht möchte bei einer Kollision, dass der Asuro sich abwendet und dann mit der vorherigen Geschwindigkeit weiterfährt.

Das stimmt. Ich möchte nur gern erklären das es ein underschied/misverständnis gibt, MotorSpeed vs. Kraft/Drehmoment.