Eaton Sicherheitsrelais


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


PWM made by ESP32

Mit PWM-Signalen (Pulsweitenmodulation), die ein digitales Äquivalent eines analogen Signals darstellen, haben wir bereits experimentiert. Kleine Einführung in das Thema findest du hier:

PWM

Um bei Arduino ein solches Signal zu generieren, kommt die Funktion analogWrite() zum Einsatz. Sie erwartet zwei Parameter: Nummer des PWM-Pins und den analogen Wert, der zwischen 0 und 255 liegt. Die Funktion kann dann ohne weitere Maßnahmen benutzt werden.
Bei dem ESP32 verhält sich die Situation ein wenig anders. Das ESP32-Modul verfügt über eine spezielle Einheit, den LED-PWM-Controller (LEDC), mit der die Intensität von Leuchtdioden gesteuert werden kann. Die Einheit kann auch für andere Aufgaben eingesetzt werde, wie z.B. Motorsteuerung oder Ähnliches. Bevor jedoch ein PWM-Signal an einem GPIO ausgegeben werden kann, müssen einige Vorkehrungen getroffen werden:

  • Der LEDC des ESP32 verfügt über 16 unabhängige Kanäle, die frei konfiguriert werden können. Ein Kanal wird mit ledcSetup() aktiviert. Die Konfiguration erfolgt mithilfe drei Parameter: Kanal, Frequenz und Auflösung. Beispiel:
    ledcSetup (0, 5000, 8)
    0 – Kanalnummer, 16 Kanäle (0 bis 15) stehen zur Verfügung.
    5000 – Frequenz. 5 kHz ist eine gut geeignete Frequenz, um LEDs zu dimmen.
    8 – Auflösung. 8-Bit Tastverhältnisauflösung bedeutet, dass die LED-Helligkeit im Bereich 0-255 einstellbar ist. Es kann eine Auflösung zwischen 1 und 16 gewählt werden.
  • Im zweiten Schritt muss der gewünschte Ausgang (GPIO) festgelegt werden und dem konfiguriertem Kanal zugeordnet werden. Beispiel:
    ledcAttachPin (4, 0);
    Hier wurde GPIO 4 dem PWM-Kanal 0 zugeordnet.
    Alle Ausgänge können als PWM-Ausgänge konfiguriert werden.
  • Im Programm wird ein PWM-Ausgang mit der Funktion ledcWrite() gesteuert. Die Funktion erwartet zwei Parameter: Nummer des Kanals und Tastverhältnis. Das Tastverhältnis drückt die Beziehung zwischen Pulsdauer und Periodendauer aus. Je höher Tastverhältnis vorgegeben wird, umso heller leuchtet die LED.

Ob das Alles wie versprochen funktioniert, testen wir an zwei Beispielen. In dem ersten Beispiel wird jede LED, die am Versuch teilnimmt, über einen separaten PWM-Kanal gesteuert. In dem zweiten werden mehrere LEDs über nur einen PWM-Kanal angesprochen.

Mehrere PWM-Kanäle

In dem Beispiel kommt eine RGB-LED zum Einsatz. Sie besteht intern aus drei unabhängigen farbigen LEDs. Für jede dieser LEDs wird ein PWM-Kanal aktiviert, über den die jeweilige Leuchtdiode gesteuert wird.

Schaltplan A

Schaltplan A (mehrere Ausgänge, mehrere PWM-Kanäle)

Testschaltung A

Testschaltung A

// *************************************************************************************
// PWM made by ESP32 (A)
// ESP32-Dev-KitC V4
// Arduino IDE 1.8.19
// *************************************************************************************
    
  int Taster_Rot = 12;                       // Taster Farbe Rot ein/aus
  int Taster_Gruen = 13;                     // Taster Farbe Grün ein/aus
  int Taster_Blau = 14;                      // Taster Farbe Blau ein/aus
  int Kanal = 3;

  // ***********************************************************************************
  void setup() {

      ledcSetup (0, 5000, 8);                 // Kanal 0, Frequenz 5kHz, Auflösung 8 Bit
      ledcSetup (1, 5000, 8);                 // Kanal 1, Frequenz 5kHz, Auflösung 8 Bit
      ledcSetup (2, 5000, 8);                 // Kanal 2, Frequenz 5kHz, Auflösung 8 Bit
      ledcAttachPin (21, 0);                  // GPIO 21, LED Rot
      ledcAttachPin (22, 1);                  // GPIO 22, LED Grün
      ledcAttachPin (23, 2);                  // GPIO 23, LED Blau
      pinMode (Taster_Rot, INPUT_PULLUP);
      pinMode (Taster_Gruen, INPUT_PULLUP);
      pinMode (Taster_Blau, INPUT_PULLUP);
  }

  // ***********************************************************************************
  void loop() {

      for (int i=0; i < 256; i++ ) {          // For-Schleife heller
          ledcWrite (Kanal, i);               // PWM Signal ausgeben
          delay (15);                         // Wartezeit
          PWM_Kanal ();                       // Kanalwahl aufrufen (Unterprogramm)
      } 
      for (int i=255; i > -1; i-- ) {         // For-Schleife dunkler
          ledcWrite (Kanal, i);               // PWM Signal ausgeben
          delay (15);                         // Wartezeit
          PWM_Kanal ();                       // Kanalwahl aufrufen (Unterprogramm)
      }      
      delay (1000);
  }
  // ***********************************************************************************

  void PWM_Kanal()  {                         // Kanal Bestimmung mit Taster
      if (digitalRead (12) == LOW) {          // Taster_Rot betätigt ?
          ledcWrite (Kanal, 0);               // Bisherige Farbe AUS
          Kanal = 0; }                        // Kanal 0, Rot
      if (digitalRead (13) == LOW) {          // Taster_Gruen betätigt ?
          ledcWrite (Kanal, 0);               // Bisherige Farbe AUS
          Kanal = 1; }                        // Kanal 1, Grün
      if (digitalRead (14) == LOW) {          // Taster_Blau betätigt ?
          ledcWrite (Kanal, 0);               // Bisherige Farbe AUS
          Kanal = 2; }                        // Kanal 2, Blau
  }    
  // ***********************************************************************************
  

In dem Beispiel wird jeder Kanal mit einem Taster vorgewählt. So leuchtet die RGB-Leuchtdiode je nach der Auswahl, rot, grün oder blau. Mit zwei FOR-Schleifen wird das Tastverhältnis nacheinander rauf- und runtergefahren. Die LEDs leuchten dementsprechend mal heller, mal dunkler. Mit
ledcSetup (0, 5000, 8);
ledcSetup (1, 5000, 8);
ledcSetup (2, 5000, 8);
werden Kanäle 0,1 und 2 aktiviert. Jedem Kanal wird mit ledcAttachPin() ein Ausgang zugeordnet:
ledcAttachPin (21, 0);
ledcAttachPin (22, 1);
ledcAttachPin (23, 2);
Somit stehen drei GPIOs, die als PWM-Ausgänge definiert sind, zur Verfügung. An jedem Ausgang kann ein PWM-Signal generiert werden.

1 PWM-Kanal

Schaltplan B

Schaltplan B (mehrere Ausgänge, Ein PWM-Kanal)

Testschaltung B

Testschaltung B

// *************************************************************************************
// PWM made by ESP32 (B)
// ESP32-Dev-KitC V4
// Arduino IDE 1.8.19
// *************************************************************************************

 *************************************************************************************
  
  int Kanal = 0;
  int Frequenz = 5000;
  int Aufloesung = 8;

  // ***********************************************************************************
  void setup() {

      ledcSetup (Kanal, Frequenz, Aufloesung);    // Kanal 0, Frequenz 5kHz, Auflösung 8 Bit
      ledcAttachPin (19, Kanal);                  // GPIO 21, LED 1
      ledcAttachPin (21, Kanal);                  // GPIO 21, LED 2
      ledcAttachPin (22, Kanal);                  // GPIO 22, LED 3
      ledcAttachPin (23, Kanal);                  // GPIO 23, LED 4
  }

  // ***********************************************************************************
  void loop() {

      for (int i=0; i < 256; i++ ) {       // Dimmen heller
          ledcWrite (Kanal, i);
          delay (15);
      } 
      for (int i=255; i > -1; i-- ) {      // Dimmen dunkler
          ledcWrite (Kanal, i);
          delay (15);
      }      
      delay (1000);
  }
  // ***********************************************************************************    
  

Es ist möglich, mit nur einem Kanal gleichzeitig mehrere Ausgänge anzusteuern. Auf diesem Weg können mehrere Ausgänge synchronisiert werden. In dem Beispiel werden vier Leuchtdioden mit einem PWM-Kanal synchron gedimmt.


Kurzvideo

Kurzvideo


Weitere Themen:



Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz