stm32discovery + PWM --> Channel1 fehlt?!

Gast #3009479
Lesenswert?

Hallo zusammen,

Entweder ich habe heute Abend Tomaten auf den Augen oder ich bin schon 
zu müde, aber ich finde den Fehler einfach nicht. Vermutlich nur eine 
Kleinigkeit, aber ich suche mir ziemlich einen ab.

Soll-Situation:
Der Code soll 4 PWM Signale mit dem Timer3 generieren.

Ist-Situation:
Channel2-4 geben wie gewünscht ihr Signal aus, nur Channel1 auf PB4 gibt 
dauernd "1" aus.

Ich nutze die Partial-Remap Config. Siehe auch Seite 135 Table 35. im 
Reference Manual. Doch warum kommt aus PB4 kein PWM Signal raus?

Ich habe den Code bereits auf 2 Boards getestet um sicherzustellen, dass 
der Pin keinen Hau hat. Daran liegt es also nicht.
1
#include "stm32f10x.h"
2
#include "stm32f10x_tim.h"
3
#include "stm32f10x_rcc.h"
4
#include "stm32f10x_gpio.h"
5

6
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
7
TIM_OCInitTypeDef  TIM_OCInitStructure;
8
GPIO_InitTypeDef GPIO_InitStructure;
9

10
void servo_signal_init (void)
11
{
12

13
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
14

15
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
16

17
    /* GPIO Configuration */
18

19
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_0 | GPIO_Pin_1;
20
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
21
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
22
          GPIO_Init(GPIOB, &GPIO_InitStructure);
23

24
          GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); // siehe Ref.Man Seite 116 unten
25

26

27

28
    //TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100
29
    //TIM3 Channel2 duty cycle = (TIM3_CCR2/ TIM3_ARR)* 100
30
    //TIM3 Channel3 duty cycle = (TIM3_CCR3/ TIM3_ARR)* 100
31
    //TIM3 Channel4 duty cycle = (TIM3_CCR4/ TIM3_ARR)* 100
32

33
    /* Time base configuration */
34
    TIM_TimeBaseStructure.TIM_Period = 1000 - 1;
35
    TIM_TimeBaseStructure.TIM_Prescaler = 1-1;
36
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
37
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
38

39
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
40

41

42
    /* PWM1 Mode configuration: Channel1 */
43
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
44
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
45
    TIM_OCInitStructure.TIM_Pulse = 0;
46
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
47

48
    TIM_OC1Init(TIM3, &TIM_OCInitStructure);
49

50
    TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
51

52
    /* PWM1 Mode configuration: Channel2 */
53
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
54
    TIM_OCInitStructure.TIM_Pulse = 0;
55

56
    TIM_OC2Init(TIM3, &TIM_OCInitStructure);
57

58
    TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
59

60
    /* PWM1 Mode configuration: Channel3 */
61
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
62
    TIM_OCInitStructure.TIM_Pulse = 0;
63

64
    TIM_OC3Init(TIM3, &TIM_OCInitStructure);
65

66
    TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
67

68
    /* PWM1 Mode configuration: Channel4 */
69
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
70
    TIM_OCInitStructure.TIM_Pulse = 0;
71

72
    TIM_OC4Init(TIM3, &TIM_OCInitStructure);
73

74
    TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
75

76
    TIM_ARRPreloadConfig(TIM3, ENABLE);
77

78

79
}
80

81
void set_servo_signal (uint8_t servo,uint16_t ch)
82
{
83
  switch (servo)
84
  {
85
    case 1:
86
    TIM3->CCR1 = ch;
87
    break;
88

89
    case 2:
90
    TIM3->CCR2 = ch;
91
    break;
92

93
    case 3:
94
    TIM3->CCR3 = ch;
95
    break;
96

97
    case 4:
98
    TIM3->CCR4 = ch;
99
    break;
100
  }
101
}
102

103
void on_off_servo_signal_timer(uint8_t on)
104
{
105
  if (on)
106
  {
107
    TIM_Cmd(TIM3, ENABLE);
108
  }
109
  else
110
  {
111
    TIM_Cmd(TIM3, DISABLE);
112
  }
113
}
1
int main(void)
2
{
3
  servo_signal_init();
4
  set_servo_signal(1,100);
5
  set_servo_signal(2,200);
6
  set_servo_signal(3,300);
7
  set_servo_signal(4,400);
8
  on_off_servo_signal_timer(1);
9

10
while(1)
11
{
12
}
Gast #3009548
Lesenswert?

Ich habe jetzt mal die GPIO_FullRemap_TIM3 config probiert und da sind 
alle Kanäle vorhanden (Dann jedoch auf PC6-9, was mir eigentlich nicht 
so recht ist, aber im Notfall wohl auch ginge).

Ich wüsste aber trotzdem gerne mal warum es in der PartialRemap nicht 
funktioniert. :-(

@Markus,

du meinst es liegt am JTAG-Interface? Wie kann ich das denn 
deaktivieren?

Gruß und Danke
Verzweifelter
(Firma: EleLa - www.elela.de) #3009596
Lesenswert?

Nun ja, im Datasheet steht dass PB4 nach dem Rest JNTRST ist und ich 
meine mal irgendwo gelesen zu haben, dass wenn man die Portpin Funktion 
haben will, dass man dann JTAG deaktivieren muss, bzw. umschalten auf 
nur SWD.

Kannst ja mal schreiben wo das in der Doku steht, ich habe gerade keine 
Lust es zu suchen.

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