Skip to content

Commit eb26041

Browse files
committed
Merge branch 'feat/pwm_doc'
2 parents 279d3aa + da532ce commit eb26041

10 files changed

Lines changed: 106 additions & 94 deletions

File tree

TODO.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77

88
## Utilisation STM32
9-
- [ ] Installation de STM32Cube IDE et MX (à détailler)
9+
- [x] Installation de STM32Cube IDE et MX (à détailler)
1010
- [ ] Workspace avec STM32CubeIDE
11-
- [ ] Installation de l'extension VSCode (à détailler)
12-
- [ ] Utilisation de l'extension VSCode
11+
- [x] Installation de l'extension VSCode (à détailler)
12+
- [x] Utilisation de l'extension VSCode
1313
- [ ] Structure des dossiers (Src et Inc)
14+
- [ ] Commande des moteurs pas à pas
1415

1516
## Usinage 3D
1617
-[ ] setup le post process et la machine en premier

docs/.vitepress/config.mts

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,32 @@ export default defineConfig({
127127
link: "/Info/",
128128
},
129129
{
130-
text: "Divers",
130+
text: "Débuter avec STM32",
131131
collapsed: false,
132132
items: [
133+
{ text: "Installations", link: "/Info/STM32/Installation" },
134+
{ text: "Création de l'IOC", link: "/Info/STM32/CreationIOC" },
135+
{ text: "Configuration de IDE", link: "/Info/STM32/ConfigIDE" },
136+
],
137+
},
138+
{
139+
text: "Signaux PWM",
140+
collapsed: false,
141+
items: [
142+
{ text: "STM32", link: "/Info/PWM/STM32" },
133143
{
134-
text: "Cartes utilisées",
135-
link: "/Info/Cartes",
136-
},
137-
{
138-
text: "Raspberry",
139-
link: "/Info/RaspiLinux",
140-
},
141-
{
142-
text: "Connexion SSH",
143-
link: "/Info/ConnexionSSH",
144+
text: "PCA9685",
145+
collapsed: true,
146+
items: [
147+
{
148+
text: "Utiliser la librairie",
149+
link: "/Info/PWM/PCA9685/Librairie",
150+
},
151+
{
152+
text: "Implémentation",
153+
link: "/Info/PWM/PCA9685/Implementation",
154+
},
155+
],
144156
},
145157
],
146158
},
@@ -154,15 +166,7 @@ export default defineConfig({
154166
{ text: "Créer une librairie", link: "/Info/CMake/Librairie" },
155167
],
156168
},
157-
{
158-
text: "Débuter avec STM32",
159-
collapsed: false,
160-
items: [
161-
{ text: "Installations", link: "/Info/STM32/Installation" },
162-
{ text: "Création de l'IOC", link: "/Info/STM32/CreationIOC" },
163-
{ text: "Configuration de IDE", link: "/Info/STM32/ConfigIDE" },
164-
],
165-
},
169+
166170
{
167171
text: "Bus CAN",
168172
collapsed: false,
@@ -285,23 +289,20 @@ export default defineConfig({
285289
],
286290
},
287291
{
288-
text: "Signaux PWM",
292+
text: "Divers",
289293
collapsed: false,
290294
items: [
291-
{ text: "STM32", link: "/Info/PWM/STM32" },
292295
{
293-
text: "PCA9685",
294-
collapsed: true,
295-
items: [
296-
{
297-
text: "Utiliser la librairie",
298-
link: "/Info/PWM/PCA9685/Librairie",
299-
},
300-
{
301-
text: "Implémentation",
302-
link: "/Info/PWM/PCA9685/Implementation",
303-
},
304-
],
296+
text: "Cartes utilisées",
297+
link: "/Info/Cartes",
298+
},
299+
{
300+
text: "Raspberry",
301+
link: "/Info/RaspiLinux",
302+
},
303+
{
304+
text: "Connexion SSH",
305+
link: "/Info/ConnexionSSH",
305306
},
306307
],
307308
},

docs/Contribuer/Credits.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ const members = [
8787
{ icon: 'codeberg', link: 'https://codeberg.org/NoAccount1' }
8888
]
8989
},
90+
{
91+
avatar: 'https://www.github.com/FreedGB.png',
92+
name: 'FreedGB',
93+
title: 'Contributeur',
94+
links: [
95+
{ icon: 'github', link: 'https://www.github.com/FreedGB' },
96+
]
97+
}
9098
]
9199
</script>
92100

