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毫米LED3個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。

(此原理圖使用帶有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,它可以增加和減少亮度。

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

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

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

原理圖

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

(此原理圖使用帶有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端口。現在,看看您的電路:

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

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