C’est quoi… un signal PWM ?

PWM 75

Le PWM est un acronyme anglais qui signifie Pulse Width Modulation, ou Modulation de Largeur d’Impulsion (MLI) en français.

Le principe du PWM est de réduire la puissance moyenne délivrée d’une sortie digitale (0 ou 1) en modulant les impulsions du signal. L’objectif est d’avoir une pseudo sortie analogique pouvant prendre 256 valeurs (0 à 255). Le PWM est utilisé par exemple pour contrôler la luminosité d’une LED, changer la couleur d’une LED RGB ou encore piloter la vitesse d’un moteur.

Le signal est modulé avec une fréquence fixe (490 Hz sur la broche digitale 9 de l’Arduino Uno par exemple) . Le PWM est caractérisé par son rapport cyclique, qui correspond au pourcentage du temps pendant lequel le signal est à 1 par rapport au temps pendant lequel le signal est à 0.

Dans les illustrations ci-dessous, on voit 3 exemples de rapports cycliques :

  • Rapport cycle 25% : le signal est à 5 V pendant 1/4 du cycle
  • Rapport cycle 50% : le signal est à 5 V pendant la moitié du cycle
  • Rapport cycle 75% : le signal est à 5 V pendant les 3/4 du cycle

Un rapport cyclique de 100% correspond à un signal qui reste à 5 V, alors qu’un rapport cycle de 0% correspond à un signal qui reste à 0 V.

Programmation d’un signal PWM

Voici un exemple de code utilisé pour faire varier la luminosité d’une LED en utilisant le PWM.

// Article de blog Tutoduino : C'est quoi... le PWM ?
// https://tutoduino.fr/
// Copyleft 2020
 
#define ledPin  9   // La LED est reliée à la broche digitale 9 qui supporte le PWM (f=490 Hz)
 
void setup() {
  // La broche 9 est une sortie digitale
  pinMode(ledPin, OUTPUT);  
}
 
void loop() {

  uint8_t fadeValue;  // Valeur du rapport cyclique

  // Rapport cyclique du PWN à 100%
  fadeValue = 255;
  analogWrite(ledPin, fadeValue);
  delay(1000);
 
  // Rapport cyclique du PWN à 75%
  fadeValue = 191;
  analogWrite(ledPin, fadeValue);
  delay(1000);
   
  // Rapport cyclique du PWN à 50%
  fadeValue = 127;
  analogWrite(ledPin, fadeValue);
  delay(1000);
 
  // Rapport cyclique du PWN à 25%    
  fadeValue = 63;
  analogWrite(ledPin, fadeValue);
  delay(1000);
 
  // Rapport cyclique du PWN à 0%
  fadeValue = 0;
  analogWrite(ledPin, fadeValue);
  delay(1000);
 
  // Fait varier le rapport cyclique de 0 à 100% par pas de 5
  for (fadeValue = 0 ; fadeValue < 255; fadeValue += 5) {
    analogWrite(ledPin, fadeValue);
    // Attendre 50 ms pour l'effet de fondu
    delay(50);
  }
}

Dans la première partie du programme j’ai configuré 5 rapports cycliques différents (100%, 75%, 50%, 25% et 0%). On voit que la luminosité de la LED est forte lorsque le rapport cyclique est de 100% et qu’elle diminue par palier avec le rapport cyclique. Avec le rapport cyclique 0%, la LED est éteinte.

Dans la deuxième partie, j’ai programmé un rapport cyclique qui varie de 0% à 100% avec une attente de 50 ms entre chaque incrément. Cela donne un effet d’allumage de LED en mode fondu.

Voici la vidéo du résultat obtenu avec un oscilloscope relié à la broche 9 de l’Arduino Uno.