STM32F4 Timer PWM + Complementary

Gast #4034653
Lesenswert?

Hi, folgendes sollte meiner Ansicht nach eine PWM an PE9 und invertiert 
an PE8 erzeugen. Macht es aber irgendwie doch nicht, mag mir jemand 
sagen warum, wo liegt mein Fehler?
1
void pwm_init(void)
2
{
3
   //Enable PE and TIM1
4
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
5
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
6
   
7
   //PE 8,9 Output 
8
   GPIO_InitTypeDef GPIO_InitStructure;
9
   
10
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;
11
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
12
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
13
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
14
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
15
     GPIO_Init(GPIOE, &GPIO_InitStructure);
16
   
17
   GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_TIM1);
18
     GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_TIM1); 
19
   
20
   //TIM1 PWM 
21
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
22
     TIM_OCInitTypeDef  TIM_OCInitStructure;
23
   
24
   TIM_TimeBaseStructure.TIM_Period = 0xFFFF;    // Auto-Reload Value
25
     TIM_TimeBaseStructure.TIM_Prescaler = 0xFFFF; // 0xFFFF ~1.28kHz 0x07FF ~41kHz 0x1FFF ~ 20 kHz
26
     TIM_TimeBaseStructure.TIM_ClockDivision = 0;
27
     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
28

29
     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
30

31
     /* PWM1 Mode configuration: Channel1 */
32
     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
33
     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
34
   TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
35
     TIM_OCInitStructure.TIM_Pulse = 0xEFFF;                         //Duty-Cycle, TIM1_CCR1                   
36
     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
37
   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;    // High: OCN = ~OC
38
   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;      // Rotor bypass high-side
39
   TIM_OCInitStructure.TIM_CCNIdleState = TIM_OCNIdleState_Set;
40

41
     TIM_OC1Init(TIM1, &TIM_OCInitStructure); 
42

43
     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
44
   
45
   TIM_ARRPreloadConfig(TIM1, ENABLE);
46
    
47
   TIM_Cmd(TIM1, ENABLE);
48
    
49
}

Aktuelles verhalten ist, dass PE8 u. PE9 auf Low bleiben.
#4034685
Lesenswert?

Für die PWM muss nicht nur der Timer eingeschaltet werden (TIM_CR1_CEN), 
sondern auch die Capture&Compare channels aktiviert werden 
(TIM_CCER_CCxE, TIM_CCER_CCxNE) und der "Main Output" (TIM_BDTR_MOE) 
gesetzt sein.

Im Normalfall gibt es in den Libs eigene Funktion, die alle nötigen Bits 
setzen, damit man sich nicht selbst den Kopf zerbrechen muss.

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