Outils pour utilisateurs

Outils du site


start:esp32:pwm

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
start:esp32:pwm [2022/12/20 17:17] – [Configurer les canaux PWM d'ESP32] gerardadminstart:esp32:pwm [2023/01/27 16:08] (Version actuelle) – modification externe 127.0.0.1
Ligne 54: Ligne 54:
  
 ^Source d'horloge pour LEDC ^ Fréquence PWM LEDC^ Résolution PWM^ ^Source d'horloge pour LEDC ^ Fréquence PWM LEDC^ Résolution PWM^
-|80 MHz APB_CLK| 1  KHz|  16 bits| + 80 MHz APB_CLK   1  KHz  |  16 bits  
-|80 MHz APB_CLK| 5  KHz|  14 bits| + 80 MHz APB_CLK   5  KHz  |  14 bits  
-|80 MHz APB_CLK| 10 KHz|  13 bits| + 80 MHz APB_CLK   10 KHz  |  13 bits  
-|8MHz RTC8M_CLK| 1  KHz|  13 bits| + 8MHz RTC8M_CLK   1  KHz  |  13 bits  
-|8MHz RTC8M_CLK| 8  KHz|  10 bits| + 8MHz RTC8M_CLK   8  KHz  |  10 bits  
-|1MHz REF_TICK| 1  KHz|  10 bits|+ 1MHz REF_TICK   |  1  KHz  |  10 bits  |
  
 +
 +====Fading LED utilisant PWM dans ESP32====
 +
 +Avec toutes les informations nécessaires sur PWM dans ESP32, nous pouvons maintenant procéder à la mise en œuvre de notre premier projet de décoloration d'une LED à l'aide de ESP32 PWM. C'est un projet très simple où la luminosité d'une LED connectée à une broche GPIO d'ESP32 augmentera et diminuera progressivement à plusieurs reprises. [ Projets ESP32 pour débutants ]
 +
 +Ce projet consiste davantage à comprendre les fonctions LEDC : ledcSetup, ledcAttachPin et ledcWrite et comment générer du PWM dans ESP32 que la LED qui s'estompe elle-même.
 +Composants requis
 +
 +    *Carte de développement ESP32 DevKit
 +    *3 LED de 5 mm
 +    *Résistance 220Ω
 +    *3 potentiomètres 5KΩ
 +    *Planche à pain
 +    *Fils de connexion
 +    *Câble micro-USB
 +
 +===Schéma===
 +
 +L'image suivante montre la connexion pour la décoloration d'une LED à l'aide du contrôleur ESP32 PWM.
 +
 +{{ :start:esp32:esp32-pwm-led-fading-circuit.jpg?direct&600 |}}
 +
 +===Code===
 +
 +Vous pouvez utiliser n'importe quelle broche GPIO pour émettre le signal PWM. Donc, j'utilise GPIO 16, qui est également la broche RX UART2. Ensuite, nous devons configurer le canal LEDC en utilisant la fonction 'ledcSetup'. Le premier argument est le canal. Toute valeur comprise entre 0 et 15 peut être donnée comme canal.
 +
 +L'argument suivant est la fréquence. Vous pouvez fournir n'importe quelle fréquence, mais pour plus de commodité, je définirai la fréquence sur 5 KHz. De plus, vous devez définir la résolution du PWM. Cette valeur doit être un nombre compris entre 1 et 16. Je suis allé avec une résolution de 10 bits.
 +
 +Pour le reste des paramètres, reportez-vous au code suivant, où j'ai commenté les lignes importantes.
 +
 +<code c pwmesp32led.ino>
 +const int LEDPin = 16;  /* GPIO16 */
 +
 +int dutyCycle;
 +/* Setting PWM Properties */
 +const int PWMFreq = 5000; /* 5 KHz */
 +const int PWMChannel = 0;
 +const int PWMResolution = 10;
 +const int MAX_DUTY_CYCLE = (int)(pow(2, PWMResolution) - 1);
 +void setup()
 +{  
 +  ledcSetup(PWMChannel, PWMFreq, PWMResolution);
 +  /* Attach the LED PWM Channel to the GPIO Pin */
 +  ledcAttachPin(LEDPin, PWMChannel);
 +}
 +void loop()
 +{
 +  /* Increasing the LED brightness with PWM */
 +  for(dutyCycle = 0; dutyCycle <= MAX_DUTY_CYCLE; dutyCycle++)
 +  {
 +    ledcWrite(PWMChannel, dutyCycle);
 +    delay(3);
 +    //delayMicroseconds(100);
 +  }
 +      /* Decreasing the LED brightness with PWM */
 +  for(dutyCycle = MAX_DUTY_CYCLE; dutyCycle >= 0; dutyCycle--)
 +  {
 +    ledcWrite(PWMChannel, dutyCycle);
 +    delay(3);
 +    //delayMicroseconds(100);
 +  }
 +}
 +</code>
 +
 +{{ :start:esp32:esp32-pwm-led-fading-1.jpg?direct&600 |}}
 +
 +<note>
 +Vous pouvez connecter plusieurs broches GPIO au même canal LEDC PWM. Si vous le faites, toutes les broches GPIO partageront les propriétés du canal (résolution et fréquence).
 +</note>
 +
 +=====ESP32 PWM avec ADC=====
 +
 +L'une des caractéristiques importantes de PWM dans ESP32 est que les 16 canaux peuvent être configurés indépendamment, c'est-à-dire que chaque canal peut avoir sa propre résolution et sa propre fréquence. Pour le démontrer, utilisons le périphérique ADC et ajustons indépendamment le rapport cyclique de trois canaux PWM LEDC différents en tournant un potentiomètre.
 +
 +Trois potentiomètres 5KΩ sont connectés à trois broches d'entrée ADC d'ESP32. Sur la base de la sortie de l'ADC, nous définirons le rapport cyclique de trois canaux PWM, qui sont configurés avec des paramètres différents.
 +
 +Pour faciliter la compréhension, j'ai connecté trois LED : ROUGE, VERT et BLEU à trois broches GPIO. Ces trois broches GPIO sont attachées à trois canaux LEDC PWM différents et chaque canal est initialisé avec sa propre fréquence et sa propre résolution.
 +
 +^LED^GPIO Pin^ PWM Channel^ PWM Frequency^ PWM Resolution^
 +|  RED  |  GPIO 16  |  0  |  5000 (5 KHz)  |  12  |
 +|  GREEN  |  GPIO 17  |  2  |  8000 (8 KHz)  |  13  |
 +|  BLUE  |  GPIO 4  |  4  |  10000 (10 KHz)  |  14  |
 +
 +Un autre point important à retenir est que la résolution de l'ADC de l'ESP32 est de 12 bits. Nous devons donc mapper cela avec soin sur la résolution PWM, pour obtenir la gamme complète de contrôle.
 +
 +===Schéma===
 +
 +L'image suivante montre les connexions pour régler le rapport cyclique des canaux PWM à l'aide de l'ADC (potentiomètres).
 +
 +{{ :start:esp32:esp32-pwm-adc-circuit.jpg?direct&600 |}}
 +
 +<code c pwmledPotentiometre.ino>
 +const int redLEDPin = 16;  /* GPIO16 */
 +const int greenLEDPin = 17;  /* GPIO17 */
 +const int blueLEDPin = 4;  /* GPIO4 */
 +uint16_t redDutyCycle;
 +uint16_t greenDutyCycle;
 +uint16_t blueDutyCycle;
 +
 +const int redPWMFreq = 5000; /* 5 KHz */
 +const int redPWMChannel = 0;
 +const int redPWMResolution = 12;
 +const int RED_MAX_DUTY_CYCLE = (int)(pow(2, redPWMResolution) - 1);
 +
 +const int greenPWMFreq = 8000; /* 8 KHz */
 +const int greenPWMChannel = 2;
 +const int greenPWMResolution = 13;
 +const int GREEN_MAX_DUTY_CYCLE = (int)(pow(2, greenPWMResolution) - 1);
 +
 +const int bluePWMFreq = 10000; /* 10 KHz */
 +const int bluePWMChannel = 4;
 +const int bluePWMResolution = 14;
 +const int BLUE_MAX_DUTY_CYCLE = (int)(pow(2, bluePWMResolution) - 1);
 +
 +const int ADC_RESOLUTION = 4095; /* 12-bit */
 +
 +
 +void setup()
 +{  
 +  /* Initialize Serial Port */
 +  Serial.begin(115200);
 +  /* Initialize PWM Channels with Frequency and Resolution */
 +  ledcSetup(redPWMChannel, redPWMFreq, redPWMResolution);
 +  ledcSetup(greenPWMChannel, greenPWMFreq, greenPWMResolution);
 +  ledcSetup(bluePWMChannel, bluePWMFreq, bluePWMResolution);
 +  /* Attach the LED PWM Channel to the GPIO Pin */
 +  ledcAttachPin(redLEDPin, redPWMChannel);
 +  ledcAttachPin(greenLEDPin, greenPWMChannel);
 +  ledcAttachPin(blueLEDPin, bluePWMChannel);
 +  
 +}
 +void loop()
 +{
 +  /* Read Analog Input from three ADC Inputs */
 +  redDutyCycle = analogRead(A0);
 +  greenDutyCycle = analogRead(A3);
 +  blueDutyCycle = analogRead(A4); 
 +  /* Map ADC Output to maximum possible dutycycle */
 +  //redDutyCycle = map(redDutyCycle, 0, ADC_RESOLUTION, 0, RED_MAX_DUTY_CYCLE);
 +  greenDutyCycle = map(greenDutyCycle, 0, ADC_RESOLUTION, 0, GREEN_MAX_DUTY_CYCLE);
 +  blueDutyCycle = map(blueDutyCycle, 0, ADC_RESOLUTION, 0, BLUE_MAX_DUTY_CYCLE);
 +  /* Set PWM Output of Channel with desired dutycycle */ 
 +  ledcWrite(redPWMChannel, redDutyCycle);
 +  ledcWrite(greenPWMChannel, greenDutyCycle);
 +  ledcWrite(bluePWMChannel, blueDutyCycle);
 +
 +  Serial.println("RED -- GREEN -- BLUE");
 +  Serial.print(redDutyCycle);
 +  Serial.print(" -- ");
 +  Serial.print(greenDutyCycle);
 +  Serial.print(" -- ");
 +  Serial.print(blueDutyCycle);
 +  Serial.print("\n");
 +
 +  delay(1000);
 +}
 +</code>
 +
 +{{ :start:esp32:esp32-pwm-adc.jpg?direct&600 |}}
  
/home/chanteri/www/fablab37110/data/attic/start/esp32/pwm.1671553067.txt.gz · Dernière modification : 2023/01/27 16:08 (modification externe)