Aller au contenu
Académie JediSith · Électricité

Tout ou rien, et le PWM

En une phrase : une broche de l'ESP32 ne sait faire que allumé ou éteint ; pour faire « à moitié », elle alterne les deux très vite, c'est le PWM.

Le tout-ou-rien

Avec digitalWrite, une broche n'a que deux états : HIGH (3,3 V, allumé) ou LOW (0 V, éteint). C'est du numérique : pas de demi-mesure. Parfait pour faire clignoter, mais comment faire une LED qui s'allume doucement, ou un moteur qui tourne lentement ?

L'astuce : allumer-éteindre très vite

Le PWM (Pulse Width Modulation, « modulation de largeur d'impulsion ») allume et éteint la broche mille fois par seconde. Beaucoup trop vite pour l'œil, qui ne voit que la moyenne : allumé 10 % du temps, la LED paraît faible ; 90 % du temps, presque à fond.

10 %très faible50 %à moitié90 %presque à fond
Le pourcentage du temps passé « allumé » s'appelle le rapport cyclique. Ici, 4 cycles de chaque, qui durent chacun 1 milliseconde.

Comme au cinéma

Un film, ce sont 24 images fixes par seconde : ton cerveau les fusionne en mouvement fluide. Le PWM joue le même tour : 1 000 flashs par seconde, ton œil n'en voit qu'une lumière continue, plus ou moins forte.

Plus en profondeur

Deux réglages : la fréquence et le rapport cyclique

Réglage Ce que c'est Sur l'ESP32 avec analogWrite
Fréquence combien de cycles allumé-éteint par seconde, en hertz (Hz) 1 000 Hz : un cycle dure 1 ms
Rapport cyclique la part du cycle passée « allumé », en % réglé par la valeur de 0 à 255

La période, c'est la durée d'un cycle : période = 1 ÷ fréquence. À 1 000 Hz : 1 ÷ 1 000 = 0,001 s = 1 ms.

Pourquoi de 0 à 255 ?

Le PWM de l'ESP32 est réglé par défaut sur 8 bits : 8 chiffres binaires (des 0 et des 1) donnent 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2 = 256 valeurs, de 0 à 255. On retrouve ce même 255 dans les couleurs du ruban et de la barre lumineuse : c'est le nombre préféré des électroniciens !

00 %0,00 V6425 %0,83 V12850 %1,66 V19175 %2,47 V255100 %3,30 VLa valeur d'analogWrite, de 0 à 255
En noir : la valeur ; en dessous, le pourcentage du temps allumé et la tension moyenne correspondante.

La tension « moyenne »

Le multimètre et les moteurs, comme l'œil, ne suivent pas 1 000 changements par seconde : ils voient la moyenne.

tension moyenne = (valeur ÷ 255) × 3,3 V

3,3 V0 V0,83 V0,25 ms0,75 ms1 cycle = 1 ms
analogWrite(2, 64) : allumé un quart du temps. Le multimètre, l'œil ou le moteur ne « voient » que la moyenne, la ligne pointillée bleue.

L'œil n'est pas une règle

Curiosité : notre œil est bien plus sensible aux faibles lumières qu'aux fortes. Passer de 0 à 25 se voit énormément, passer de 230 à 255 presque pas. C'est pour ça qu'une « respiration » faite en ligne droite paraît rester longtemps allumée à fond. Les bibliothèques comme FastLED corrigent cet effet avec une courbe appelée correction gamma.

Les moteurs et les servos

  • Moteur : il a de l'inertie (il ne s'arrête pas en 1 ms), donc il lisse lui-même les impulsions et tourne à une vitesse moyenne. Mais une broche ne fournit pas assez de courant : le PWM commande un driver, qui commute la grosse alimentation au même rythme.
  • Servo : il attend un signal différent, une impulsion répétée 50 fois par seconde (toutes les 20 ms). C'est la durée de l'impulsion qui donne l'angle : environ 1 ms pour une extrémité, 1,5 ms pour le milieu, 2 ms pour l'autre extrémité (la plage exacte varie selon les servos). La bibliothèque ESP32Servo calcule tout ça avec write().
Une impulsion toutes les 20 ms : sa durée donne l'angle1 msune extrémité1,5 msle milieu2 msl'autre extrémité(échelle des temps agrandie, valeurs typiques)
Plus l'impulsion est longue, plus le bras du servo tourne. Le servo répète ce « rendez-vous » 50 fois par seconde.

