ESP32 PWM Example

 

Ví dụ về ESP32 PWM này giải thích cách sử dụng Điều chế độ rộng xung (PWM) với ESP32-WROOM32 DevKit.


ledcWrite (pinChannel, dutyCycle);

ESP32 có thể tạo PWM trên tất cả các chân IO. Trong ESP32 analogWrite sẽ không hoạt động, khác với Arduino Uno. ESP32 sử dụng độ phân giải 8, 10, 12, 15-bit cho giá trị PWM thế hệ PWM. Arduino sử dụng độ phân giải 8-bit, tức là phạm vi PWM là 0-254.


Vì vậy, để sử dụng PWM, chúng ta có thể gọi ledcWrite (pinChannel, dutyCycle);


Chúng tôi đang sử dụng đèn LED trên bo mạch, không có GPIO2.


ESP32 PWM Example

ledcWrite (pinChannel, dutyCycle); , Ghi một giá trị tương tự (sóng PWM) vào một chân. Có thể được sử dụng để thắp sáng đèn LED ở các độ sáng khác nhau hoặc điều khiển động cơ ở nhiều tốc độ khác nhau. Sau một lệnh gọi đến ledcWrite (pinChannel, dutyCycle);, pin sẽ tạo ra một sóng vuông ổn định của chu kỳ nhiệm vụ được chỉ định cho đến lần gọi tiếp theo đến ledcWrite (pinChannel, dutyCycle); (hoặc cuộc gọi đến digitalRead() hoặc digitalWrite() trên cùng một chân). Tần số của tín hiệu PWM trên hầu hết các chân là khoảng 1 KHz.


Bạn không cần gọi pinMode() để đặt chân làm đầu ra trước khi gọi ledcWrite (pinChannel, dutyCycle);.


Before we start actual programming lets have a look at What is PWM?

Điều chế độ rộng xung, hay PWM, là một kỹ thuật để thu được kết quả tương tự bằng các phương tiện kỹ thuật số. Điều khiển kỹ thuật số được sử dụng để tạo ra một sóng vuông, một tín hiệu chuyển đổi giữa bật và tắt. Mô hình bật-tắt này có thể mô phỏng điện áp giữa lúc bật đầy (3,3 Vôn) và tắt (0 Vôn) bằng cách thay đổi phần thời gian tín hiệu sử dụng so với thời gian tín hiệu tắt. Khoảng thời gian “đúng giờ” được gọi là độ rộng xung. Để nhận các giá trị tương tự khác nhau, bạn thay đổi hoặc điều chỉnh độ rộng xung đó. Nếu bạn lặp lại kiểu bật-tắt này đủ nhanh với một đèn LED chẳng hạn, kết quả là tín hiệu sẽ như thể một điện áp ổn định trong khoảng từ 0 đến 3,3V điều khiển độ sáng của đèn LED.

Trong hình bên dưới, các đường màu xanh lục biểu thị một khoảng thời gian thông thường. Khoảng thời gian hoặc khoảng thời gian này là nghịch đảo của tần số PWM. Nói cách khác, với tần số PWM của Arduino ở khoảng 500Hz, các vạch màu xanh lục sẽ đo 2 mili giây mỗi vạch. Lời gọi đến ledcWrite (pinChannel, dutyCycle); nằm trên thang điểm từ 0 - 1023, chẳng hạn như ledcWrite (pinChannel, 1023); yêu cầu chu kỳ nhiệm vụ 100% (luôn bật) và analogWrite (512) là chu kỳ nhiệm vụ 50% (trên một nửa thời gian) chẳng hạn.

ESP32 PWM Example

LED Fading Program using ESP8266 PWM Function

 
 /*
  * Copyright (c) 2018, circuits4you.com
  * All rights reserved.
  /* Generates PWM on Internal LED Pin GPIO 2 of ESP32*/

  #define LED 2 //On Board LED

  int brightness = 0;    // how bright the LED is
  int fadeAmount = 5;    // how many points to fade the LED by

  // setting PWM properties
  const int freq = 5000;
  const int ledChannel = 0;
  const int resolution = 10; //Resolution 8, 10, 12, 15

  //=======================================================================
  //                    Power on setup
  //=======================================================================
  void setup() {
    Serial.begin(115200);
    pinMode(LED,OUTPUT);
    
    // configure LED PWM functionalitites
    ledcSetup(ledChannel, freq, resolution);
    
    // attach the channel to the GPIO2 to be controlled
    ledcAttachPin(LED, ledChannel);
  }

  //=======================================================================
  //                    Main Program Loop
  //=======================================================================
  void loop() {
    //PWM Value varries from 0 to 1023  
    Serial.println("10 % PWM");
    ledcWrite(ledChannel, 102);
    delay(2000);

    Serial.println("20 % PWM");
    ledcWrite(ledChannel,205);
    delay(2000);

    Serial.println("40 % PWM");
    ledcWrite(ledChannel,410);
    delay(2000);

    Serial.println("70 % PWM");
    ledcWrite(ledChannel,714);
    delay(2000);

    Serial.println("100 % PWM");
    ledcWrite(ledChannel,1024);
    delay(2000);

    //Continuous Fading
    Serial.println("Fadding Started");
    while(1)
    {
      // set the brightness of pin 2:
      ledcWrite(ledChannel, brightness);
    
      // change the brightness for next time through the loop:
      brightness = brightness + fadeAmount;
    
      // reverse the direction of the fading at the ends of the fade:
      if (brightness <= 0 || brightness >= 1023) {
        fadeAmount = -fadeAmount;
      }
      // wait for 30 milliseconds to see the dimming effect
      delay(10);
    }
  }



Upload program ESP của bạn và mở Serial Monitor.

Seeing Its Result is really Fun With this technique

Khi bạn chạy ví dụ này, hãy lấy DevKit ESP32 của bạn và lắc nó qua lại trong không gian. Những gì bạn đang làm ở đây về cơ bản là ánh xạ thời gian trong không gian. Đối với mắt chúng ta, chuyển động làm mờ mỗi đèn LED nhấp nháy thành một đường thẳng. Khi đèn LED mờ dần và tắt dần, những đường nhỏ đó sẽ phát triển và thu hẹp chiều dài. Bây giờ bạn đang thấy độ rộng xung.

ESP32 PWM Example


No comments:

Post a Comment