Le signal PWM - Pulse Width Modulation

pwm


PWM Arduino - Pulse Width Modulation

Cette technique s'appelle la Modulation de Largeur d'Impulsion (MLI) – ou Pulse Width Modulation (PWM)


Le signal PWM est caractérisé par : 

  • sa fréquence (environ 500Hz par défaut pour un Arduino)
  • son amplitude (+5V  sur un port digital de l'Arduino)


pwm-cycle


 Lorsque l'on souhaite varier la vitesse d'un moteur à courant continu ou modifier la luminosité d'une LED ou encore pour changer les couleurs d'une LED RGB, il est nécessaire d'avoir une variation de la tension.

Cette variation de la tension est réalisable avec certaines sorties digitales de l'Arduino afin de créer un pseudo signal analogique en utilisant la PWM.



Explication du signal PWM

regle2trois

 Le signal PWM est un signal carré de 500Hz.

Pour obtenir une modification de la valeur moyenne de la tension, le PWM fait faire varier le rapport cyclique.

C’est à dire faire varier le temps de maintient à l’état HIGH (+5v) et le temps de maintient à l’état LOW (0v).


 Le récepteur (Moteur, led, etc …) ne percevra plus l’état LOW ou l’état HIGH, mais une multitude de tensions intermédiaires qui varient de 0v à +5v avec une résolution de 256 valeurs possibles (0 à 255).

Ce pseudo signal analogique est possible car la fréquence de commutation entre les niveaux HAUT et BAS est élevée : 500 Hz soit 500 fois par seconde.

Le changement d'état étant très rapide, le récepteur y est donc insensible, comme notre œil est insensible au clignotement des tubes fluorescents avec le signal alternatif 50Hz.

Pour déterminer la tension moyenne que l’on souhaite appliquer au récepteur (Moteur,led, etc ...) il faudra modifier le rapport cyclique, c'est-à-dire la durée du maintient au niveau HIGH (ou HAUT) du signal de sortie.

Ainsi, le rapport cyclique pourra varier de 0% (tension 0v) jusqu'à 100% (tension à +5v).

Pour l'Arduino, ce n'est pas une valeur comprise entre 0 et 100 qui sera appliquée, mais une valeur numérique comprise entre 0 et 255 (8 bits).


 En faisant une règle de trois ou un produit en croix, il est possible de déterminer pour chaque valeur (PWM) compris entre 0 et 255 la valeur du rapport cyclique ou la tension moyenne en sortie de l'Arduino Uno.


  (Tension +5v / 255) * La valeur du PWM = Tension de sortie  

pour 10% (+5v / 255) * 33 = +0,65v    (*) environ

pour 50% (+5v / 255) * 127 = +2,49v   (*) environ

pour 90% (+5v / 255) * 230 = +4,5v   (*) environ


(*) Pour la tension de sortie, j'ai précisé "environ " , le calcul donne une valeur présice, mais la réalité peut etre différente. 
Je vous conseille si possible, de mesurer la tension de sortie avec un multimètre afin d'avoir la valeur exacte.



Rapport cyclique / Valeur PWM / Tension de sortie

Rapport cyclique
Valeur PWM
Tension de sortie
0 %
0
0v
10 %
33
+0,6v
50 %
127
+2,5v
90 %
230
+4,5v
100 %
255
+5v

Broche PWM de l'Arduino



Arduino Uno

Les broches Digitales sont en   OUTPUT  

  • D3, D5, D6, D9, D10 et D11

Elles sont repérées par le symbole tilde  ~




pwm-arduino-uno

PWM - digitalWrite - analogWrite

signal-pwm

Les broches PWM, peuvent,être contrôler de deux manières :

Avec digitalWrite ou analogWrite


La commande digitalWrite va permettre d'allumer la broche à +5v ou l'éteindre à 0v

alors que la commande analogWrite permet de faire varier la tension comme pour allumer une led à la moitié de sa puissance ou controler un moteur CC.


Pour le PWM, nous utiliserons les commandes: 

  • digitalWrite(pin,HIGH)  pour mettre à l'état HAUT la pin
  • digitalWrite(pin,LOW)  pour mettre à l'état BAS la pin
ou
  • analogWrite(pin, valeur_PWM)  pour faire varier la tension avec valeur_PWM




Le signal Digital et PWM

 Changement du signal pendant la même période cyclique 


Avec le simulateur de Tinkercad, voici une comparaison entre le signal Digital et le signal PWM


Oscilloscope gauche - Signal PWM


L'oscilloscope de gauche affiche un signal PWM

Led   Verte   en pin 9 (PWM)

Le code allume la led en PWM

  • analogWrite(led_PWM,50);
  • analogWrite(led_PWM,100);
  • analogWrite(led_PWM,150);

Oscilloscope droite - Signal Digital 


L'oscilloscope de droite affiche un signal Digital carré

Led   Rouge   en pin 7

Le code allume et éteint la led

  • digitalWrite(led,HIGH);
  • digitalWrite(led,LOW);



simulateur_PWM

int tempo = 100;
int led = 7;   // pin digital - Led ROUGE  
int led_PWM = 9;     // pin digital PWM - Led VERTE  

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(led_PWM, OUTPUT);
}

void loop()
{
  digitalWrite(led, HIGH);  // Signal digital carré
  delay(tempo);
  digitalWrite(led, LOW);
  delay(tempo);
 
  analogWrite(led_PWM,50);  // Signal PWM
  delay(tempo);
  analogWrite(led_PWM,100);
  delay(tempo);
  analogWrite(led_PWM,150);
  delay(tempo);
}


Personnaliser

Google Analytics

Google Analytics est un service utilisé sur notre site Web qui permet de suivre, de signaler le trafic et de mesurer la manière dont les utilisateurs interagissent avec le contenu de notre site Web afin de l’améliorer et de fournir de meilleurs services.

Facebook

Notre site Web vous permet d’aimer ou de partager son contenu sur le réseau social Facebook. En l'utilisant, vous acceptez les règles de confidentialité de Facebook: https://www.facebook.com/policy/cookies/

Twitter

Les tweets intégrés et les services de partage de Twitter sont utilisés sur notre site Web. En activant et utilisant ceux-ci, vous acceptez la politique de confidentialité de Twitter: https://help.twitter.com/fr/rules-and-policies/twitter-cookies