Hallo zusammen Folgende Idee: Timer1 läuft von 0-TOP=5000 Bei COMPA=300 wird ein Interrupt ausgelöst. Wenn ich nun im Interrupt den COMPA auf 900 stelle, wird der interrupt dann nach weiteren 600 counts erneut ausgelöst? Danke schonmal!
Holger K. schrieb: > Wenn ich nun im Interrupt den COMPA auf 900 stelle, wird der interrupt > dann nach weiteren 600 counts erneut ausgelöst? Ja. mfg.
Thomas E. schrieb: > Ja. Nicht unbedingt. Vorausgesetzt, wir spielen hier mit AVR (weiss ja keiner), kann es je nach Timermode zu einem OCR Update auch erst bei TOP oder BOTTOM kommen.
Matthias S. schrieb: > Thomas E. schrieb: >> Ja. > > Nicht unbedingt. Vorausgesetzt, wir spielen hier mit AVR (weiss ja > keiner), kann es je nach Timermode zu einem OCR Update auch erst bei TOP > oder BOTTOM kommen. Ja es handelt sich um einen Atmega48 Der Mode ist noch offen. Welcher soll man hier wählen?
Holger K. schrieb: > Welcher soll man hier wählen? Kommt drauf an, wass du willst. Bei PWM Modes passiert ein OCR Update bei TOP oder BOTTOM: Zitat: "The OCR1x Register is double buffered when using any of the twelve Pulse Width Modulation (PWM) modes. For the Normal and Clear Timer on Compare (CTC) modes of operation, the double buffering is disabled. The double buffering synchronizes the update of the OCR1x Compare Register to either TOP or BOTTOM of the counting sequence. The synchronization prevents the occurrence of odd-length, non-symmetrical PWM pulses, thereby making the output glitch-free."
Matthias S. schrieb: > Kommt drauf an, wass du willst. Folgender Gedanke: Ich brauche 3 Kanal PWM für RGB. Der Mega48 hat nur zwei 16bit Compares. Deshalb folgender Ansatz: Ich Lasse den 16bit Counter mit prescaler 8 laufen = 200'000KHz (da F_CPU = 16MHz) Nun wähle ich als TOP Value 14bit bzw. 16384 Dies ergibt mir einen overflow bzw PWM Frequenz von ca. 122Hz Ich habe nun ein Array uint16_t arr[3] mit meinen drei Compare Werten für R G und B. Im Overflow ISR schalte ich alle LEDs aus und setze den Compare auf arr[0] sowie eine count Variable auf 0 (damit ich weiss wo ich stehe). Beim ersten Compare schalte ich die rote LED ein und setze den COMPARE auf arr[count+1] sowue count++ dadurch werden die LEDs zu unterschiedlichen Zeiten eingeschaltet und haben ihre individuellen PWM DutyCycles. Der Interrupt wird jedoch nur mit maximal 4x F_PWM = 4x122Hz = 488Hz aufgerufen. 4x deshalb weil overflow plus 3 unterschiedliche RGB werte. Sollten zwei Comparewerte zu nahe oder identisch sein, so wird ein Flag gesetzt welches dies azeigt. Dann soll im COMP ISR beide Farben eingeschaltet werden und count+=2 gemacht werden. arr[] wird in einer separaten Funktion befüllt. Idealerweise in der main loop, da dies nicht prioritär ist. Zwischen zwei Counts des Counters liegen 8 CPU Takte, da F_CPU / 8 eingestellt ist. Da der ISR wohl kaum nach 8 Takten zu ende ist, werden zu nahe beienanderliegende compare werte zusammengefasst. Denkt ihr, das könnte so klappen?
Holger K. schrieb: > Denkt ihr, das könnte so klappen? Das klappt auch so. Du bist nicht der Erste mit einer Idee in diese Richtung. https://www.mikrocontroller.net/articles/Soft-PWM
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.