PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servoposition abfragen



PCF8574P
14.01.2009, 18:10
Hallo,

Bei einen Servo kann man ja die Servoposition über das PWM-Kabel abfragen.
In Bascom wird dieses ja schon im servo befehl gemacht.

Da ich aber auf C umsteige würde ich gerne wissen wie das ganze in C geht.
Wisst ihr da was?

MFG Max

The Man
14.01.2009, 19:59
Hi,

also solange wir von den grbräuchlichen Modellbauservos reden, wird die Position des Servos über das PWM vorgegeben und nicht abgefragt.

Für den Fall, dass du das Signal nicht kennst:
Periodendauer: 18ms
Mindestlänge von HIGH: 1ms (Anschlag auf einer Seite)
Maximallänge von HIGH: 2ms (Anschlag auf der anderen Seite)

Das heißt du hast nur 1ms, um die Schrittauflösung zu realisieren.

Da gibt es prinzipiell erstmal zwei Möglichkeiten.
1) Die HIGH Signale der einzelnen Servos werden hintereinander geschachtelt. Und zwar so, dass wenn der letzte Servo bedient ist, dass wieder mit dem ersten angefangen wird. Haken an der Sache ist, da ein HIGH bis zu 2ms dauern kann, wird es ab einer Servozahl von 8 langsam kritisch.

Daher Möglichkeit 2:

Ein Programm, das in der Lage ist, mehrere HIGH Signale gleichzeitig zu bedienen. Das kann man so anfangen, das während der min. 16ms langen LOW phase, anhand der Sollposition die Zeitpunkte vorberechnet werden, an denen das HIGHsignal des einzelnen Servos wieder low geht. Diese Zeitpunkte kann man über das zählen von Interrupten und abpassen.

mfg,
The Man

PCF8574P
14.01.2009, 20:07
Hallo The Man,

nein nein, ich muss nur einen Servo ansteuern.
Das heißt wenn ich den Servo auf Mittelstellung bringen will:

1. 16,5ms Low
2. 1,5ms High
und so schachtelt sich das weiter, mit den ms?
Aber man kann doch bei der delay funktion nur zahlen wie 1,2,3,4,5 usw angeben, oder? wie funzt das dann mit Kommazahlen? Oder geht das so einfach?

Ein Codeschnippsel währe nett.
Wie gesagt ich bin noch beim C Lernen

MFG Max



[/b]

The Man
14.01.2009, 20:17
Hi,

von Kommazahlen sollte man bei µC der Leistungsklasse die hier in der Regel benutzt wird abstand nehmen.

Von wegenC und so, bis vor drei Tagen hab ich nur in Assembler geschrieben.
Ich hab noch keine delay Funktionen benutzt. Daher bin ich jetzt nicht vertraut damit, welche Bibliotheken man da noch einbinden muss. Glaube es gibt so was wie delay.h oder so ähnlich. Wahrscheinlich wird es einmal delay Funktionen für ms und einmal für µs geben. Du nimmst dann die mit µs und lässt sie 1500 warten, dann hast du deine 1,5ms.

Am besten suchst du erstmal über google und den signifikanten Begriffen, die dein Problem umschreiben nach Know How. Ansonsten solltest du deine Fragen präzisieren (also z.B. "was brauche ich alles für delay Funktionen?")
und stellst diese in einem eigenen Thread.


The Man

lokirobotics
14.01.2009, 21:46
The Man hat schon recht.

_delay_us(mikrosekunden);
_delay_ms(millisekunden);

Die Funktionen stehen nach einbinden des Headers
<util/delay.h> zur Verfügung.

Nicht vergessen, vor dem Einbinden F_CPU zu definieren.

#define F_CPU deine_taktfrequenz_in_herz

#include <util/delay.h>

...

Grüße

edit:
je nach dem, was dein Controller sonst noch machen soll, würde ich die Signalgenerierung mit nem Timer und Compare-Registern machen (z.B. Timer 1 bei nem ATM8/16), da die delay funktionen deinen Controller ja komplett blockieren.

oberallgeier
14.01.2009, 21:59
Hallo Max,


