ESP32 PWM應用以及示例程序說明

具有Arduino IDE的ESP32 PWM

在本教程中,我們將向您展示如何使用Arduino IDE通過ESP32生成PWM信號。作為示例,我們將構建一個簡單的電路,使用ESP32的LED PWM控制器使LED變暗。我們還將向您展示如何在不同的GPIO上同時獲得相同的PWM信號。

在繼續本教程之前,您應該在Arduino IDE中安裝ESP32插件。

所需部件

要使用本教程,您需要以下部分:

ESP32 DOIT DEVKIT V1 開發板

  • 3個5毫米LED
  • 3個330歐姆電阻
  • 麵包板
  • 跳線
  • ESP32 LED PWM控制器

    ESP32的LED PWM控制器具有16個獨立通道,可配置為生成具有不同屬性的PWM信號。

    這是您必須使用Arduino IDE通過PWM使LED變暗的步驟:

    1.首先,您需要選擇一個PWM通道。從0到15有16個頻道。

    2.然後,需要設置PWM信號頻率。對於LED,可以使用5000 Hz的頻率。

    3. 您還需要設置信號的佔空比分辨率:分辨率為1到16位。我們將使用8位分辨率,這意味著您可以使用0到255之間的值來控制LED亮度。

    4. 接下來,您需要指定信號將出現在哪個GPIO上。為此,您將使用以下功能:

    ledcAttachPin(GPIO, channel)

    該函數接受兩個參數。第一個是將輸出信號的GPIO,第二個是將生成信號的通道。

    5. 最後,要使用PWM控制LED亮度,請使用以下功能:

    ledcWrite(channel, dutycycle)

    此函數接受生成PWM信號的通道和佔空比作為參數。

    調光LED

    讓我們看一個簡單的示例,瞭解如何通過Arduino IDE使用ESP32 LED PWM控制器。

    原理圖

    如下圖所示,將LED線連接到ESP32。LED應該連接到GPIO 16。

    ESP32 PWM應用以及示例程序說明

    (此原理圖使用帶有30個GPIO的ESP32 DEVKIT V1模塊版本–如果您使用的是其他型號,請檢查所用電路板的引腳排列。)

    注意:您可以使用所需的任何引腳,只要它可以用作輸出即可。所有可用作輸出的引腳都可用作PWM引腳。

    程序代碼

    打開您的Arduino IDE並複製以下代碼。

    // the number of the LED pin

    const int ledPin = 16; // 16 corresponds to GPIO16

    // setting PWM properties

    const int freq = 5000;

    const int ledChannel = 0;

    const int resolution = 8;

    void setup(){

    // configure LED PWM functionalitites

    ledcSetup(ledChannel, freq, resolution);

    // attach the channel to the GPIO to be controlled

    ledcAttachPin(ledPin, ledChannel);

    }

    void loop(){

    // increase the LED brightness

    for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){

    // changing the LED brightness with PWM

    ledcWrite(ledChannel, dutyCycle);

    delay(15);

    }

    // decrease the LED brightness

    for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){

    // changing the LED brightness with PWM

    ledcWrite(ledChannel, dutyCycle);

    delay(15);

    }

    }

    首先定義LED所連接的引腳。在這種情況下,LED連接到GPIO 16。

    const int ledPin = 16; // 16 corresponds to GPIO16

    然後,設置PWM信號屬性。您定義的頻率為5000 Hz,選擇通道0生成信號,並將分辨率設置為8位。您可以選擇不同於這些的其他屬性來生成不同的PWM信號。

    const int freq = 5000;

    const int ledChannel = 0;

    const int resolution = 8;

    在setup()中,您需要通過使用ledcSetup()函數將LEDPWM配置為先前定義的屬性,該函數接受ledChannel,頻率和分辨率作為參數,如下所示:

    ledcSetup(ledChannel, freq, resolution);

    接下來,您需要選擇將從其獲取信號的GPIO。為此,請使用ledcAttachPin()函數,該函數接受要獲取信號的GPIO以及生成信號的通道作為參數。在此示例中,我們將在ledPin GPIO中獲取信號,該信號對應於GPIO 16。產生信號的通道是ledChannel,它對應於通道0。

    ledcAttachPin(ledPin, ledChannel);

    在循環中,您將在0到255之間改變佔空比,以增加LED亮度。

    for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){

    // changing the LED brightness with PWM

    ledcWrite(ledChannel, dutyCycle);

    delay(15);

    }

    然後,在255和0之間降低亮度。

    for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){

    // changing the LED brightness with PWM

    ledcWrite(ledChannel, dutyCycle);

    delay(15);

    }

    要設置LED的亮度,您只需要使用ledcWrite()函數,該函數接受生成信號的通道和佔空比作為參數。

    ledcWrite(ledChannel, dutyCycle);

    當我們使用8位分辨率時,將使用0到255之間的值來控制佔空比。請注意,在ledcWrite()函數中,我們使用的是生成信號的通道,而不是GPIO。

    測試示例

    將代碼上傳到ESP32。確保選擇了正確的板和COM端口。看你的電路。您應該有一個調光器LED,它可以增加和減少亮度。

    ESP32 PWM應用以及示例程序說明

    在不同的GPIO上獲得相同的信號

    您可以在不同的GPIO中從同一通道獲得相同的信號。為此,您只需要將這些GPIO附加到setup()的同一通道上即可。

    讓我們修改前面的示例,以使用來自同一通道的相同PWM信號使3個LED變暗。

    原理圖

    遵循下一個原理圖,在電路中再增加兩個LED:

    ESP32 PWM應用以及示例程序說明

    (此原理圖使用帶有30個GPIO的ESP32 DEVKIT V1模塊版本–如果您使用的是其他型號,請檢查所用電路板的引腳排列。)

    程序代碼

    將以下代碼複製到您的Arduino IDE。

    // the number of the LED pin

    const int ledPin = 16; // 16 corresponds to GPIO16

    const int ledPin2 = 17; // 17 corresponds to GPIO17

    const int ledPin3 = 5; // 5 corresponds to GPIO5

    // setting PWM properties

    const int freq = 5000;

    const int ledChannel = 0;

    const int resolution = 8;

    void setup(){

    // configure LED PWM functionalitites

    ledcSetup(ledChannel, freq, resolution);

    // attach the channel to the GPIO to be controlled

    ledcAttachPin(ledPin, ledChannel);

    ledcAttachPin(ledPin2, ledChannel);

    ledcAttachPin(ledPin3, ledChannel);

    }

    void loop(){

    // increase the LED brightness

    for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){

    // changing the LED brightness with PWM

    ledcWrite(ledChannel, dutyCycle);

    delay(15);

    }

    // decrease the LED brightness

    for(int dutyCycle = 255; dutyCycle >= 0; dutyCycle--){

    // changing the LED brightness with PWM

    ledcWrite(ledChannel, dutyCycle);

    delay(15);

    }

    }

    該代碼與上一個代碼相同,但有一些修改。我們為兩個新的LED定義了另外兩個變量,分別引用GPIO 17和GPIO 5。

    const int ledPin2 = 17; // 17 corresponds to GPIO17

    const int ledPin3 = 5; // 5 corresponds to GPIO5

    然後,在setup()中,添加了以下幾行以將兩個GPIO分配給通道0。這意味著我們將在兩個GPIO上獲得在通道0上生成的相同信號。

    ledcAttachPin(ledPin2, ledChannel);

    ledcAttachPin(ledPin3, ledChannel);

    測試項目

    將程序上傳到ESP32。確保選擇了正確的板和COM端口。現在,看看您的電路:

    ESP32 PWM應用以及示例程序說明

    所有GPIO都輸出相同的PWM信號。因此,所有三個LED同時增加和減少亮度,從而產生同步效果。

    ESP32 PWM應用以及示例程序說明

    總而言之,在本文中,您學習瞭如何將ESP32的LED PWM控制器與Arduino IDE配合使用來使LED變暗。通過為信號設置正確的屬性,可以將學習到的概念用於PWM的其他輸出控制。


    分享到:


    相關文章: