PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servo PWM



manhunt
08.12.2008, 22:01
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.de/download/report/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

radbruch
08.12.2008, 22:33
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

manhunt
08.12.2008, 22:38
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.....)

pyr0skull
08.12.2008, 23:26
Ich würde das als Schnellschuss mal als Pulsfrequenzmodulation bezeichnen, insofern ist PWM tatsächlich falsch..

oberallgeier
08.12.2008, 23:30
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.

manhunt
08.12.2008, 23:42
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

radbruch
09.12.2008, 01:00
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)

manhunt
09.12.2008, 09:15
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_documents/doc2545.pdf

lg manhunt

oberallgeier
09.12.2008, 10:29
Hi 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:


/* ================================================== ============================ */
/* == 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:
// ================================================== ===============================
// ======= 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
// 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.