... muss nur einen Servo ... wenn ich den Servo auf Mittelstellung bringen will ...Na ja, so ähnlich. Schau doch mal ins Wiki wegen der 5ervos => nur eines dieser blauen Wörter " Servo " anklicken *gggg*. Dort ist auch eine Skizze zum Signal (Rampendauer 1 ms bis 2 ms) und dann der "Rest" auf low. ACHTUNG: die Skizze hat einen Fehler. Definitionsgemäß ist der Abstand von zwei aufeinanderfolgenden steigenden Flanken 2 ms - die Skizze suggeriert aber, dass die Pause zwischen 2 Rampen 2 ms sei. Die meisten 5ervos nehmen es mit der Genauigkeit der Zyklusdauer nicht sooo eng. Die laufen auch meist mit weniger und mehr Zykluszeit - ungefähr unter 1,8 ms bis über 2,2 ms. Aber die Zykluszeit sollte konstant sein (daher ist die Skizze irreführend).

Ist die Rampe 5% der Zyklusdauer (5% von 20 ms sind 1 ms) dann ist der eine nominelle Maximalausschlag gemeint, 10 % (also 2 ms) dann läuft der 5ervo auf den anderen nominellen Maximalausschlag. "Nominell" nenn ich das deshalb hier, weil das NICHT die Endausschläge sind - die meist mechanische Anschläge haben.

Du musst Dir also (blos) eine Hard- oder Soft-Ware-PwM schreiben, mit der Du die genannte Zyklusdauer realisierst. Je höher die Auflösung der PwM zwischen 5 % und 10 % der Zyklusdauer ist, umso feiner kann der 5ervo gestellt werden - aber abhängig natürlich von seiner internen elektrischen und mechanischen Güte/Genauigkeit.


... von Kommazahlen ... bei µC der Leistungsklasse die hier in der Regel benutzt wird abstand nehmen ...Das verstehe ich nun überhaupt nicht. Wieso sollte ich denn den 5ervo nicht auf 12,5 % seines Gesamtausschlages stellen können? Das wäre dann z.B. eine PwM mit einer Aufteilung auf 160 Schritte in 2 ms und davon wäre die Rampe 9 Schritte lang aktiv.

Und was um alles in der Welt sollte es heißen, dass man Millisekunden "bei µC der Leistungsklasse die hier in der Regel benutzt wird" NICHT in Kommastellen messen kann. Mein mega168/20 MHz schafft locker 0,05 ms zu messen - und dabei kann die CPU nebenher noch ne ganze Menge anderer Dinge machen.

@Max: der Rat mit den delay´s ist ein möglicher, aber kein guter Rat. 5ervos werden i.A. mit HardwarePWMs oder mit interruptgetriebenen PwM´s gefahren. Dazu ein Delay nehmen - wozu hab ich nen µC mit ein paar Millionen Zyklen, wenn der vorwiegend nichts anderes tun soll als zu rechnen:

Anfang
if { delaycounter Null go to Ende } (dies ist um alles in der Welt KEIN C *gggg*)
Ende

Sieht doch irgendwie aus nach nutzlosem im-Kreis-hecheln.

The Man
15.01.2009, 07:27
Gefragt war, ob er in die delay_ms(); Routine 1,5 reinschreiben kann.
In dem Zusammenhang meinte ich, es sei besser von Kommazahlen abstand zu nehmen. Mit der Leistungsfähigleit meinte ich nicht die kleinstmöglichen Zeitabstände, die realisiert werden können, sondern das man sich viel Maschienencode einhandelt, wenn man auf 8 Bitachritekturen anfängt Floatingpointarithmetik zu verwenden.

The Man

sternst
15.01.2009, 09:36
Solange es sich um Konstanten handelt, kann man die Delay-Funktionen ohne jegliche Nachteil auch mit Gleitkommazahlen aufrufen.
Die Arithmetik wird beim Compilieren erledigt, nicht zur Laufzeit.

Hubert.G
15.01.2009, 10:54
Dazu ein Delay nehmen - wozu hab ich nen µC mit ein paar Millionen Zyklen, wenn der vorwiegend nichts anderes tun soll als zu rechnen:

Ich würde eher sagen: nichts anderes tut als zu warten, denn der Kontroller tut in dieser Zeit sonst nichts.