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:23] – [Code] gerardadminstart:esp32:pwm [2023/01/27 16:08] (Version actuelle) – modification externe 127.0.0.1
Ligne 130: Ligne 130:
 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). 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> </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.1671553433.txt.gz · Dernière modification : 2023/01/27 16:08 (modification externe)