Forum: Mikrocontroller und Digitale Elektronik STM32F3: mehrere Capture/Compare Interrupts pro Periode


von Andreas (Gast)


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

von Carl D. (jcw2)


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.

: Bearbeitet durch User
von Alex D. (daum)


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.

von Carl D. (jcw2)


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 ;-)

von Andreas (Gast)


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?

von Alex D. (daum)


Lesenswert?

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.

von Andreas (Gast)


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.

von Andreas (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.