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!
@ 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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.