mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Jitter Freie PWM


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

Bewertung
0 lesenswert
nicht 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ß

...

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohh, ich sehe Licht! jetzt wird klarer ;)

vielen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.