Forum: Mikrocontroller und Digitale Elektronik Jitter Freie PWM


von Tom (Gast)


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ß

von Peter D. (peda)


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

von Tom (Gast)


Lesenswert?

wie wird denn das ausehen bei 8 PWMs, die nicht gleichtzeitig starten 
müssen? und da die Pulsbreiten nicht konstant sind, werde ich 8 Timers 
gebrauchen!

von Falk B. (falk)


Lesenswert?

@  Tom (Gast)

>müssen? und da die Pulsbreiten nicht konstant sind, werde ich 8 Timers
>gebrauchen!

Nö, einen einzigen Timer, siehe Soft-PWM.

MFG
Falk

von Tom (Gast)


Lesenswert?

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

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

von Falk B. (falk)


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

von Tom (Gast)


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ß

von Falk B. (falk)


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

von Tom (Gast)


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.

von Falk B. (falk)


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

von Tom (Gast)


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ß

von Kluchscheißernder N. (kluchscheisser)


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ß

...

von Falk B. (falk)


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

von Tom (Gast)


Lesenswert?

Ohh, ich sehe Licht! jetzt wird klarer ;)

vielen Dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.