STM32L4 PWM schaltet zu langsam ein/ab

Gast #5292163
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?
Angehängte Dateien:
Gast #5292360
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.
#5292672
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.

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