Forum: Mikrocontroller und Digitale Elektronik stm32discovery + PWM --> Channel1 fehlt?!


von Verzweifelter (Gast)


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
}

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Vermutlich musst Du das JTAG Interface deaktivieren.

Besser nehme einen anderen Pin.

von Verzweifelter (Gast)


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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

von Verzweifelter (Gast)


Lesenswert?

@ Markus - Danke für die Info!

Ich werde das morgen mal testen und dann hier schreiben wie/ob es 
klappt.

von Verzweifelter (Gast)


Lesenswert?

Ah - Seite 115 im Ref.Man stehts. Gut zu wissen...

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.