PWM et contrôle de puissance
Programmation - 3ème
PWM et contrôle de puissance
Objectifs
- Comprendre le principe de la Modulation de Largeur d'Impulsion (PWM).
- Identifier les broches PWM sur une carte Arduino UNO.
- Programmer un contrôle de luminosité LED et de vitesse de moteur à courant continu en utilisant la fonction analogWrite().
Introduction
Vous avez déjà utilisé une télécommande pour faire varier la luminosité d'une lampe LED ou la vitesse d'un ventilateur ? Derrière cette variation en douceur se cache une technique astucieuse : la Modulation de Largeur d'Impulsion (PWM). Aujourd'hui, nous allons découvrir comment, avec un simple signal numérique qui s'allume et s'éteint très vite, on peut contrôler précisément la puissance délivrée à un composant électronique.
Comment commander de manière précise et efficace la puissance (luminosité, vitesse, chaleur) d'un composant électronique à l'aide d'un microcontrôleur qui ne peut délivrer que des tensions 'tout ou rien' (0V ou 5V) ?
Les limites du tout ou rien et l'idée géniale de la PWM
Jusqu'à présent, avec digitalWrite(), nous commandions nos composants en mode 'tout ou rien' : la LED est allumée à fond (HIGH) ou éteinte (LOW). Mais pour faire varier l'intensité lumineuse d'une LED ou la vitesse d'un petit moteur, nous avons besoin d'une tension variable, par exemple 2.5V. Le problème est qu'un microcontrôleur comme l'ATmega328P de l'Arduino UNO ne peut générer directement que 0V (0 numérique) ou 5V (1 numérique). La solution ? Tricher avec le temps ! C'est le principe de la Modulation de Largeur d'Impulsion (Pulse Width Modulation). Au lieu de fournir une tension moyenne de 2.5V en continu, l'Arduino va envoyer très rapidement une succession d'impulsions à 5V, entrecoupées de périodes à 0V. Si le signal est à 5V la moitié du temps et à 0V l'autre moitié, la tension moyenne perçue par le composant sera de 2.5V. C'est comme si vous clignotiez une lampe de poche très vite : à une certaine vitesse, votre œil ne voit plus les clignotements mais une lumière continue dont l'éclat dépend du temps pendant lequel la lampe est allumée à chaque cycle. La fréquence de ce clignotement (généralement 490 Hz ou 980 Hz sur Arduino) est si élevée que la LED ou le moteur réagit à la valeur moyenne, et non à chaque impulsion individuelle.
Points clés
- Un signal numérique est limité à deux états (0V/5V).
- La PWM simule une tension variable en modifiant le rapport temps allumé / temps éteint.
- La fréquence du signal est fixe et élevée pour que le composant réagisse à la moyenne.
Le rapport cyclique : la clé du contrôle
Le paramètre essentiel de la PWM est le **rapport cyclique** (en anglais, *duty cycle*). Il représente le pourcentage de temps pendant lequel le signal est à l'état HIGH (5V) pendant un cycle complet. Un rapport cyclique de 0% signifie que le signal est toujours à LOW (0V) : la LED est éteinte. Un rapport cyclique de 100% signifie que le signal est toujours à HIGH (5V) : la LED est allumée à pleine puissance. Un rapport cyclique de 25% signifie que le signal est à HIGH pendant un quart de chaque cycle, et à LOW pendant les trois quarts restants. Sur Arduino, nous contrôlons ce rapport cyclique avec une valeur numérique comprise entre 0 et 255. Pourquoi 255 ? Parce que la commande PWM utilise un registre de 8 bits, ce qui donne 2^8 = 256 valeurs possibles (de 0 à 255). Ainsi, la fonction analogWrite(pin, valeur) attend une valeur entre 0 (rapport cyclique 0%) et 255 (rapport cyclique 100%). Par exemple, analogWrite(9, 64) enverra un signal PWM sur la broche 9 avec un rapport cyclique d'environ 25% (64/255 ≈ 0.25). Il est crucial de se souvenir que analogWrite() n'envoie pas une véritable tension analogique, mais bien un signal PWM numérique. Attention, toutes les broches d'une Arduino UNO ne peuvent pas générer de PWM ! Seules les broches marquées d'un tilde (~) le peuvent : ce sont les broches 3, 5, 6, 9, 10 et 11.
Points clés
- Le rapport cyclique est le pourcentage de temps 'HIGH' dans un cycle.
- Sur Arduino, il se contrôle avec une valeur de 0 à 255 via analogWrite().
- Seules les broches marquées '~' sont capables de générer un signal PWM.
Applications pratiques avec Arduino
Passons à la pratique avec deux montages classiques. 1) **Variation de luminosité d'une LED** : Branchez une LED (avec sa résistance de 220Ω) sur la broche 9 (une broche PWM). Le programme suivant fait augmenter puis diminuer progressivement la luminosité, créant un effet de 'respiration'. Dans la boucle loop(), une variable 'luminosite' augmente de 0 à 255, puis redescend à 0. À chaque pas, analogWrite(9, luminosite) définit le rapport cyclique, et un petit délai (20ms) ralentit l'effet. 2) **Contrôle de vitesse d'un moteur à courant continu** : Pour cela, nous avons besoin d'un transistor (comme un TIP120) ou d'un module pont en H pour isoler et alimenter le moteur, car il consomme trop de courant pour être branché directement sur l'Arduino. La commande de vitesse se fait de la même manière : la broche de commande du module (par ex. broche 10) reçoit un signal PWM via analogWrite(10, vitesse). Une valeur de 128 fera tourner le moteur à environ la moitié de sa vitesse maximale. Ces applications montrent que la PWM est indispensable pour le contrôle en douceur dans de nombreux projets : éclairage intelligent, robots, ventilateurs, etc.
Points clés
- Montage LED : utiliser analogWrite() sur une broche PWM pour faire varier la luminosité.
- Montage moteur : nécessite un interface (transistor/pont en H) et un signal PWM pour la vitesse.
- La PWM est au cœur des systèmes de contrôle en douceur en électronique programmable.
À retenir
La Modulation de Largeur d'Impulsion (PWM) est une technique qui permet de simuler une tension variable en faisant varier le rapport cyclique d'un signal numérique rapide. Sur Arduino, on utilise la fonction analogWrite() sur les broches spécifiques (~) avec une valeur comprise entre 0 et 255 pour contrôler ce rapport. Cette méthode est essentielle pour commander avec précision la luminosité des LEDs, la vitesse des moteurs, ou la position des servomoteurs.
- La PWM permet de faire du contrôle analogique (en douceur) avec un signal numérique (tout ou rien).
- Le contrôle se fait via le rapport cyclique, paramétré par analogWrite(valeur) avec valeur de 0 à 255.
- Toujours utiliser une broche marquée '~' pour générer un signal PWM sur Arduino UNO.
