Forum: Mikrocontroller und Digitale Elektronik [stm32/CooCox] Probleme mit Timer 1 und PWM


von Tim S. (Gast)


Lesenswert?

Hi,

ich habe folgenden uC: stm32F407VG ( Discoveryboard )
Ich muss mit Timer 1 ein PWM-Signal erzeugen, welches eine 
Transistorbrücke ansteuert. Folglich benötige ich ein PWM-Signal und 
dessen invertiertes PWM-Signal. Als IDE benutze ich CooCox.

Ich habe ein Projekt erstellt und erstmal eine LED ( PD13 ) zum blinken 
gebracht. Der uC läuft mit 168MHz.Diese LED dient mir als 
Kontrollanzeige, um mir zu zeigen, dass der uC läuft. Im nächsten 
Schritt habe ich den Code erweitert, dass mithilfe von Timer1 ein 20KHz 
PWM-Signal mit einem Aussteuergrad von 50% generiert wird. Als 
Ausgangspins wurden die folgenden Pins verwendet: PA8 und PB13. Das 
Problem ist momentan, dass die Ausgangspins der PWM-Signale dauerhaft 
auf High-Pegel sind.

Kann mir einer weiterhelfen, an was das liegt ? Bin noch neu in der 
stm32 Welt und sitze schon seit einem Tag an dem Problem und komme 
einfach nicht weiter.
1
#include "stm32f4xx.h"
2
#include "stm32f4xx_gpio.h"
3
#include "stm32f4xx_rcc.h"
4
#include "stm32f4xx_tim.h"
5
6
int main(void)
7
{
8
9
  SystemInit();
10
  
11
  // LED Pin
12
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
13
  GPIO_InitTypeDef  GPIO_InitStructure;
14
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
15
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
16
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
17
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
18
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
19
  GPIO_Init(GPIOD, &GPIO_InitStructure);
20
  // LED Pin END
21
  
22
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
23
  GPIO_InitTypeDef GPIO_InitStructure2;
24
  GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;
25
  GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF;
26
  GPIO_InitStructure2.GPIO_OType=GPIO_OType_PP;
27
  GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_100MHz;
28
  GPIO_InitStructure2.GPIO_PuPd=GPIO_PuPd_UP;
29
  GPIO_Init(GPIOA,&GPIO_InitStructure2);
30
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource8,GPIO_AF_TIM1);
31
32
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
33
  GPIO_InitTypeDef GPIO_InitStructure3;
34
  GPIO_InitStructure3.GPIO_Pin=GPIO_Pin_13;
35
  GPIO_InitStructure3.GPIO_Mode=GPIO_Mode_AF;
36
  GPIO_InitStructure3.GPIO_OType=GPIO_OType_PP;
37
  GPIO_InitStructure3.GPIO_Speed=GPIO_Speed_100MHz;
38
  GPIO_InitStructure3.GPIO_PuPd=GPIO_PuPd_UP;
39
  GPIO_Init(GPIOB,&GPIO_InitStructure3);
40
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_TIM1);
41
42
  RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
43
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
44
  TIM_OCInitTypeDef TIM_OCInitStructure;
45
  TIM_TimeBaseStructure.TIM_Period=400;
46
  TIM_TimeBaseStructure.TIM_Prescaler=21;
47
  TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
48
  TIM_TimeBaseStructure.TIM_ClockDivision=0;
49
  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
50
51
  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
52
  TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
53
  TIM_OCInitStructure.TIM_Pulse=200;
54
  TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
55
  TIM_OC1Init(TIM1,&TIM_OCInitStructure);
56
  TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
57
58
  TIM_ARRPreloadConfig(TIM1,ENABLE);
59
  TIM_Cmd(TIM1,ENABLE);
60
61
  unsigned int test = 0;
62
  unsigned int i = 0;
63
  unsigned int e = 0;
64
    while(1)
65
    {
66
      //LED-Blinker
67
      GPIO_SetBits(GPIOD, GPIO_Pin_13);
68
      for(i = 0; i<50000 ; i++)
69
      {
70
          for(e = 0; e<100 ; e++)
71
          {
72
            test++;
73
          }
74
      }
75
      test = 0;
76
      GPIO_ResetBits(GPIOD, GPIO_Pin_13);
77
      for(i = 0; i<50000 ; i++)
78
      {
79
          for(e = 0; e<100 ; e++)
80
          {
81
            test++;
82
          }
83
      }
84
      test = 0;
85
      //LED-Blinker END
86
    }
87
}

von holger (Gast)


Lesenswert?

>  RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
          ^                      ^
          |                      |


Schau mal GENAU hin.

von chris (Gast)


Lesenswert?

Tim S. schrieb:
> RCC_APB1PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

da kann schonmal was nicht stimmen.
APB1 <-> APB2

von Tim S. (Gast)


Lesenswert?

ah...thx, das kommt von copy and paste, aber das Problem besteht 
weiterhin.

von EmBlocks (Gast)


Lesenswert?

1
...
2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
3
...
4
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_TIM1);

Von http://www.coocox.org/forum/topic.php?id=2701

von Tim S. (Gast)


Lesenswert?

EmBlocks schrieb:
> ...
> GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
> ...
> GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_TIM1);
>
> Von http://www.coocox.org/forum/topic.php?id=2701

Hab ich doch genau so gemacht, oder ?

von Alex M (Gast)


Lesenswert?

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

wenn du es so geändert hast, dann müsste es passen, zumindest sehe ich 
sonst nichts auffälliges kopfkratz
Hast du an Timer2 (general timer) versucht eine PWM auszugeben? evtl. 
ist an Timer1 (advanced timer) was besonderes einzustellen

von Tim S. (Gast)


Lesenswert?

EmBlocks schrieb:
> Von http://www.coocox.org/forum/topic.php?id=2701

Dieser Code funktioniert und Timer 1 gibt an dem positiven Pin ein 
PWM-Signal aus, wie bringe ich nun den negativen Kanal zum funktionieren 
? Im TIM_OCInitStructure muss es dafür bestimmt eine Einstellung geben, 
aber ich kenne Sie leider nicht, sonst wer ?

von Tim S. (Gast)


Lesenswert?

habe es nun am laufen um bin gerade dabei, ein Interrupt zu 
programmieren, der am Ende der PWM Periode gestartet wird, sodass ich 
den Aussteuergrad ändern kann.
1
TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);
2
NVIC_InitTypeDef NVIC_InitStructure;
3
NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;
4
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
5
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
6
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
7
NVIC_Init(&NVIC_InitStructure);
1
void TIM1_IRQHandler(void){
2
  TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
3
  TIM_SetCompare1(TIM1, 15800);
4
}

Nur das funktioniert so leider nicht, weis jemand wieso ?

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.