Dans le code : analogWrite

analogWrite(2, 0);     // éteint (0 %)
analogWrite(2, 128);   // à moitié (50 %)
analogWrite(2, 255);   // à fond (100 %)

La valeur va de 0 à 255. Sur l'ESP32, n'importe quelle broche de sortie sait faire du PWM.

Exemples de calculs

Calcul 1 · Combien de temps allumé ?

analogWrite(2, 64) : 64 ÷ 255 ≈ 25 %.

  • Dans chaque cycle de 1 ms, la LED est allumée 0,25 ms et éteinte 0,75 ms.
  • Tension moyenne : 0,25 × 3,3 ≈ 0,83 V.

Calcul 2 · La vitesse du moteur de la mission 5

Le driver est alimenté en 5 V, et la puissance maximale de départ du programme est puissanceMax = 200.

  • 200 ÷ 255 ≈ 78 %.
  • Tension moyenne vue par le moteur : 0,78 × 5 ≈ 3,9 V : il tourne à environ trois quarts de sa vitesse maximale.

Calcul 3 · Quelle valeur pour 2 V de moyenne ?

2 ÷ 3,3 ≈ 0,61, et 0,61 × 255 ≈ 155. Donc analogWrite(broche, 155).

Calcul 4 · Le servo au milieu

50 impulsions par seconde → une toutes les 1 000 ÷ 50 = 20 ms. Une impulsion de 1,5 ms dans une période de 20 ms, c'est un rapport cyclique de 1,5 ÷ 20 = 7,5 % seulement : le servo ne lit pas la moyenne, il chronomètre l'impulsion.

Mise en pratique

La LED qui respire, version simple : sur la LED bleue intégrée, deux boucles for font monter puis descendre la luminosité.

#define LED 2

void setup() {
  pinMode(LED, OUTPUT);
}

void loop() {
  for (int v = 0; v <= 255; v++) {   // la lumière monte…
    analogWrite(LED, v);
    delay(4);
  }
  for (int v = 255; v >= 0; v--) {   // … puis redescend
    analogWrite(LED, v);
    delay(4);
  }
}

Une montée dure 256 × 4 ms ≈ 1 seconde. Change le delay(4) pour respirer plus vite ou plus lentement. (La boucle for est expliquée dans tableaux, boucles et fonctions.)

Mesurer la moyenne : avec la LED de test sur D2 et analogWrite(2, 128) dans setup(), mets le multimètre en V⎓ entre D2 et GND. Il affiche environ 1,65 V : la moitié de 3,3 V. Essaie 64 (≈ 0,8 V) et 192 (≈ 2,5 V).

Les pièges

Le piège Ce qui arrive La bonne habitude
Une valeur au-delà de 255 elle est ramenée à 255 au mieux, ou donne un résultat inattendu rester entre 0 et 255 (constrain aide)
Un moteur directement sur une broche en PWM pas assez de courant passer par un driver
Croire qu'un servo se commande avec analogWrite il tremble ou ne bouge pas utiliser la bibliothèque ESP32Servo

Exercices

1. Quel rapport cyclique donne analogWrite(2, 191) ?

191 ÷ 255 ≈ 75 %.

2. Quelle tension moyenne donne une broche avec un rapport cyclique de 50 % ?

0,5 × 3,3 = 1,65 V.

3. À 1 000 Hz, combien de temps dure un cycle ? Et à 500 Hz ?

1 ÷ 1 000 = 1 ms. À 500 Hz : 1 ÷ 500 = 2 ms.

4. Le moteur de la mission 5 tournerait-il plus vite avec puissanceMax = 255 ? Est-ce risqué ?

Oui, il recevrait 5 V en moyenne et tournerait plus vite. Nos deux moteurs acceptent 5 V (l'EF09087 jusqu'à 6 V, l'EF10154 jusqu'à 5 V) : pas de danger pour eux. Mais ils demandent plus de courant, surtout au démarrage : sur l'USB, l'ESP32 risque de redémarrer.

À retenir

  • Une broche est tout ou rien : 3,3 V ou 0 V.
  • Le PWM alterne très vite : l'œil (ou le moteur) ne voit que la moyenne.
  • analogWrite(broche, 0 à 255) : 0 = éteint, 255 = à fond ; moyenne = valeur ÷ 255 × 3,3 V.
  • Les servos lisent la durée d'une impulsion (1 à 2 ms), 50 fois par seconde.

Où ça sert dans l'atelier

Pour aller plus loin