Jitter Freie PWM

Gast #1708463
Lesenswert?

Hallo Leute,

wie kann ich am besten 8 jitter freie PWM Kanäle (bis 1us Jitter), ich 
habe aber nur 5 HW PWM (PIC32)?
Software PWM werde ich bestimmt nicht so jitter frei bekommen, da der 
Prozessor noch vieles zu tun hat, kann man das irgendwie durch 
verschachteln der Kanäle erzeugen?

Gruß
#1708468
Lesenswert?

Tom schrieb:
> Software PWM werde ich bestimmt nicht so jitter frei bekommen, da der
> Prozessor noch vieles zu tun hat

Doch, kann man.
Der SW-PWM Interrupt muß nur die höchste Priorität gesetzt bekommen, 
dann kann er alle andere Interrupts unterbrechen.

Man kann sogar die Interruptlatenz weitgehend kompensieren, indem im 
Interrupt noch ein kleines bischen gewartet wird, bis der Timer einen 
bestimmten Wert hat.
Der Jitter ist dann nur so groß, wie diese Testloop.


Peter
#1710413
Lesenswert?

@Tom (Gast)

>das heißt aber dass ich jede 1us in der Timer ISR springen muss(da ich
>eine 1us Auflösung brauche).

Das kannst du getrost vergessen. Soft-PWM hat ihre Grenzen.

>Gibts eine Trick dass man die Pulse der HW-PWM nacheinander schalten
>kann?

Sag lieber, was du INSGESAMT machen willst, dann kann man dir besser 
helfen, siehe Netiquette. Sollen das 8 Servos werden? Dafür gibt es 
bereits Lösungen mit bis zu 20 Kanälen. Musst du mal suchen.

MFG
Falk
Gast #1710429
Lesenswert?

Es soll eine Art "universelle" Platine sein, mit bis zu 8 servos, 
einstellbaren Pulsbreiten (400 us bis 4000us), sowie einer einstellbaren 
Frequenz (2ms bis 40ms), am besten wenn die Pulse bis auf 1us genau sind 
und verzögert zueinander.
Die Platine(PIC32, 80Mhz, 5 HW-PWM) bedient auch 10MHz SPI-, I2C, ADC 
und USB Schnittstellen, und ein FreeRtos ist auch vorhanden.

Das Problem ist nur bei dem 1us Jitter, den möchte ich gerne 
garantieren, möchte aber uch nicht jede 1us in ISR sein.

Gruß
#1710456
Lesenswert?

@  Tom (Gast)

>Es soll eine Art "universelle" Platine sein, mit bis zu 8 servos,
>einstellbaren Pulsbreiten (400 us bis 4000us), sowie einer einstellbaren
>Frequenz (2ms bis 40ms), am besten wenn die Pulse bis auf 1us genau sind
>und verzögert zueinander.

Wusste ich es also mal wieder.

>Die Platine(PIC32, 80Mhz, 5 HW-PWM) bedient auch 10MHz SPI-, I2C, ADC
>und USB Schnittstellen, und ein FreeRtos ist auch vorhanden.

Klingt schon wieder nach eierlegender Wollmilchsau.

>Das Problem ist nur bei dem 1us Jitter, den möchte ich gerne
>garantieren, möchte aber uch nicht jede 1us in ISR sein.

Das schafft man leicht mit der Output Compare Funktion. Die Pulsbreite 
für Servos schwankt zwischen 1..2ms. Verteilt über 20ms Periodendauer 
bekommt man dort 10 Servos locker unter. Wenn ein Puls zu Ende ist, wird 
der nächste generiert. Dazu nutzt man die Output Compare Funktion als 
variablen Timer. Damit braucht man pro 20ms nur 2x10 Interrupts für das 
Ein- und Ausschalten der IOs. Macht 1000 Interrupts pro Sekunde, das 
verkraftet die CPU ohne größere Probleme.

MfG
Falk
Gast #1710509
Lesenswert?

@Falk:
du meinst jetzt nicht die HW-Output-Compare?
du meinst das ein Timer mit der Pulslängen geladen wird und in der ISR 
wird Kanal(x) auf "0" und Kanal(x+1)auf "1" gesetzt?, du nimmst dann an 
dass die gesamte Dauer aller Pulse < 20ms ist! das gilt dann nicht wenn 
alle Pulse den maximalen Wert (5ms) haben.
#1710519
Lesenswert?

@  Tom (Gast)

>du meinst jetzt nicht die HW-Output-Compare?

Doch.

>du meinst das ein Timer mit der Pulslängen geladen wird und in der ISR
>wird Kanal(x) auf "0" und Kanal(x+1)auf "1" gesetzt?,

so in etwa.

> du nimmst dann an
>dass die gesamte Dauer aller Pulse < 20ms ist!

Das ist sie auch ;-)

> das gilt dann nicht wenn alle Pulse den maximalen Wert (5ms) haben.

Dann hat/braucht man auch keine 20ms Periodendauer. Der Trick ligt 
darin, das clever zu verschachteln (engl. interleaving).

MfG
Falk
Gast #1710533
Lesenswert?

Erstens es gibt nur 5 OC Kanäle, ich brauche aber 8.

Zweitens die Periode (20ms) muss auch einstellbar sein (2ms - 40ms).

Das mit dem Verschachteln ist genau was ich suche, also wenn du noch 
Infos oder Links dazu hast, wäre ich sehhhhhhhhhr dankbar.

Gruß
#1710630
Lesenswert?

Tom schrieb:
> Erstens es gibt nur 5 OC Kanäle, ich brauche aber 8.

Hier sind es 7, ist aber erweiterbar, war nur durch die 6 verfügbaren 
ADCs begrenzt. Arbeitet aufgrund des (von Falk bereits erwähnten) 
Prinzips (Timer mit Compare als variabler Zeitgeber, Int-Aufrufe aus dem 
Sleep -> immer gleiche Int-Response-Time) jitterfrei.

>
> Zweitens die Periode (20ms) muss auch einstellbar sein (2ms - 40ms).

Ist zwar nicht vorgesehen, lässt sich aber nachrüsten.

>
> Das mit dem Verschachteln ist genau was ich suche, also wenn du noch
> Infos oder Links dazu hast, wäre ich sehhhhhhhhhr dankbar.

http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html
Ist allerdings AVR in ASM. Der Mega48 langweilt sich dabei aber so, dass 
er trotz 1MHz Takt die meiste Zeit schläft.

>
> Gruß

...
#1710721
Lesenswert?

@  Tom (Gast)

>Erstens es gibt nur 5 OC Kanäle, ich brauche aber 8.

Du solltes mal lesen lernen. Ich schrieb, dass man dazu nur EINEN Output 
Compare braucht, genau wie bei der Soft-PWM.

>Zweitens die Periode (20ms) muss auch einstellbar sein (2ms - 40ms).

Das kann man über die Software einstellen.

>Das mit dem Verschachteln ist genau was ich suche, also wenn du noch
>Infos oder Links dazu hast, wäre ich sehhhhhhhhhr dankbar.

Sagt ich bereits, erstens der Artikel Soft-PWM und zweitens die 
Suche hier auf der Seite.


Beitrag "Servocontroller mit ATmega8 für 20 Servos"

MFgG
Falk

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren