Forum: Mikrocontroller und Digitale Elektronik STM32F4 Timer PWM + Complementary


von doku (Gast)


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.

von Vincent H. (vinci)


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.

von doku (Gast)


Lesenswert?

Okay, danke erstmal. Zu den Libs hab ich leider keine anständige Doku 
gefunden, und auch im Referenz Manual steht jetzt (jedenfalls fuer mich) 
nicht so klar welche Bits gesetzt sein muessen damit das Teil tut.
Naja, sieht aus als wuerde mir der TIM_BDTR_MOE fehlen, werd den mal 
versuchen.

Danke.

von doku (Gast)


Lesenswert?

Ja, das wars, hab das ergaenzt:
1
   TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
2
   (..)
3
   TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
4
   TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

Vielen Dank nochmals!

von doku (Gast)


Lesenswert?

Doch nicht, das hat zwar irgend was gemacht - aber keine PWM. Der 
TIM_BDTR Kram kann also wieder raus.

Und dann einfach einschalten:
1
    ...
2
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
3
    ...


(Und falls das jemand copy-pasted, so wie ich: Im TIM_TimeBaseInit 
gehoert der TIM korrigiert...)

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.