-         

Ergebnis 1 bis 9 von 9

Thema: Servos per Hardware PWM ansprechen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241

    Servos per Hardware PWM ansprechen

    Anzeige

    Moin Zusammen,
    es geht "einfach" nur um die Ansteuerung von 6 Servos mit nem Mega48.
    Nun habe ich es bisher immer mit der Timer und Schleifen Methode gemacht. Da ich aber für mein aktuelles Projekt Zeit zum Rechnen brauche ohne Interrupts wollte ich das über die 6 Hardware PWM's machen. Nun finde ich über die Hardware Methode mit den Timern kaum was im I-Net (zumindest mit meinen Suchbegriffen wie "Hardware Servo PWM" usw.)
    Daher wollte ich euch fragen ob ihr mir da nen bissel auf die Sprünge helfen könnt.
    Freue mich auf eure Antworten
    Gruß
    MiniMax

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Alter
    21
    Beiträge
    355
    Per Hardware ist das eigentlich noch einfacher, weil du dich nur ein mal um die Konfiguration kümmern musst und dann einfach immer den Compare-Wert verändern musst.

    Du musst eben die Timer so konfigurieren, dass du eine PWM-Frequenz von 50Hz bekommst (bei analogen Servos) und dann die Compare-Werte für die Pulsbreite berechnen / durch ausprobieren feststellen.

    Ich weiß nicht wie man die Timer in Bascom konfiguriert aber hier ist die grundlegende Vorgehensweise ganz gut erklärt:

    *Click*
    MfG Torrentula

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    So wirklich einfach geht die Erzeugung des PWM Signals per Hardware PWM leider nur mit dem 16 Bit Timer. Nach der Konfiguration des Timers auf etwa 50 Hz und PWM Mode muss man nur noch den Wert in das OC1... Register schreiben. Beim Mega48 hat man aber nur 2 PWM Kanäle mit 16 Bit Auflösung. Mit den 8 Bit Timern geht das leider nicht so gut. Da ist die Auflösung doch sehr eingeschränkt: um auf etwa 20 ms Period zu kommen entspricht ein Schritt für den Timer und die Auflösung für den PWM Puls dann etwa 50-100 µs. Bei einer Pulsbreite von 1,5-2,5 ms für den Servo sind das also nur 10-20 Stufen die man einstellen kann. Teils ist der Bereich sogar noch kleiner.

    Wenn man die Softwareversion richtig macht, also die Pulse nach einander, und mit nur je 1 Interrupt je Puls, hält sich die Belastung durch Interrupts in Grenzen und man hat noch den größten Teil der Rechenleistung zur Verfügung. Da stört mehr der zusätzliche Bedarf auf dem Stack.

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von Torrentula
    Registriert seit
    10.10.2009
    Ort
    Procyon A
    Alter
    21
    Beiträge
    355
    Wenn man die Softwareversion richtig macht, also die Pulse nach einander, und mit nur je 1 Interrupt je Puls, hält sich die Belastung durch Interrupts in Grenzen und man hat noch den größten Teil der Rechenleistung zur Verfügung. Da stört mehr der zusätzliche Bedarf auf dem Stack.
    Gibt es dazu auch ein Beispiel? Du hast mich jetzt auch neugierig gemacht
    MfG Torrentula

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Passenden Code gibt es im RN-Wissen unter Servoansteuerung.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Also haltet ihr die Hardwaremethode nicht vorteilhaft? Dann mache ich es einfach so wie immer? :
    Code:
    Servoirq: 
    If Kanal = 0 Then    
    If Portb.0 = 0 Then                            'wenn port low       
    Timer1 = Servo(1)                           'dann timer auf entsprechende verzögerung      
     Portb.0 = 1                                 'und port anschalten    
    Else                                           'das hier passiert erst bei dem darauf folgenden interrupt      
     Portb.0 = 0                                 'dann port wieder ausschalten       
    Incr Kanal                                  'und den nächsten kanal bearbeiten    
    End If 
    End If 
    [...] 
    If Kanal = 6 Then   
    Timer1 = 40000                                  'eine pause von ca. 12ms bis zum nächsten interrupt. Bei guten Servos oder Brushlessreglern kann man hier bis auf 65530 gehen ==> ansteuerfrequenz von ~ 200Hz   
    Kanal = 0 
    End If 
    Return
    Gruß
    MiniMax

  7. #7
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Wenn man mit der Ansteuerfrequenz höher gehen kann, wie im Kommentar oben im Code angedeutet, kann man ggf. auch mit 8 Bit PWM noch brauchbare Ergebnisse (z.B. 40 Stufen) bekommen.

    Bei dem Basic Code hätte man dann zur Not noch die Möglichkeit für die Servos inline ASM zu nutzen - das bringt gegenüber Bascom schon ein merkliche Beschleunigung und weniger Speicherbedarf (Interrupts sind nicht gerade die Stärke des Bascom Compilers). Hat man für die Servos einen ganzen Port reserviert, kann man auch den Basic-Code noch kürzer machen (array Zugriff statt der if then else Konstruktion) .

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von MiniMax
    Registriert seit
    26.07.2007
    Ort
    Bremen
    Beiträge
    241
    Mhmm Ok also fasse ich zusammen:
    1. Servoansteuerung wie gehabt mit 16 bit Timer & Interrupts
    2. Bei mehr Geschwindigkeitsbedarf ASM inline nehmen

    Ich werde das dann erstmal aufs Board bringen und dann Testen ob und in wie weit mir der Interrupt dazwischen funkt.

    Vielen Dank an euch alle
    Gruß
    MiniMax

  9. #9
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Bei der Softwarelösung braucht man nicht unbedingt einen 16 Bit timer, das geht auch mit einem 8 Bit Timer nicht so viel schlechter. Mehr als etwa 50-100 Schritte könnte die meisten Servos mechanisch nicht Auflösen, und dafür reicht auch ein 8 Bit Timer, denn hier muss der Timer nur die Pulslänge auflösen, nicht die ganze Periode - für die Wartezeit am Ende kann man wenn nötig den Vorteiler umstellen.

Ähnliche Themen

  1. RFM ansprechen
    Von runner02 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 11.03.2012, 12:01
  2. Welche Hardware für Ansteuerung von Servos
    Von roboterfips im Forum Suche bestimmtes Bauteil bzw. Empfehlung
    Antworten: 4
    Letzter Beitrag: 10.01.2010, 20:01
  3. Config Servos Befehl und allg. Servos
    Von Foooob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 09.08.2007, 17:43
  4. USB Ansprechen
    Von DHigh im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 05.10.2006, 21:37
  5. Servos ansprechen mit Atmega16
    Von zersus im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 22.05.2006, 22:35

Berechtigungen

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