You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/Info/PWM/STM32.md
+56-33Lines changed: 56 additions & 33 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -3,56 +3,79 @@ title: STM32
3
3
description: Comment générer un signal PWM sur un microcontrôleur STM32
4
4
---
5
5
6
-
# STM32
6
+
# Génération de signaux PWM avec STM32
7
+
8
+
## Définition
7
9
8
10
Le PWM (Pulse Width Modulation) consiste à moduler la largeur d'une impulsion pour contrôler la puissance moyenne délivrée à un composant.
9
11
C'est un signal carré dont le rapport cyclique (temps haut / temps total) est variable :
10
12
<imgsrc="/images/Info/PWM/signals.webp"alt="PWM">
11
13
12
-
Deux paramètres sont à prendre en compte :
14
+
Sur les microcontrôleurs STM32, la génération des signaux PWM se fait à l'aide des timers.
15
+
16
+
## Timers et interruptions
17
+
18
+
Un **timer** est un circuit logique numérique qui permet de compter, en incrémentant une valeur à chaque cycle d'horloge. Voici une vidéo très instructive qui en explique le fonctionnement, ainsi que la notion d'interruption.
13
19
14
-
- La fréquence du signal : elle est fixe et dépend du composant (ex : 50Hz pour un servo-moteur analogique)
15
-
- Le temps haut du signal : il est variable et fixe le rapport pour chaque cycle
20
+
<iframewidth="100%"height="415"src="https://www.youtube.com/embed/VfbW6nfG4kw?si=nHV48kzDUsvhJzZw"title="YouTube video player"frameborder="0"allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"referrerpolicy="strict-origin-when-cross-origin"allowfullscreen></iframe>
16
21
17
-
## Paramétrage de la carte
22
+
Parlons un peu plus en détails de l'architecture des timers dans les microcontrôleurs STM32 (timesptamp : 3:39 de la vidéo). Comme vous pouvez le voir dans l'onglet `Clock configuration` du fichier `.ioc` sur STM32CubeMX, l'horloge interne du microcontrôleur (représenté par `HCLK`) est divisée en deux bus (`APB1` et `APB2`), et chaque bus est relié à plusieurs timers. C'est en réalité la fréquence des bus (`APB_ peripheral clock`) qui est la valeur qui sera divisée par le `prescaler` dans la configuration des timers (à ne pas confondre avec les `prescaler`s de la configuration de l'horloge).
18
23
19
-
Avant de régler le timer, il faut configurer la clock que va utiliser le timer (menu `Clock Configuration`).
20
-
Ici, on utilise le timer `TIM1` qui est sur le bus `APB2` et qui a une fréquence de 4MHz :
Il est donc possible de modifier la fréquence de l'horloge de chaque bus de manière indépendante en modifiant les variables `APB_ peripheral clock`, mais cela devient assez vite chaotique à gérer à cause des `prescaler`s de la configuration de l'horloge (vous pouvez essayez si vous aimez souffir). Nous conseillons de faire comme dans la vidéo : modifier **uniquement** la fréquence de l'horloge du microcontrôleur (`HCLK`), et choisir le `prescaler` de chacun des timers que vous souhaitez utiliser pour votre fréquence de comptage.
22
25
23
-
> Pour trouver quelle clock le timer utilise, il faut regarder la [datasheet](https://www.st.com/resource/en/datasheet/stm32l432kc.pdf) du microcontrôleur, dans la section `Memory mapping` (ici, page 60).
24
26
> [!TIP]
27
+
> Puisque les timers d'un microcontrôleur STM32 peuvent avoir des spécificités différentes, il est conseillé regarder la [datasheet](https://www.st.com/resource/en/datasheet/stm32l432kc.pdf) pour choisir vos timers.
25
28
26
-
Ensuite, on peut régler le timer TIM1 qu'on utilisera pour générer le signal PWM.
27
-
Ici, l'objectif était d'avoir trois signaux, d'où le mode PWM sur 3 channels :
Maintenant que vous savez ce qu'est un timer, et comment le manipuler, nous verrons comment l'utiliser pour générer des signaux PWM.
29
30
30
-
Il est aussi nécessaire de calculer la valeur du prescaler à partir de la clock (4MHz),
31
-
du compteur utilisé (4096) et de la fréquence voulue (50Hz) : `4MHz ÷ (4096*50Hz) - 1 = 18`.
32
31
33
-
## Génération du signal
32
+
## Signal PWM simple
34
33
35
-
Pour commencer la génération du signal, il faut utiliser la fonction `HAL_TIM_PWM_Start` :
34
+
Voici une vidéo qui explique très bien comment générer des signaux PWM avec un microcontrôleur STM32.
36
35
37
-
```c
38
-
// htim1 et TIM_CHANNEL_X sont automatiquement générés par CubeMX
39
-
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
40
-
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
41
-
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
42
-
```
36
+
<iframewidth="100%"height="415"src="https://www.youtube.com/embed/AjN58ceQaF4?si=QPCLBDvGKuvLXI2D"title="YouTube video player"frameborder="0"allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"referrerpolicy="strict-origin-when-cross-origin"allowfullscreen></iframe>
43
37
44
-
Maintenant que le signal est généré, il est possible de modifier le compte de chaque channel :
38
+
Il y a quelques points à ajouter à cette vidéo.
45
39
46
-
```c
47
-
htim1.Instance->CCR1 = 205; // Channel 1
48
-
htim1.Instance->CCR2 = 410; // Channel 2
49
-
htim1.Instance->CCR3 = 615; // Channel 3
50
-
```
40
+
- La première chose est qu'il est possible de modifier les valeurs de `prescaler`, `counter period` et `pulse` directement dans le code. Les fonctions sont respectivement `__HAL_TIM_SET_PRESCALER()`, `__HAL_TIM_SET_AUTORELOAD()` et `__HAL_TIM_SET_COMPARE()`.
41
+
42
+
- La deuxième chose est que certains channels sont suivis d'un suffixe "N" (ex. `PWM Generation CH2N`). Il s'agit de sorties complémentées, c'est-à-dire que le `pulse` définit la période à l'état BAS, et non à l'état HAUT comme pour les channels classiques. Ainsi, le rapport cyclique y est inversé. Pour lancer un PWM sur un tel channel, on utilise plutôt `HAL_TIMEx_PWMN_Start()`.
43
+
44
+
- La troisième : on peut bien sûr arrêter un signal PWM avec `HAL_TIM_PWM_Stop()` pour les channels normaux et `HAL_TIMEx_PWMN_Stop()` pour les channes complémentés.
45
+
46
+
- Enfin la quatrième : le microcontrôleur que nous utilisons (Nucleo L432KC) n'a pas de broches pour activer un mode "téléversement" et un mode "lancement".
47
+
48
+
## Signal PWM en mode interruption
49
+
50
+
Il est possible de générer des signaux PWM avec interruptions.
51
+
52
+
Pour ce faire, il faut d'abord activer le mode interruption du timer dans l'onglet `NVIC Settings` au niveau du fichier `.ioc`.
Puis, au niveau du code, on lance le signal PWM en mode IT `HAL_TIM_PWM_Start_IT()`. Il faudra ensuite définir le contenu de la fonction exécutée à chaque interruption `HAL_TIM_PWM_PulseFinishedCallback()`.
57
+
58
+
59
+
## Signal PWM avec DMA
60
+
61
+
La génération d'un signal PWM en mode **DMA** (Direct Access Memory) consiste à modifier le duty cycle du signal PWM à chaque fin de période. Pour ce faire, chaque valeur du CCR (la période à l'état haut) est renseignée dans un tableau, et à chaque fin d'impulsion du signal, la valeur suivante est chargée. On obtient donc un signal PWM à duty cycle variable.
62
+
63
+
Pour ce faire, on active le mode DMA dans l'onglet `DMA Settings` dans le fichier `.ioc`.
-**normal** : Une fois arrivé à la fin du tableau, la génération du signal s'arrête.
70
+
-**circular** : Une fois arrivé à la fin du tableau, on reprend du début du tableau.
51
71
52
-
Enfin, pour arrêter la génération du signal, il faut utiliser la fonction `HAL_TIM_PWM_Stop` :
72
+
Niveau code, il suffit de définir un tableau de `unit16_t`, donner la valeur de chaque CCR dans le tableau, et appeler la fonction `HAL_TIM_PWM_Start_DMA()`. Voici un exemple assez parlant, extrait du site [Controllerstech](https://controllerstech.com/pwm-in-stm32/) très explicatif, avec un `ARR = 100` :
Copy file name to clipboardExpand all lines: docs/Info/STM32/Installation.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ Pour cela, rendez-vous sur [le site officiel de STM Electronics](https://www.st.
17
17
18
18
## Installation de l'IDE
19
19
20
-
-### STM32CubeIDE
20
+
### STM32CubeIDE
21
21
22
22
C'est, dans une certaine mesure, la manière la plus facile de développer sur STM32 (même si sa prise en main est fastidieuse). Lancé en 2015 et basé sur Eclipse, cet IDE permet de rédiger, compiler et débuger du code sur la STM32.
23
23
@@ -28,7 +28,7 @@ Sur Linux, il est possible que le fichier d'installation ne soit pas exécutable
28
28
> Si vous utilisez `flatpak` sur Linux : `flatpak install flathub com.st.STM32CubeIDE`
29
29
> (ne nécessite pas de donner son email, nom et prénom).
30
30
31
-
-### STM32CubeIDE for Visual Studio Code
31
+
### STM32CubeIDE for Visual Studio Code
32
32
33
33
C'est la dernière nouveauté (2025)! Il s'agit d'une extension de VSCode qui permet d'obtenir les mêmes fonctionnalités que STM32CubeIDE tout en restant sur VSCode (qui est bien plus aisé à prendre en main).
0 commit comments