Forum: Mikrocontroller und Digitale Elektronik STM32 Timer im gatemodus


von Fragender (Gast)


Lesenswert?

Hallo,
ich möchte zwei Timer im "gated-mode" betreiben. TIM4 soll nur eine PWM 
ausgeben, wenn die Pulse der TIM2-PWM high sind. TIM4 ist hierbei der 
Slave von TIM2. Getriggert werden soll dieser über den ITR1. Leider 
komme ich überhaupt nicht weiter. Im Moment laufen einfach beide PWMs. 
Erstellt wurde der Code im CubeMX. Genutzt wird der STM32F767.
Vielleicht kann mir jemand einen Tipp geben woran das liegen könnte?

Viele Grüße und vielen Dank schonmal.
1
static void MX_TIM2_Init(void)
2
{
3
4
  TIM_ClockConfigTypeDef sClockSourceConfig;
5
  TIM_MasterConfigTypeDef sMasterConfig;
6
  TIM_OC_InitTypeDef sConfigOC;
7
8
  htim2.Instance = TIM2;
9
  htim2.Init.Prescaler = 4999;
10
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
11
  htim2.Init.Period = 99;
12
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
13
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
14
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
15
  {
16
    _Error_Handler(__FILE__, __LINE__);
17
  }
18
19
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
20
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
21
  {
22
    _Error_Handler(__FILE__, __LINE__);
23
  }
24
25
  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)
26
  {
27
    _Error_Handler(__FILE__, __LINE__);
28
  }
29
30
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
31
  sConfigOC.Pulse = 3;
32
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
33
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
34
  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
35
  {
36
    _Error_Handler(__FILE__, __LINE__);
37
  }
38
39
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
40
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE;
41
    if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
42
    {
43
      _Error_Handler(__FILE__, __LINE__);
44
    }
45
46
  HAL_TIM_MspPostInit(&htim2);
47
48
}
49
50
static void MX_TIM4_Init(void)
51
{
52
53
  TIM_ClockConfigTypeDef sClockSourceConfig;
54
  TIM_SlaveConfigTypeDef sSlaveConfig;
55
  TIM_MasterConfigTypeDef sMasterConfig;
56
  TIM_OC_InitTypeDef sConfigOC;
57
58
  htim4.Instance = TIM4;
59
  htim4.Init.Prescaler = 179;
60
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
61
  htim4.Init.Period = 99;
62
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
63
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
64
  if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
65
  {
66
    _Error_Handler(__FILE__, __LINE__);
67
  }
68
69
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
70
  if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
71
  {
72
    _Error_Handler(__FILE__, __LINE__);
73
  }
74
75
  if (HAL_TIM_PWM_Init(&htim4) != HAL_OK)
76
  {
77
    _Error_Handler(__FILE__, __LINE__);
78
  }
79
80
81
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
82
  sConfigOC.Pulse = 0;
83
  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
84
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
85
  if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
86
  {
87
    _Error_Handler(__FILE__, __LINE__);
88
  }
89
90
91
  sSlaveConfig.SlaveMode = TIM_SLAVEMODE_GATED;
92
  sSlaveConfig.InputTrigger = TIM_TS_ITR1;
93
  if (HAL_TIM_SlaveConfigSynchronization(&htim4, &sSlaveConfig) != HAL_OK)
94
  {
95
    _Error_Handler(__FILE__, __LINE__);
96
  }
97
98
  HAL_TIM_MspPostInit(&htim4);
99
100
}
101
102
main:
103
104
htim2.Instance->CCR3 = 50;
105
htim4.Instance->CCR4 = 50;
106
107
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
108
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3);

von pegel (Gast)


Lesenswert?

Ich habe so etwas für den F103 gemacht. T1 PWM triggert T2 PWM.

Hast du ein BluePill Board da?
Dann würde ich dir die funktionierende CubeMX Projekt Datei anhängen.

von Harry L. (mysth)


Lesenswert?

pegel schrieb:
> Ich habe so etwas für den F103 gemacht. T1 PWM triggert T2 PWM.
>
> Hast du ein BluePill Board da?
> Dann würde ich dir die funktionierende CubeMX Projekt Datei anhängen.

Das Beispiel würde mich auch interessieren!

Danke für die Mühe!

von pegel (Gast)


Angehängte Dateien:

Lesenswert?

Gut. Es erzeugt Code für SW4STM32.
In die main.c muss noch:
1
  /* USER CODE BEGIN 2 */
2
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);
3
  HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
4
5
  /* USER CODE END 2 */

Dann wird an PA8 der PWM T1 Puls und an PA0 die PWM Pulsfolge von T2 
ausgegeben.

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.