Forum: Mikrocontroller und Digitale Elektronik STM32L4 PWM schaltet zu langsam ein/ab


von Uwe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich habe eine Frage bzgl. der PWM Erzeugung im STM32L4. Ich möchte gern 
3 RGB LED gemultiplext mit jeweils 3 PWM Kanälen ansteuern. habe aber 
ein Problem mit der PWM.

Im angehängten Bild seht ihr in den Farbeb Blau/Grün und Rot die 
Ansteuerung der Anoden der LED und Gelb die PWM auf einer Kathode. Das 
Problem was ich habe ist, das ich die PWM nicht rechtzeitig ein und 
ausgeschaltet bekomme.
1
case 1: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_RESET); 
2
                HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET);                
3
                __HAL_TIM_SET_COUNTER(&htim1, 0);
4
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0x0EFF);
5
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0x0000);
6
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0x0000); 
7
                LOOP = 2;
8
                break;
9
  case 2: HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_RESET); 
10
                 HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET);               
11
                __HAL_TIM_SET_COUNTER(&htim1, 0);
12
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0x0000);
13
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0x0EFF);
14
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0x0000);                  
15
                LOOP = 3;
16
                break;
17
        case 3: 
18
                HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_RESET); 
19
                HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET);               
20
                __HAL_TIM_SET_COUNTER(&htim1, 0);
21
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0x0000);
22
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0x0000);
23
                __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0x0EFF);               
24
                LOOP = 4;
25
                break;

Kann ich da noch was schneller machen? Hat soetwas schonmal jemand von 
euch
gemacht?

von Christopher J. (christopher_j23)


Lesenswert?

Ich denke, dass da wieder mal das ARPE-Bit gesetzt ist und somit die 
CCR-Werte erst mit dem nächsten Update-Event übernommen werden.

von Uwe (Gast)


Lesenswert?

Hallo Christopher,

leider nicht, das ARPE-Bit ist auf Null. Wann wird diess Update-Event 
ausgelöst?

Vielleicht geht es auch einfach nicht schneller.

von Christopher J. (christopher_j23)


Lesenswert?

Das Update-Event wird immer dann ausgelöst, wenn der Timer ARR erreichen 
würde und dann wieder genullt wird oder wenn man es händisch auslöst.

von Darth Moan (Gast)


Lesenswert?

Moin,

Christopher J. schrieb:
> Ich denke, dass da wieder mal das ARPE-Bit gesetzt ist und somit die
> CCR-Werte erst mit dem nächsten Update-Event übernommen werden.

so, wie ich die Timer verstehe, ist das ARPE bit nur fuer das ARR
Register zustaendig. Fuer die Compare Register ist das zugehoerige
Preload bit im config Register TIMx_CCMR1 zustaendig.

Ausm RefMan:
OC1PE: Output compare 1 preload enable
0: Preload register on TIMx_CCR1 disabled. TIMx_CCR1 can be written at
   anytime, the new value is taken in account immediately.
1: Preload register on TIMx_CCR1 enabled. Read/Write operations access
   the preload register. TIMx_CCR1 preload value is loaded in the active
   register at each update event.


Kann mich aber auch irren, den STM32L4 hab ich noch am Wickel gehabt.
Nur mal im RefMan geschmökert.

von Christopher J. (christopher_j23)


Lesenswert?

Darth Moan schrieb:
> so, wie ich die Timer verstehe, ist das ARPE bit nur fuer das ARR
> Register zustaendig. Fuer die Compare Register ist das zugehoerige
> Preload bit im config Register TIMx_CCMR1 zustaendig.

Jap, du hast natürlich recht, ARPE ist nur für ARR und für CCR ist OCPE. 
Das hatte ich vermischt. Der Effekt der "Preload Enable" Bits ist 
jedenfalls jeweils der, dass wenn es aktiv ist, der Wert für ARR oder 
CCR zunächst in ein Shadow-Register geschrieben wird und erst beim 
nächsten Update-Event aktiv wird.

von Uwe (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

vielen Dank, das war es. OC1PE auf 0 und schon geht es.
Das ist auch eine wahnsinns Anzahl an Registern nur für einen Timer.

von Kurt Harders (Gast)


Lesenswert?

Hallo Uwe,

wenn Du statt HAL_GPIO jetzt noch LL_GPIO verwendest, wird es noch ein 
wenig schneller.

Grüße, Kurt

von Uwe (Gast)


Lesenswert?

Hallo Kurt,

danke für den Tipp, das war mir auch neu.

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.