-         

Ergebnis 1 bis 9 von 9

Thema: Servoposition abfragen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.07.2008
    Ort
    Höchberg
    Beiträge
    155

    Servoposition abfragen

    Anzeige

    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

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    15.07.2008
    Ort
    Höchberg
    Beiträge
    155
    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]

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    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

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.05.2005
    Ort
    Berlin
    Beiträge
    316
    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.

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hallo Max,

    Zitat Zitat von PCF8574P
    ... 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.

    Zitat Zitat von The Man
    ... 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.
    Ciao sagt der JoeamBerg

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    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

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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.
    MfG
    Stefan

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Berechtigungen

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