Comment générer un signal rectangulaire ?

NIVEAU 1

Objectifs

  • Comprendre le principe de la modulation de largeur d’impulsions
  • Configurer un signal modulé sur une carte Nucléo

Pré-requis

Modulation de largeur d’impulsions

Principe

La modulation en largeur d’impulsions (MLI ou PWMPulsed Witdh Modulation – en anglais) est une méthode permettant de générer un signal rectangulaire de période \(T\) fixe (ou de fréquence \(1/T\) fixe) et dont le rapport cyclique, i.e. le rapport du temps haut sur la période, noté \(RC = \frac{t_h}{T}\), est variable.

Le rapport cyclique (ou RC) décrit la durée pendant laquelle le signal est à l’état haut (actif) en pourcentage de la durée d’un cycle complet. La fréquence détermine la vitesse à laquelle la MLI effectue un cycle (par exemple, 1000 Hz serait 1000 cycles par seconde) et par conséquent à quelle vitesse il passe de l’état haut à l’état bas et vice versa.

Certaines applications, contrôlées en tension (rotation d’un moteur à courant continu…) ou en courant (luminosité d’une LED…), sont “lentes” à réagir. Par application d’un signal de type PWM (ou MLI), ces systèmes n’ont pas le temps de s’arrêter (lors d’un passage par un temps bas) ou de redémarrer (lors d’un passage par un temps haut). Ce que voit alors ces systèmes est la valeur moyenne du signal MLI appliqué sur leur entrée.

La valeur moyenne du signal de sortie \(s(t)\) vaut alors :
\(<s(t)> = \frac{1}{T} \int_0^T s(t) dt = \frac{t_h}{T} \cdot E = RC \cdot E\)

En modifiant le rapport cyclique, on modifie la valeur moyenne du signal vue par le système à piloter par cette méthode.

Sorties modulées

Certaines broches du composant (notée PWMx sur les connecteurs de la carte, où x est un nombre) peuvent être utilisées comme des sorties modulées de type PWM.

Déclaration d’une sortie modulée

L’ensemble des classes et des fonctions permettant de réaliser des opérations sur les entrées/sorties de la carte se trouvent dans la bibliothèque “mbed.h” (ou “mbed-os.h”). Il est donc indispensable d’avoir au préalable inclut cette bibliothèque :

#include "mbed.h"

La première étape est la déclaration au compilateur de cette broche en sortie PWM. Il faut la placer après la déclaration des ressources externes (bibliothèques) et avant toute définition de fonction (voir tutoriel Tester ma première application sur Nucléo – Code d’exemple /* Déclaration des entrées/sorties */).

PwmOut  ma_sortie_pwm(D3);

Dans l’exemple précédent, on configure la broche D3 (du connecteur Arduino) en sortie modulée PWM. Dans ce code, il y a trois notions importantes :

  • PwmOut‘, la classe qui définit le type de la broche, ici une sortie numérique
  • ma_sortie_pwm‘, le nom de la variable qui va être associée au port donné dans les parenthèses
  • D3‘, le nom de la broche que l’on va associer sur le composant

Utilisation d’une sortie modulée

Après avoir déclaré la broche en sortie modulée, il faut régler deux paramètres différents du PWM (ou MLI) :

  • la période
  • le rapport cyclique

Période

Pour régler la période, il existe 3 fonctions différentes :

  • la fonction period(float s), qui permet de saisir une valeur de période en secondes
  • la fonction period_ms(int ms), qui permet de saisir une valeur de période en millisecondes
  • la fonction period_us(int us), qui permet de saisir une valeur de période en microsecondes

Par exemple, pour fixer la période du signal de sortie PWM à 20ms (soit 50Hz), on peut utiliser l’une des trois instructions suivantes :

ma_sortie_pwm.period(0.02);
ma_sortie_pwm.period_ms(20);
ma_sortie_pwm.period_us(20000);

Rapport Cyclique

Pour régler le rapport cyclique, il y a deux méthodes différentes :

  • définir directement le rapport cyclique
  • définir la durée où le signal est actif

Modification du rapport cyclique

Pour définir le rapport cyclique, il existe la fonction write(float rc) (où rc est une valeur comprise entre 0 et 1).

Par exemple, pour définir le rapport cyclique à 30 %, on pourra utiliser l’instruction suivante :

ma_sortie_pwm.write(0.3);

Modification de la durée du temps haut

Pour définir la durée du signal actif, il existe 3 fonctions différentes :

  • la fonction pulsewidth(float s), qui permet de saisir une valeur de temps haut en secondes
  • la fonction pulsewidth_ms(int ms), qui permet de saisir une valeur de temps haut en millisecondes
  • la fonction pulsewidth_us(int us), qui permet de saisir une valeur de temps haut en microsecondes

Par exemple, pour définir un temps haut de 3ms, on pourra utiliser l’une des instructions suivantes :

ma_sortie_pwm.pulsewidth(0.003);
ma_sortie_pwm.pulsewidth_ms(3);
ma_sortie_pwm.pulsewidth_us(3000);

Exemple complet avec la définition du temps haut

#include "mbed.h"

PwmOut ma_sortie_pwm(D3);

int main() {
    ma_sortie_pwm.period_ms(10);
    ma_sortie_pwm.pulsewidth_ms(1);
    while(1);
}

Dans cet exemple, on définit la sortie D3 comme sortie modulée avec un signal de période 10ms et de temps haut de 1ms (soit un rapport cyclique de 10%).

On peut noter sur la figure précédente (échelle des temps en millisecondes, échelle des tensions en V) que la période est bien de 10 ms et que le temps haut (ou temps actif) dure 1 ms.

Exemple complet avec la définition du rapport cyclique

#include "mbed.h"

PwmOut ma_sortie_pwm(D3);

int main() {
    ma_sortie_pwm.period_ms(10);
    ma_sortie_pwm.write(0.1);
    while(1);
}

Dans cet exemple, on définit la sortie D3 comme sortie modulée avec un signal de période 10ms et de rapport cyclique 10% (soit un temps haut de 1ms).

On relève ici le même oscillogramme que dans l’exemple précédent.

Tutoriel lié

MInE Prototyper Prototyper avec Nucleo et MBED

Nucléo – Générer un signal rectangulaire