Compare von Timer verschieben

(Firma: matzetronics) #4254315
Lesenswert?

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."
OP #4254334
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren