Générer des signaux PWM avec STM32 Cube IDE

De Ares Wiki
Aller à la navigation Aller à la recherche

Dans ce tutoriel, nous allons générer un signal PWM sur une NUCLEO L476RG, afin de faire tourner un servomoteur.

Un signal PWM : Qu'est ce que c'est ?

La Modulation à Largeur d'Implusion (MLI) ou en anglais Pulse Width Modulation (PWM) est une technique de modulation utilisée pour contrôler la puissance délivrée à un dispositif électrique. Cela se fait en variant la largeur des impulsions d'un signal périodique tout en maintenant la fréquence constante. En d'autres termes, la tension moyenne est modulée en ajustant la durée pendant laquelle le signal est à l'état haut par rapport à la durée totale du cycle. Dans le contexte de la manipulation d'un servomoteur, le signal PWM est utilisé pour définir la position du servomoteur. Ainsi en ajustant la largeur de l'impulsion, on peut contrôler la position angulaire du servomoteur.

Configuration

Les branchements pour faire fonctionner un servomoteur sont les suivants : Deux câbles respectivement connectés au +5V et au GND (En général, rouge pour l'alimentation et marron ou noir pour la masse). Le dernier câble doit être connecté sur une des broches de la carte pouvant fournir un signal PWM (C'est indiqué sur la plupart des broches). Branchons le par exemple sur D5.

La suite se passe sur CubeIDE : Créez un nouveau projet et ouvrez CubeMX (fenêtre ioc). Identifiez à quelle broche correspond D5. On peut trouver les analogies entre broches "Dx" et "PAx" en cherchant en ligne le pinout configuration de la NUCLEO L476RG. On y trouve que D5 <-> PB4.

On configure ensuite la broche avec un Timer et son Channel disponible (de la forme "TIMx_CHx"). Le seul disponible sur cette broche est Timer 3 et son Channel 1, que l'on sélectionne.

PWM1.png

Dans l'onglet à gauche "Timers", sélectionnez TIM3 et définir les paramètres suivants :

  • Clock Source : Internal Clock
  • Channel1 = PWM Generation CH1

Paramètres fréquentiels

PWM2.png

Lorsque l'on se rend dans l'onglet "Clock Configuration", on peut voir les différentes fréquences auxquelles fonctionnent nos Timers, en l'occurrence 80 Mhz. Nous sommes bien loin des 50 Hz que nous sommes censés atteindre pour que notre servomoteur tourne sans accros ! Mais comme la vie est bien faite, nous allons pouvoir diviser la fréquence de notre Timer pour atteindre la valeur voulue.

Pour cela, on utilise les registres prescaler et ARR, dont la formule est la suivante :

f_TIM = (1/(ARR+1))*(1/(PSC+1))*f_APB

On sait que f_APB = 80 MHz, donc il suffit de trouver une combinaison de PSC et ARR qui donne f_TIM = 50 Hz. J'obtiens par exemple une combinsaison qui va pour PSC = 159 et ARR = 9999. On retourne alors dans les paramètres de TIM3 pour y intégrer ces valeurs ("Parameter Settings") :

PWM3.png

La dernière chose à configurer est notre rapport cyclique, paramétrable via le registre Pulse. La formule qui lie ce registre est le rapport cyclique est la formule ci-dessous :

Pulse = alpha*(ARR+1)-1

Prenons par exemple un rapport cyclique de 10%, nous aurons Pulse = 999. Rajoutons cette valeur dans les paramètres du Timer 3 :

PWM4.png

Vous pouvez générer votre code. Attention, il ne faut pas oublier d'activer votre signal PWM en ajoutant la ligne suivante dans votre main.c : HAL_TIM_PWM_Start(&htimX, TIM_CHANNEL_X); (en remplaçant les "X" par les valeurs de Timer et de Channel que vous utilisez.

Modification du rapport cyclique

Si vous avez tout suivi comme il faut et que vous téléversez votre code sur la carte, vous remarquez que le servomoteur... ne tourne pas ! C'est parce qu'il est maintenu à la position qu'on lui a définie avec le rapport cyclique, il faudrait donc le faire varier pour espérer le voir tourner. Plutôt que de se faire du mal à aller modifier sa valeur à la main dans l'ioc, nous allons pouvoir directement modifier la valeur du registre en écrivant la ligne suivante :

TIM3->CCR1 = valeur;

Cette ligne permet de modifier Pulse pour "valeur", dans le Channel 1 du Timer 3. Faites quelques tests avec différentes valeurs (pensez à mettre des délais entre les modifications de registre) !

Crédits

Auteur : Ousmane THIONGANE
Contributeurs :
Année : 2023