Hallo, mit Hilfe eines Timers (TIM1) erzeuge ich drei PWM Signale. Dazu werden die CCR1 bis CCR3 Register verwendet. Mit Hilfe eines weiteren Registers, zum Beispiel CCR4 möchte Interrupts generieren und in die entsprechende ISR springen. Dies funktioniert auch soweit. Nun sollen aber pro eine PWM Periode mehrere CCR4 Interrupts generiert werden. Beispielsweise 10 Interrupts pro Periode. Meine Idee war, in der ISR des CCR4 den Wert des CCR4 um 1/10 des Auto Reload Wertes zu erhöhen, damit "bald" wieder ein Interrupt generiert wird. Leider scheint es nicht direkt so zu funktionieren. Ich könnte mir vorstellen, dass der Timer die CCR Werte erst bei Über- und Unterlauf übernimmt. Stimmt das? Gibt es eine Möglichkeit, den nächsten Wert sofort zu übernehmen? Viele Grüße
Andreas schrieb: > Hallo, > > mit Hilfe eines Timers (TIM1) erzeuge ich drei PWM Signale. Dazu werden > die > CCR1 bis CCR3 Register verwendet. > Mit Hilfe eines weiteren Registers, zum Beispiel CCR4 möchte Interrupts > generieren und in die entsprechende ISR springen. > Dies funktioniert auch soweit. > > Nun sollen aber pro eine PWM Periode mehrere CCR4 Interrupts generiert > werden. Beispielsweise 10 Interrupts pro Periode. > Meine Idee war, in der ISR des CCR4 den Wert des CCR4 um 1/10 des Auto > Reload Wertes zu erhöhen, damit "bald" wieder ein Interrupt generiert > wird. > Leider scheint es nicht direkt so zu funktionieren. > > Ich könnte mir vorstellen, dass der Timer die CCR Werte erst bei Über- > und Unterlauf übernimmt. > Stimmt das? Wenn man ihm nicht sagt, daß er es anders machen soll, dann übernimmt er diverse Schadow-Register erst beim "Update-Event" in die Echten. Das ist eigentlich gut, da so jeder Durchlauf mit einem "stabilen" Satz an Parametern abläuft. > Gibt es eine Möglichkeit, den nächsten Wert sofort zu übernehmen? Muß mal in der Doku schauen. Dauert noch ein paar Minuten. ARPE-Bit im CR1 bestimmt ob die Schadow-Register nur beim Update-Event (Overflow u/o Comp_n...) oder ständig in die "Echt-Register" kopiert wird.
:
Bearbeitet durch User
Carl D. schrieb: > ARPE-Bit im CR1 bestimmt ob die Schadow-Register nur beim Update-Event > (Overflow u/o Comp_n...) oder ständig in die "Echt-Register" kopiert > wird. Das ARPE (Auto Reload Preload Enable) bit bestimmt nur ob das ARR Register zwischengespeichert wird. Für die CCR Register gibt es im CCMR die bits OCxPE. Die für Channel 1 und 2 sind in CCMR1, 3 und 4 in CCMR2. Wenn du diese bits auf 0 setzt wird das entsprechende CCR Register direkt übernommen und nicht erst beim Update Event. Alternativ kannst du auch im Interrupt ein UpdateEvent generieren indem du das UG bit im TIMx_EGR setzt, dann werden die Shadow Register auch übernommen.
Alex D. schrieb: > Carl D. schrieb: >> ARPE-Bit im CR1 bestimmt ob die Schadow-Register nur beim Update-Event >> (Overflow u/o Comp_n...) oder ständig in die "Echt-Register" kopiert >> wird. > > Das ARPE (Auto Reload Preload Enable) bit bestimmt nur ob das ARR > Register zwischengespeichert wird. Für die CCR Register gibt es im CCMR > die bits OCxPE. Die für Channel 1 und 2 sind in CCMR1, 3 und 4 in CCMR2. > Wenn du diese bits auf 0 setzt wird das entsprechende CCR Register > direkt übernommen und nicht erst beim Update Event. > > Alternativ kannst du auch im Interrupt ein UpdateEvent generieren indem > du das UG bit im TIMx_EGR setzt, dann werden die Shadow Register auch > übernommen. Du hast recht. Wäre ich Lehrer/Prof, würde ich jetzt behaupten, ich wollte den TO nur zu eingehenden Studium des DB anregen ;-)
Vielen Dank für eure Tipps :-) Habe mit den Begriffen auch die Stelle im Datenblatt gefunden. Leider klappt es nicht mit dem auf 0 Setzen des OC4PE Registers: TIM1->CCMR2 &= ~TIM_CCMR2_OC4PE; Kann es damit zusammenhängen, dass CCR1, CCR2 und CCR3 dazu verwendet werden, eine Center Aligned PWM zu erzegen?
Die unterschiedlichen Channel sollten sich eigentlich nicht beeinflussen können. Funktioniert es mit dem setzen des UG bits auch nicht? Sonst nochmal probieren ob es bei einem anderen Timer geht, dann wäre es irgendein Timer-spezifischer Spinner.
Das mit dem UG Bit funktioniert auch nicht. Allerdings wäre das auch ungünstig, da bei mir im Update IRQ auch noch andere Dinge gemacht werden. Wenn ich die PWM von Center Aligned auf TIM_CounterMode_Up stelle, dann funktioniert es mit dem setzen des OC4PE auf Null. Also dann wird der CCR4 Wert sofort übernommen und ich bekomme entsprechend viele Interrupts.
Leider kann ich auf Center Aligned PWM nicht verzichten.
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.