-         

Ergebnis 1 bis 9 von 9

Thema: Servo PWM

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139

    Servo PWM

    Anzeige

    Hallo, da diese Frage allgemein mit Servos zutun hat bringe ich sie jetzt einmal hier unter. (hoffe das past so)

    Also es geht um ein Servo pwm, im Wiki findet man zu Servos folgendes http://www.roboternetz.de/wissen/index.php/Servo wobei mir besonders dieses Bild ins Auge gefallen ist (http://kos.informatik.uni-osnabrueck...port/img34.gif) Dieses Bild zeigt einen 20ms langen low und einen 1-2ms langen high Teil. Nun bleibt laut Wiki die Zeit von 20ms immer gleich nur die 1-2 ms verändern sich dadurch findet der Servo seine Postion.
    Dies wird als Servo PWM umworben.

    Nun ist das aber nach meinem Verständnis nach kein PWM, denn ein PWM hat laut meinem Verständis immer die Gleiche Frquenz. Dieses "PWM" ändert aber die Frequenz nämlich von 20+1ms = ~47,619Hz auf bis zu 20+2ms = ~45,4545Hz

    http://de.wikipedia.org/wiki/Pulsweitenmodulation

    So nun meine Frage ist dies nun ein PWM bzw ist das was im Wiki steht richtig? (eine eigenart der Servos?)


    Die frage kommt daher da ich versuchen will den Servo per HardwarePWM anzusteuern aber sich damit nur "Richtige" PWMs erzeugen lassen nemlich solche mit ständig gleicher Frequenz....

    Liebe Grüße,
    Manhunt

  2. #2
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Dieses Bild zeigt einen 20ms langen low und einen 1-2ms langen high Teil.
    Der Impuls soll alle 20ms wiederholt werden, das bedeutet die Zeit zwischen den Impulsstarts soll 20ms sein. Nach dem Impuls 20ms Pause ist eindeutig falsch.

    Gruß

    miuc

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139
    Hallo

    Ich habe nie etwas von einer Pause gesagt. Nur 20ms low dann 1-2ms high. (was natürlich dann wieder mit 20ms low weitergeht.....)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.06.2008
    Ort
    Rösrath
    Alter
    33
    Beiträge
    332
    Ich würde das als Schnellschuss mal als Pulsfrequenzmodulation bezeichnen, insofern ist PWM tatsächlich falsch..

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hi manhunt,

    Du kannst schon (D)eine Hardware-PWM nehmen. Das Bild ist missverständlich - der Servo will eine PWM. Allerdings sind die Sevos üblicherweise nicht pingelig - einige verdauen Impulsfolgezeiten von deutlich unter bis deutlich über 20 ms. Also dürfte sogar der aus dem Bild heraus interpretierbare seltsame Takt noch zu einem halbwegs passablen Stellverhalten führen.

    Richtig ist: alle 20 ms soll ein bestimmter Impuls zwischen 1 ms und 2 ms kommen, d.h. die Servo-Ansprechfrequenz ist 50 Hz. Der Abstand Impulsende bis Impulsanfang ist 20 ms minus der vorhergehenden Impulsdauer.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139
    Hallo

    also habe ich jetzt "nur noch" das Problem mit dem PWM.

    Frage auf die Idee das Wiki du berichtigen und die eine Zeile Code in C da zu berichtigen ist noch niemand gekommen. (Von Bascom habe ich keine Ahnung)
    Gibt es dafür einen Grund?

    lg manhunt

  7. #7
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Ich habe nie etwas von einer Pause gesagt.
    Tja, da müht man sich ab und wird auch noch angepflaumpt:

    Das LOW zwischen den Impulsen ist die (Impuls-)Pause.

    Eine Hardware-PWM wird wohl nur gelingen wenn man den Prescaler für High bzw. Low unterschiedlich wählt weil das Impuls/Pause-Verhältnis so ungünstig ist.

    Vielleicht könnte man auch mit einem eigenen variablen Takt arbeiten. Die Timer kann man auch über einen externen Eingang takten. Diesen Eingang kann der Timer auch auswerten wenn dessen Datenrichtung auf Ausgang steht und er vom Programm getoggelt wird (das funktioniert zumindest bei den Megas so). Schneller Takt während des Impulses und langsamer Takt beim Low. Das ist nur ein Gedankenspiel und mit Hinblick auf die Resourcenverschwendung schnell zu vergessen ;)

    Table 40. Clock Select Bit Description
    CS12 CS11 CS10 Description
    0 0 0 No clock source. (Timer/Counter stopped)
    0 0 1 clkI/O/1 (No prescaling)
    0 1 0 clkI/O/8 (From prescaler)
    0 1 1 clkI/O/64 (From prescaler)
    1 0 0 clkI/O/256 (From prescaler)
    1 0 1 clkI/O/1024 (From prescaler)
    1 1 0 External clock source on T1 pin. Clock on falling edge.
    1 1 1 External clock source on T1 pin. Clock on rising edge.

    If external pin modes are used for the Timer/Counter1, transitions on the T1 pin will
    clock the counter even if the pin is configured as an output. This feature allows software
    control of the counting.
    (Aus dem Datenblatt des Mega8 S.100/101)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    06.02.2007
    Beiträge
    139
    Ich möchte mich entschuldigen, es war schon spät und jetzt gelesen war es wirklich ein wenig ruppig. Habe nicht gewusst das der low teil auch (Impuls-)Pause heißt.

    Ja vor dem Problem mit dem Harware PWM stehe ich auch.

    Ich werde vermutlich den Atmega168 benutzen und lese gerade im Datenblatt.

    Da gibt es soetwas wie Phase correct Mode (Seite 98) Der scheint in einem Zyklus hoch und runter zu Zählen das wäre sehr Interessant....
    http://atmel.com/dyn/resources/prod_...ts/doc2545.pdf

    lg manhunt

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hi manhunt,

    Zitat Zitat von manhunt
    ... vermutlich den Atmega168 ... Phase correct Mode ...
    ja, das ist eine hübsche Möglichkeit - allerdings habe ich den Vorteil des Verfahrens bei meinen Anwendungen noch nicht überzeugend gefunden. Ich steuere von einem mega168 in diesem Modus (m)eine irLED:

    Code:
    /* ============================================================================== */
    /* ==  PWM-Routinen zur IRLED-ansteuerung auf OC1A/PB1    ======================= */
      void TC1PWM_init(void)	//Init Timer/Counter 1, PWM-Signal 
    {                               //       PWM aktivieren
       TCCR1A |= (1<<COM1A1);       //Clear/set OC1A on Compare Match           doc S132
    				//   also Port PB3, vgl. auch PWM-routine unten
       TCCR1B |= (1<<CS10);         // cs10 <=> clk/1 => no prescaling         doc S 134
       TCCR1B |= (1<<WGM13);        // PWM, Phase+Frequency correct            doc S 134
       ICR1    = 278;               // =>PWM-Frequenz 20MHz/(2*278) => 36,0kHz/27,8µs
    /* Interrupts deaktivieren. Siehe Registerbelegung :
    mega168   Bit7       6        5         4         3         2        1        0
    TIMSK1      –        –      ICIE1        –         –       OCIE1B   OCIE1A   TOIE1
    im m168     ?        ?        ?         ?         ?         ?        ?        ?   */
    //
       TIMSK1 &= ~(1<<OCIE1A);      // Tmr/Cntr1 Oput CompA/B Mtch intrrpt disab
       TIMSK1 &= ~(1<<OCIE1B);      // Tmr/Cntr1 Oput CompA/B Mtch intrrpt disab
       TIMSK1 &= ~(1<<TOIE1);	// Tmr/Cntr1 Overflow interrupt disabled
    }
    /* ============================================================================== */
      void setSRV1(uint16_t speed1)         //Relative Pulslänge auf OC1A/PB1
    {OCR1A = speed1;}                       //  z.B. für SFH5110
    /* ============================================================================== */
    Diesen Modus gibt es (natürlich) auch bei anderen Controllern. Auf einem tiny2313 hatte ich mir damit eine SEHR feinfühlig arbeitende PWM für einen Servo gemacht:
    Code:
    // =================================================================================
    // ======= Die untere Routine modifiziert für Servotester tiny2313    ==============
    // =================================================================================
    // ===  Routinen zur Interrupterzeugung auf OC1A/PB1    ============================
      void TC1TMR_init(void)	//Init Timer/Counter 1, PWM-Signal 
      {                             //       PWM aktivieren
        TCCR1B |= (1<<WGM13);       // ???                           doc S???
        TCCR1B |= (1<<CS11);        // cs10 <=> clk/8                           doc S111
                                     
        ICR1     =  25000;
        OCR1A    =  1000;
        TIMSK  |=  (1<<OCIE1A);      // Tmr/Cntr1 Oput CompA Mtch intrrpt enabld
        TIMSK  |=  (1<<OCIE1B);      // Tmr/Cntr1 Oput CompB Mtch intrrpt enabld
                                       
      }
    // =================================================================================
    // ===  Nicht unterbrechbare ISR für TIMER1_COMPA_vect   ===========================
    // ==  Aufgaben: ISRoutine für den ca. 20 ms-Servozyklus
      ISR(TIMER1_COMPA_vect)        // 
      {                                
        PORTB ^=  (1<<PB1);         // Port toggeln	
      }                                
    // =================================================================================
    Der Bereich des Servosignals geht dabei von
    Code:
    //  for(loopSrv=500; loopSrv<3750; loopSrv++)   // Servoloop laufen lassen
    . . . .           
          OCR1A     = loopSrv;
    . . . .
    und überstreicht damit etwas mehr als den zulässigen Bereich, in dem meine Servos arbeiten (können). Das Register ICR1 dient dazu, die Phasendauer der PWM auf ungefähr 20ms zu dimensionieren (Controllerquarz mit 20 MHz) und mit dem OCR1A wird die Rampe bemessen. Soweit die Hardwarefunktion. Um die Rampe dann wirklich korrekt zu bekommen, muss in der ISR der Ausgang getoggelt werden - ist ein bisschen tricky, läuft aber eben extrem feinfühlig. So feinfühlig braucht das aber wohl niemand, ich hatte das als Servotester gemacht.
    Ciao sagt der JoeamBerg

Berechtigungen

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