Hallo
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.Dieses Bild zeigt einen 20ms langen low und einen 1-2ms langen high Teil.
Gruß
miuc
          
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 https://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
Hallo
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.Dieses Bild zeigt einen 20ms langen low und einen 1-2ms langen high Teil.
Gruß
miuc
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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.....)
Ich würde das als Schnellschuss mal als Pulsfrequenzmodulation bezeichnen, insofern ist PWM tatsächlich falsch..
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
Tja, da müht man sich ab und wird auch noch angepflaumpt:Ich habe nie etwas von einer Pause gesagt.
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 ;)
(Aus dem Datenblatt des Mega8 S.100/101)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.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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
Hi manhunt,
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:Zitat von manhunt
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:/* ============================================================================== */ /* == 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 /* ============================================================================== */Der Bereich des Servosignals geht dabei vonCode:// ================================================================================= // ======= 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 } // =================================================================================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.Code:// for(loopSrv=500; loopSrv<3750; loopSrv++) // Servoloop laufen lassen . . . . OCR1A = loopSrv; . . . .
Ciao sagt der JoeamBerg
Lesezeichen