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ß
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
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!
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?
@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
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ß
@ 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
@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.
@ 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
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ß
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ß
...
@ 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