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.
Gast #4034773
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.
Gast #4034794
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!
Gast #4035004
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...)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.