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的其他输出控制。