Aller au contenu

La fonction analogWrite


Introduction

La fonction analogWrite() permet d'écrire une valeur analogique en tant que signal PWM à une broche. Cette fonction prend deux paramètres: le numéro de la broche et la valeur à écrire. La valeur doit être comprise entre 0 et 255. La valeur 0 correspond à une tension de 0V et la valeur 255 correspond à une tension de 5V. La valeur 127 correspond à une tension de 2.5V.

PWM : C'est quoi??

Le PWM est une technique qui permet de simuler une tension analogique en utilisant une tension numérique. Le principe est de faire varier la durée de la mise en tension d'une broche numérique à une fréquence très élevée. La fréquence est si élevée que l'oeil humain ne peut pas la percevoir. La tension numérique est alors perçue comme une tension analogique.

PWM tient pour Pulse Width Modulation. La modulation de largeur d'impulsion est une technique qui permet de faire varier la largeur d'un signal carré. Le signal carré est alors perçu comme une tension analogique.

Voici un aperçu du PWM avec différentes valeurs. Alt text

Voici en détail pour un signal PWM à 25% de la durée de mise en tension pour une broche du microcontrôleur. Alt text

Note : Par défaut sur le Mega, la fréquence du PWM pour les broches D2 à D12 et D44 à D46 est de 490.20 Hz. Pour les broches D4 et D13, la fréquence est de 980.9 Hz.

PWM : À quoi ça sert?

Le PWM peut être utilisé à différentes fins. Il peut être utilisé pour faire varier la luminosité d'une DEL, la vitesse d'un moteur, la position d'un servo, etc.

Voici un exemple de code qui fait graduellement varier la tension d'une DEL sur la broche 9.

  • Code

    Utilisation de analogWrite() pour faire varier la luminosité d'une DEL
    unsigned long lastTime = 0;
    unsigned long interval = 4;
    unsigned long currentTime = 0;
    int brightness = 0;
    int direction = 1;
    
    int ledPin = 9;
    
    void setup() {
        pinMode(ledPin, OUTPUT);
    }
    
    void loop() {
        currentTime = millis();
    
        // Gestion de la variation de la luminosité
        if (currentTime - lastTime >= interval) { // (1)!
            lastTime = currentTime;
            brightness += direction;
    
            analogWrite(ledPin, brightness);
    
            if (brightness >= 255 || brightness <= 0) {
                direction *= -1;
            }
        }
    }
    

    1. Remarquez qu'il n'y a pas de delay() dans ce code. Cela permettrait de faire d'autres choses dans la boucle loop().
  • Résultat Alt text


Exercices


Références