- Labornetzteil AliExpress         
Ergebnis 1 bis 10 von 15

Thema: Servo-Ansteurung dreht nicht vollständig in gewünschte Position

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2010
    Ort
    Nähe Wien
    Alter
    34
    Beiträge
    108

    Servo-Ansteurung dreht nicht vollständig in gewünschte Position

    Hallo!

    Also ich habe gerade mit einer ganz simplen Ansteuerung versucht, einen Modelbauservo (robbe FS100) mittels AtMega32 anzusprechen.

    Dabei hab ich die Stromversorgung des Servos aus einer eigenständigen Stromquelle (wie empfohlen) sichergestellt. Der Signal-Pin ist an den Port-B2 angelegt.

    Zum Programm:
    Code:
    void servo2mitte()
    {
            PORTB |= (1<<PB2);
            _delay_us( 1500 );    // in den 1500 steckt die Lageinformation
            PORTB &= ~(1<<PB2);
     
            _delay_ms( 18 );      // ist nicht kritisch
    }
    
    void servo2left()
    {
            PORTB |= (1<<PB2);
            _delay_us( 2000 );    // in den 2000 steckt die Lageinformation
            PORTB &= ~(1<<PB2);
     
            _delay_ms( 18 );      // ist nicht kritisch    
    }
    
    void servo2right()
    {
            PORTB |= (1<<PB2);
            _delay_us( 1000 );    // in den 1000 steckt die Lageinformation
            PORTB &= ~(1<<PB2);
     
            _delay_ms( 18 );      // ist nicht kritisch  
    }
    Die 3 Methoden rufe ich jetzt nacheinander auf, also links, mitte, rechts, mitte, links, ...

    So, was passiert jetzt?
    Der Servo dreht ca 2mm nach links, fängt dort zu zittern an, und das wars. Weiter passiert nichts.

    Was ich geplant hatte?
    Der Servo soll sich einfach bis zum Anschlag nach links drehen, dann in die Mitte, dann nach rechts, wieder in die Mitte, etc.

    Ich komme jetzt leider einfach nicht dahinter wo mein Fehler liegt.
    Bitte daher um Hilfe!
    Btw: Ich wollte absichtlich auf den einsatz von Timern verzichten, weil ich mich mit denen noch nicht so gut auskenne.

    LG



    Nachtrag:
    Der Port ist folgendermaßen difiniert:
    Code:
    DDRB |= (1<<PB2); 
        PORTB |= (0<<PB2);

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ein Servo braucht die Lage-Position nicht nur einmal, sondern alle ~20 mS
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2010
    Ort
    Nähe Wien
    Alter
    34
    Beiträge
    108
    Danke für deine Antwort!

    Ich hab das ganze jetzt einfach mal wiederholt, also innerhalb der Methoden eine for-Schleife eingebaut die das Signal 10 mal wiederholt. Reicht das für eine komplette Servo-Stellung? Oder soll ich lieber mehr Wiederholungen versuchen? 50? 100?
    Bis jetzt leider noch immer ergebnislos, also der Servo stellt sich ein kleines Stück in die gewünschte Richtung, verharrt dort und beginnt zu zucken...

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    etwa so ?
    Code:
    for (int iX = 0; iX < 10;iX++)
    {
            PORTB |= (1<<PB2);
            _delay_us( 1000 );    // in den 1000 steckt die Lageinformation
            PORTB &= ~(1<<PB2);
            _delay_ms( 18 );      // ist nicht kritisch    
    }
    Schau mal, ob dein Servo eh' positive Pulse braucht.



    Btw:
    PORTB |= (0<<PB2);
    ist für die Jetti-Tant'. "0" kann man nicht shiften.

    Wenn du auf Null setzen willst, dann:
    PORTB &= ~(1<<PB2);
    (wie in deiner Schleife)
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Wo man sich noch verkühlen kann: Irgendwo ganz vorn muss die CPU-Taktgeschwindigkeit definiert werden, hängt von deinem Compiler ab.

    Ein Beispiel dazu:
    http://www.rn-wissen.de/index.php/LE...Timer#Makefile
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2010
    Ort
    Nähe Wien
    Alter
    34
    Beiträge
    108
    Ja, genau, meine Änderung schaut genau so aus wie die von dir gepostete.
    Sind die 10 Wiederholungen hier überhaupt ausreichend?


    Richtiges Datenblatt zum Servo find ich jetzt keines im Internet, es wird nur überall geschribenen das der Robbe FS100 ein Standart Modellbau-Servo ist den man überall einsetzen kann.
    Weiß auch garnicht mehr wo ich den eig. her habe.

    Was ich aber gelesen habe ist, das es digitale und analoge Servos gibt. Funktioniert meine Ansteurung jetzt für beide Arten, oder nur für Digitale? Sonst könnte es ja eventuell daran liegen?

    Und Danke für den Hinweis mit dem shiften der 0-en, das wusste ich garnicht, erklärt aber einiges.

Ähnliche Themen

  1. RC-Servo Position bestimmen
    Von Jared im Forum Motoren
    Antworten: 21
    Letzter Beitrag: 11.07.2015, 10:55
  2. bits werden nicht vollständig in struct eingelesen
    Von cesupa im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 20.05.2008, 20:08
  3. Antworten: 14
    Letzter Beitrag: 10.07.2007, 21:17
  4. Servo dreht sich nicht ganz
    Von Spion im Forum Elektronik
    Antworten: 8
    Letzter Beitrag: 11.01.2006, 20:05
  5. Eagle: Pinkontakt nicht vollständig mit Fläche verbunden
    Von Arme Sau im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 7
    Letzter Beitrag: 20.04.2005, 17:39

Berechtigungen

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

12V Akku bauen