Forum: Mikrocontroller und Digitale Elektronik STM32F103xx PWM Problem


von MC123 (Gast)


Lesenswert?

Hallo,
Ich versuche am Pin PB13 ein PWM auszugeben um damit eine LED dimmen zu 
können. Leider gelingt es mir nicht den PWM zu aktivieren.
Weiß jemand, wo mein Fehler liegt?
1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
2
3
GPIO_StructInit(&GPIO_InitStructure); // Reset init structure
4
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;
5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          
7
GPIO_Init(GPIOB, &GPIO_InitStructure);
8
9
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
10
TIM_TimeBaseStructInit( &TIM_TimeBaseInitStruct ); 
11
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV4;
12
TIM_TimeBaseInitStruct.TIM_Period = 1000 - 1;
13
TIM_TimeBaseInitStruct.TIM_Prescaler = 240 - 1;
14
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;  
15
TIM_TimeBaseInit( TIM1, &TIM_TimeBaseInitStruct );
16
  
17
18
TIM_OCInitTypeDef TIM_OCInitStruct;
19
TIM_OCStructInit( &TIM_OCInitStruct );
20
TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;
21
TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
22
TIM_OCInitStruct.TIM_Pulse = 400; // duty cycle equals 0=0% 1000=100%
23
TIM_OC2Init( TIM1, &TIM_OCInitStruct );
24
TIM_Cmd( TIM1, ENABLE );

von vaid (Gast)


Lesenswert?

MC123 schrieb im Beitrag #2582914:
> TIM_OC2Init( TIM1, &TIM_OCInitStruct );

PB13 ist aber OC1Init

Außerdem:

MC123 schrieb im Beitrag #2582914:
> TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;

weiss es nicht ganz genau, kann aber sein, dass er dann nur ein mal 
durchläuft. Das würde ich erst mal auskommentieren

von MC123 (Gast)


Lesenswert?

Beides ist ziehmlich einleuchtend, habe auch beides geändert,
es läuft leider aber trotzdem noch nicht.

von vaid (Gast)


Lesenswert?

MC123 schrieb im Beitrag #2582941:
> es läuft leider aber trotzdem noch nicht

Hast du das gemessen oder nur "gesehen"?!


Hier mal Initcode mit dem der Timer4 bei mir initialisiert wird:
1
void TIM4_Configuration(void)
2
{
3
    TIM_OCInitTypeDef  TIM_OCInitStructure;
4
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
5
  /* TIM1 Peripheral Configuration --------------------------------------------*/
6
  /* Time Base configuration */
7
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
8
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
9
  TIM_TimeBaseStructure.TIM_Period = MAX_PWM;
10
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
11
12
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
13
14
  /* Channel 3 Configuration in PWM mode */
15
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
16
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
17
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
18
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
19
  TIM_OC3Init(TIM4, &TIM_OCInitStructure);
20
21
  /* Channel 1 Configuration in PWM mode */
22
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
23
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
24
  TIM_OCInitStructure.TIM_Pulse = 10;
25
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
26
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
27
  TIM_OC1Init(TIM4, &TIM_OCInitStructure);
28
29
  TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);
30
  TIM_ARRPreloadConfig(TIM4,ENABLE);
31
32
  /* TIM1 Update DMA Request enable */
33
  TIM_DMACmd(TIM4, TIM_DMA_Update, ENABLE);
34
35
  /* TIM1 counter enable */
36
  TIM_Cmd(TIM4, ENABLE);
37
}

von MC123 (Gast)


Lesenswert?

@vaid
Ich habe leider kein Oszilloskop, deshalb kann ich es nur sehen.
Die LED funktioniert aber wenn Ich PB13 als normalen Ausgang 
konfigurieren dann klappt das ein- und ausschalten der LED.

von bumpy (Gast)


Lesenswert?


von MC123 (Gast)


Lesenswert?

Habe es mittlerweile geschaft.
Das Problem war period und pulse müssen natürlich auch passend zur 
MC-Frequenz berechnet werden.

period = (SystemCoreClock / 20000 ) - 1;

Danke für die Tipps.

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.