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.
Merci pour le tuto. Comment faire pour changer la fréquence du signal PWM ? Merci encore.
Bonjour, il est possible de changer la fréquence du signal PWM en jouant sur les registres du micro-contrôleur (timer interne et prescaler).
C’est un sujet assez complexe, mais si cela vous intéresse je pourrais y consacrer un nouveau tuto.
Voir ce site si besoin en attendant : https://arduino.blaisepascal.fr/modifier-la-frequence-pwm/
Merci pour les explications.
[…] : dans mon tutoriel C’est quoi… un signal PWM ? nous réalisons une pseudo sortie analogique pouvant prendre 256 valeurs. Mais il est important de […]