STM32F3: mehrere Capture/Compare Interrupts pro Periode

Gast #5508448
Lesenswert?

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
#5508493
Lesenswert?

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.
#5508510
Lesenswert?

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.
#5508514
Lesenswert?

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 ;-)
Gast #5508550
Lesenswert?

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?
Gast #5508563
Lesenswert?

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.

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