docs/Info/PWM/STM32.md

Lines changed: 56 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3,56 +3,79 @@ title: STM32
33
description: Comment générer un signal PWM sur un microcontrôleur STM32
44
---
55

6-
# STM32
6+
# Génération de signaux PWM avec STM32
7+
8+
## Définition
79

810
Le PWM (Pulse Width Modulation) consiste à moduler la largeur d'une impulsion pour contrôler la puissance moyenne délivrée à un composant.
911
C'est un signal carré dont le rapport cyclique (temps haut / temps total) est variable :
1012
<img src="/images/Info/PWM/signals.webp" alt="PWM">
1113

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.
1319

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+
<iframe width="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>
1621

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).
1823

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 :
21-
<img src="/images/Info/PWM/clock_config.webp" alt="Prescaler clock">
24+
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.
2225

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).
2426
> [!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.
2528
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 :
28-
<img src="/images/Info/PWM/timer_config.webp" alt="TIM1">
29+
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.
2930

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`.
3231

33-
## Génération du signal
32+
## Signal PWM simple
3433

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.
3635

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+
<iframe width="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>
4337

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.
4539

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`.
53+
54+
<img src="/images/Info/PWM/pwm_it_config.webp" alt="DMA config">
55+
56+
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`.
64+
65+
<img src="/images/Info/PWM/pwm_dma_config.webp" alt="DMA config">
66+
67+
Il y a deux modes :
68+
69+
- **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.
5171

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` :
5373

5474
```c
55-
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
56-
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
57-
HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
58-
```
75+
uint16_t pwmData[11];
76+
pwmData[0] = 10; pwmData[1] = 20; pwmData[2] = 30;
77+
pwmData[3] = 40; pwmData[4] = 50; pwmData[5] = 60;
78+
pwmData[6] = 70; pwmData[7] = 80; pwmData[8] = 90;
79+
pwmData[9] = 100;pwmData[10] = 0;
80+
HAL_TIM_PWM_Start_DMA(&htim1, TIM_CHANNEL_1, (uint32_t *)pwmData, 11);
81+
```

docs/Info/STM32/CreationIOC.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Vous tombez maintenant sur l'interface de configuration des broches de la puce d
3232

3333
- Les broches entrées - sorties
3434
- Les horloges (`Clock Configuration`)
35-
- Les timers (génération de PWM par exemple)
35+
- Les timers (génération de [PWM](/Info/PWM/STM32.md) par exemple)
3636
- Les connectivités (UART, SPI, I2C, CAN, USB, ...)
3737
- Les fonctionnalités (interrupts, DMA, ...)
3838
- etc.

docs/Info/STM32/CubeMX.md

Lines changed: 0 additions & 21 deletions
This file was deleted.

docs/Info/STM32/Installation.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Pour cela, rendez-vous sur [le site officiel de STM Electronics](https://www.st.
1717

1818
## Installation de l'IDE
1919

20-
- ### STM32CubeIDE
20+
### STM32CubeIDE
2121

2222
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.
2323

@@ -28,7 +28,7 @@ Sur Linux, il est possible que le fichier d'installation ne soit pas exécutable
2828
> Si vous utilisez `flatpak` sur Linux : `flatpak install flathub com.st.STM32CubeIDE`
2929
> (ne nécessite pas de donner son email, nom et prénom).
3030
31-
- ### STM32CubeIDE for Visual Studio Code
31+
### STM32CubeIDE for Visual Studio Code
3232

3333
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).
3434

69.6 KB
Loading
33 KB
Loading
37.3 KB
Loading

0 commit comments

Comments
 (0)