Dans cet article, vous allez savoir comment créer un signal PWM sur STM32 et comment configurer les différentes options, à la fin de l’article, vous trouverez les différentes fonctions que vous allez utiliser dans votre code.
Pour le STM32 il y a deux modes pour la création d’un signal PWM, dans cet article, on va utiliser le mode 1 ici on va traiter un réglage rapide, sans trop de détail, on va expliquer juste le nécessaire pour que vous puissiez bien configurer et utiliser la PWM.(pour savoir la différence entre les deux modes consultez cet article Comprendre facilement la modulation de largeur d’impulsion pwm sur stm32)
Outils nécessaires:
- STM32CubeIDE : l’IDE où vous pouvez coder vos projet STM32 et configurez vos microcontrôleurs, avec son outil CubeMX qui nous facilite la tache et il nous génère le code nécessaire.
- Une carte STMicroelectronics contenant un microcontrôleur STM32.
1) Créer un nouveau projet STM32 sur STM32CubeIDE
Pour les gens qui ne savent pas comment créer un nouveau projet sur STM32CubeIDE et choisir la carte STM convenable, consulter ce tuto créer rapidement un nouveau projet stm32 sur stm32cubeide.
2) Sélectionnez le Timmer:
Ouvrez le fichier de terminaison .ioc pour accéder au CubeMX.
Sélectionnez un timmer sur Timmers, pour notre cas TIM1.
3) Choix du mode et Channel:
Choisissez le channel 1 et la source d’horloge l’horloge interne du Microcontrôleur (internal clock).
4) Configuration du Timer, pour avoir la fréquence voulu:
Cliquez sur l’onglet Clock Configuration pour configurer la fréquence d’horloge.
Par exemple si vous voulez générer un signal PWM de fréquence 10 KHz (de période 0.1ms), on a choisit pour notre système une horloge de 80 MHz.
La formule de clacul de la fréquence du signal PWM c’est:
- Fpwm : fréquence du signal PWM pour se réinitialiser
- Fclk : fréquence d’horloge
- period : paramètre de compteur à regler sur counter settings (valeur maximal du compteur du timer).
- prescaler : paramètre de compteur à régler sur counter settings (divise la fréquence d’horloge pour avoir la fréquence du timer voulue).
On choisit notre période de compteur (Counter Period) et le Prescaler:
On a choisi les valeurs ci-dessus, si on applique la formule vu précédemment, on aura bien une fréquence du signal PWM de 10 KHz, pour une fréquence d’horloge Fclk=80 MHz.
Simple explication à propos du réglage de la période du compteur et Prescaler : D’abord, le Timer, c’est un compteur à fonctionnement libre, il dispose d’une fréquence de comptage qui est une fraction de l’horloge source (Comme pour notre exemple : l’horloge source est réglé sur 80 MHz.).
Alors le Timer compte jusqu’à atteindre la période que vous avez régler puis il se réinitialise et commence le comptage dès 0.
Prenons un exemple pour mieux comprendre : on a un Timer disposant d’une horloge source de fréquence 1 Hz. Alors notre Timer va s’incrémenter dans chaque seconde, si on règle sa période à 100, il va se réinitialiser toutes les 100 secondes.
Pour le mode PWM mode1, La valeur du comptage de Timer est comparée à l’aide d’un comparateur avec la valeur de Pulse réglé .( si vous voulez savoir plus d’info sur les deux mode PWM en STM32 consultez cet article Comprendre facilement la modulation de largeur d’impulsion pwm sur stm32)
Si la valeur de comptage (Period) est inférieur à Pulse on a un Channel active ( un 1 en sortie), sinon on a un Channel inactive (un 0 en sortie). Quand la valeur comptage atteint la valeur max qu’on a réglé sur Counter Period, le comptage commence dés 0. Comme ça on a un signal PWM qui se génère.
5) Génération du code et fonction utile:
Appuyez sur ctrl+s afin de sauvegarder les modif et générer le code.
Les fonctions utiles pour vous à utiliser dans votre main:
- Fonction pour démarrer la génération du signal PWM: HAL_TIM_PWM_Start( &htim1,TIM_CHANNEL_1 ), ça concerne le timer1 (htim1) et le channel1 (TIM_CHANNEL_1).
- Fonction pour régler le rapport cyclique : __HAL_TIM_SetCompare(&htim1, TIM_CHANNEL_1,30), le troisième argument c’est la valeur de Pulse que vous voulez régler.
Par exemple pour notre Tuto c’est simple de déduire le rapport cyclique puisqu’on a choisit une période de100 donc pour un Pulse réglé de 30, on aura un rapport cyclique de 30%.
Rapport cyclique(%)=100*Pulse/Period .
Pour les autres fonctions d’initialisation, elles sont générées automatiquement par le CubeMX.
N’hésitez pas à partager ce Tuto et à nous faire part de vos remarques en commentaire.
Vous pouvez acheter la carte STMicroelectronics STM32F411RE sur Amazon avec ce lien et obtenez une offre de -10%.