-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: Servo mit Pulseout steuern

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318

    Servo mit Pulseout steuern

    Anzeige

    Hallo,

    ich habe ein Servo mit dem Servo befehl angesteuert. Klappt soweit, aber ich verbrauche dadurch ja einen Timer. Jetzt habe ich versucht das Servo mit dem Pulseout befehl zu steuern. Aber das klappt nicht. Ich kann das Servo nur in 1 Richtung fahren.

    Code:
    Pulseout Portc, 4, 30
    waitms 20
    Egal welchen wert ich einsetze komme ich nicht in die andere Richtung. Könnte mir das mal bitte jemand erklären. Stehe da voll auf dem Schlauch.
    Danke

    mfg Kay

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo BlaueLed,

    Egal welchen wert ich einsetze komme ich nicht in die andere Richtung. Könnte mir das mal bitte jemand erklären. Stehe da voll auf dem Schlauch.
    Danke
    welche Werte hast du denn bisher ausprobiert?

    Vielleicht kannst du noch den Rest des Programms posten?
    Manchmal steckt der Fehler ganz woanders.

    Gruß, Michael

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hallo Michael,

    ich habe werte von 10 - 1000 ausprobiert, aber der Servo dreht sich immer nur in die selbe richtung. Der Rest vom Programm läuft ja, ist ja nur die Chip und Portdefinition drin. Mehr habe ich im Programm nicht stehen.

    edit :

    habe im internet schon ein paar beispiele gefunden. Die habe ich gleich ausprobiert. Sieht folgendermaßen aus:

    Code:
    for i = 1 to 30
         pulseout Portc,4,i
         waitms 20
    next i
    
    for i = 30 to 1 step -1
         pulseout Portc,4,i
         waitms 20
    next i
    bei der ersten schleife läuft er in eine Richtung. Bei der zweiten aber in die gleiche. Also entweder ich verstehe den Pulseout befehl nicht richtig oder ich versteh mein servo nicht.

    mfg Kay

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    Laut Hilfe von Bascom liefert pulseout einen Puls der Länge i=1µs wenn der Controller auf 4 MHz läuft.

    Wenn dein Comtroller also mti 4MHz läuft und du den Wert 1000 nutzt, dann ist der Puls grade mal eine Millisekunde lang. Die Pulsdauer sollte zwischen einer und zweil Millisekunden lang sein, also musst du Werte zwischen 1000 und 2000 benutzen (sofern dein µC auf 4MHz läuft, ansonsten natürlich anzupassen)

    Ausserdem liefert Pulseout nicht eine logische 1 und geht dann wiederauf 0, sondern toggelt den betreffenden Portpin. Ist also der Port vor dem Befehl auf logisch 1, dann liefert Pulseout einen 0-Impuls und geht danach wieder auf logisch 1.

    Einfach mal das ganze Programm posten, dann bekommen wir das schon hin

    Gruß MeckPommER

    P.S.: wenn es um exakte Servoansteuerungen geht, wirst du um die Verwendung eines Timers nicht herumkommen.
    Mein Hexapod im Detail auf www.vreal.de

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo BlaueLED,

    ja, Meck hat es ja geschrieben, das mit den Mikrosekunden, also einfach mal rechnen.
    Ich hatte dich aber nach dem Rest des Programmes gefragt, um z.B. zu sehen, mit welcher Quarzfrequenz du arbeitest.

    Gruß, Michael

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hi,

    vielen Dank für eure Hilfe. Ich benutze einen 16 Mhz Quarz. Werde das gleich ausprobieren.

    mfg Kay

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hi,

    habe es probiert und es klappt. Mit den Werten 900 für den linken Anschlag und 4500 für den rechten Anschlag. Wenn ich die werte einzeln aufrufe, dann gehts. Wenn ich in einer Schleife die werte aufrufe dann nicht. Hier mal mein Code :

    Code:
    '--- Chip ---
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    '--- Ports ---
    Config Portc.5 = Output
    Config Pinc.4 = Output
    Config Pinb.1 = Input
    
    Portc.4 = 0
    
    '--- Alias ---
    Led Alias Portc.5
    
    '--- Werte ---
    Const Maxi = 4500
    Const Mini = 900
    
    '--- Dim ---
    Dim I As Word
    
    '--- Main ---
    
    Do
    
       Wait 1
    
    Portc.4 = 0
    Pulseout Portc , 4 , Mini
    Portc.4 = 0
    
       Wait 1
    
    Portc.4 = 0
    Pulseout Portc , 4 , Maxi
    Portc.4 = 0
    
    Loop
    da zuckt das servo nur rechts und links. Liegt es daran, das die Pulseout routine fertig ist, bevor das servo am Anschlag ist und dann wait 1 das servo unterbricht ?

    mfg Kay

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    Du erzeugst nur einen puls und wartest dann eine sekunde, das geht nicht. die pulse müssen alle 20ms kommen.

    ändere das programm dahingehend, das die pulse jeweils 50 mal mit einer 18ms-pause dazwischen kommen, das dürfte klappen.
    Mein Hexapod im Detail auf www.vreal.de

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Hi MeckPommER,

    vielen Dank für die Antwort. So klappts nun :

    Code:
    '--- Chip ---
    $regfile = "m8def.dat"
    $crystal = 16000000
    
    '--- Ports ---
    Config Portc.5 = Output
    Config Pinc.4 = Output
    Config Pinb.1 = Input
    
    Portc.4 = 0
    
    '--- Alias ---
    Led Alias Portc.5
    
    '--- Werte ---
    Const Maxi = 4550
    Const Mini = 900
    
    '--- Dim ---
    Dim I As Word
    
    '--- Main ---
    
    Do
    
    
       For I = 1 To 20
    
          Portc.4 = 0
          Pulseout Portc , 4 , Mini
          Waitms 20
          Portc.4 = 0
    
       Next I
    
       Wait 1
    
       For I = 1 To 20
    
          Portc.4 = 0
          Pulseout Portc , 4 , Maxi
          Waitms 20
          Portc.4 = 0
    
       Next I
    
       Wait 1
    
    Loop
    mfg Kay

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    Hi BlaueLed,

    es mag auf den ersten Blick klappen, allerdings hat dein Programm noch 2 kleine Schönheitsfehler:

    - Servos erwarten alle 20ms einen Impuls. Die meisten Servos können sehr gut mit kürzeren Abständen umgehen, einige mögen aber längere Abstände absolut nicht.
    Wenn du nun einen Puls von 2ms sendest und nach jedem Puls 20ms wartest, kommen die Pulse eben nicht alle 20ms, sondern alle 22ms. Deshalb hatte ich auch vorgeschlagen, eine Pause von nur 18ms zu nehmen.

    - momentan stellt sich dein Servo auf eine Position ein, nach 2 Sekunden gehts in die andere Position u.s.w.
    Problem ist, das dein Servo in der "wait 1" Zeit absolut kraftlos wird, da keine Stellimpulse mehr eintreffen. Sollte der Servo also so verwendet werden, das er in seiner jeweiligen Position unter mechanischer Last ist, wird er diese nicht halten können.

    Das ist just auch der Grund, warum häufig Timer verwendet werden und Servos über einen Interrupt gesteuert werden.

    Gruß MeckPommER
    Mein Hexapod im Detail auf www.vreal.de

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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