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


    分享到:


    相關文章: