四、ESP32PWM功能

释放双眼,带上耳机,听听看~!

今天主要介绍本文的目的是解释如何使用ESP32PWM功能实现LED灯亮度的变化,

一.介绍

ESP32 Arduino环境支持尚未提供常用的analogWrite Arduino函数。因此,我们需要转到本教程中的低级函数。不过,我们在PWM功能方面也有更多的控制和灵活性,这样对我们来说是一个好消息。

在硬件方面,ESP32的LED PWM由16个独立通道组成,具有可配置的占空比和波周期。占空比的精度可以配置到16位分辨率。

二.元器件清单

  • ESP32开发板
  • 一个LED(我这里的是5mm红色)
  • 面包板
  • 导线若干

三.电路图

四、ESP32PWM功能

四.代码的设计

1. 初始化设置

在代码的第一部分中,我们将指定一些全局配置常量。第一个是为控制LED而产生的PWM信号的频率。我们将使用5000HZ的值。但请注意,频率的最大值尚不清楚,并且在 我们将要使用的功能的头文件中声明最大频率取决于所选的分辨率。

我们将以比特为单位指定LED PWM通道和PWM占空比的分辨率。同样从头文件中,我们可以看到我们可以选择0到15之间的通道,以及1到16位之间的分辨率。在这里我们将使用通道0和8位的分辨率。

int freq = 5000;
int ledChannel = 0;
int resolution = 8;

现在,在设置功能中,我们将配置LED PWM功能。首先,我们需要设置我们指定的通道、频率和分辨率。为此,我们调用ledcSetup函数,该函数以相同的顺序接收前面提到的3个参数作为输入。

ledcSetup(ledChannel, freq, resolution);

但是值得注意,通道不是我们控制LED的引脚。因此,我们需要将通道0(我们定义的那个)连接到我们希望生成PWM信号的数字GPIO引脚上。我这里连接的GPIO2引脚。我们调用ledcAttachPin函数,将GPIO引脚的编号和先前定义的PWM通道作为参数传递。

ledcAttachPin(2, ledChannel);

以下是完整的初始化设置,以及一些常量的设置:

#define LED_PWM 2 //把调用的GPIO引脚进行了一个宏定义
int freq = 5000;
 int ledChannel = 0; 
int resolution = 8; 

void { 
    ledcSetup(ledChannel, freq, resolution); 
    ledcAttachPin(LED_PWM, ledChannel); 
}

 

2.主循环中

我们将编写代码来控制Arduino主循环中信号的占空比值。但最重要的功能是允许我们指定占空比值的功能。这是ledcWrite  函数,它接收PWM通道(不是GPIO的编号)作为第一个参数。

由于我们定义了8位分辨率,因此我们可以指定0到255(2 ^ 8 -1)之间的占空比值。因此,我们将在两个循环中迭代这些值,一个是递增的,另一个是递减的。您可以查看以下完整的源代码,其中已包含对ledcWrite函数的调用以及这两个循环。

[scu name=”arduino-ide-post” platform=”esp32:esp32:esp32″]

/*******************************************************
   ESP32PWM呼吸灯
   功能:实现LED呼吸灯
   引脚:D2(GPIO2)
   Designer: Code_Mouse
   Date:2018-9-1
 *******************************************************/
#define LED_PWM 2 //把调用的GPIO引脚进行了一个宏定义
int freq = 5000;
int ledChannel = 0;
int resolution = 8;
void setup() {
  ledcSetup(ledChannel, freq, resolution);
  ledcAttachPin(LED_PWM, ledChannel);
}
void loop() {
  for (int dutyCycle = 0; dutyCycle <= 255; dutyCycle++) {
    ledcWrite(ledChannel, dutyCycle);
    delay(7);
  }
  for (int dutyCycle = 255; dutyCycle >= 0; dutyCycle--) {
    ledcWrite(ledChannel, dutyCycle);
    delay(7);
  }
}

[/scu]

 

五.测试代码

要测试代码,只需使用Arduino IDE上传它。然后,您应该看到LED呼吸灯效果。以下视频就是实现的效果:

给TA打赏
共{{data.count}}人
人已打赏
ESP32ESP32-基础

三、ESP32触摸式按键

2018-9-1 13:32:52

ESP32ESP32-基础

五、ESP32使用PWM控制蜂鸣器

2018-9-2 22:51:45

13 条回复 A文章作者 M管理员
  1. 代码少了个()

    • 谢谢提醒噢

  2. 永火玄冥

    请问怎样控制多个引脚?

    • Luca

      ledcAttachPin(引脚, ledChannel);
      用这条语句再定义不同的引脚,就可以

    • 永火玄冥

      #define LED2_PWM 21 //把调用的GPIO引脚进行了一个宏定义
      #define LED3_PWM 22 //把调用的GPIO引脚进行了一个宏定义
      int freq = 5000;
      int ledChannel1 = 0;
      int ledChannel2 = 0;
      int ledChannel3 = 0;
      int resolution = 8;
      void setup() {
      ledcSetup(ledChannel1, freq, resolution);
      ledcSetup(ledChannel2, freq, resolution);
      ledcSetup(ledChannel3, freq, resolution);
      ledcAttachPin(LED1_PWM, ledChannel1);
      ledcAttachPin(LED2_PWM, ledChannel2);
      ledcAttachPin(LED3_PWM, ledChannel3);
      }
      void loop() {
      ledcWrite(ledChannel1, 80);
      ledcWrite(ledChannel2, 160);
      ledcWrite(ledChannel3, 240);
      delay(1000);
      }
      /*那如何控制每个引脚的电压呢,我这样好像不成功 ✗笑哭了✗ */

  3. Codebear

    Hh

  4. BD1GO

    学习一下

  5. 至夏

    学习学习

  6. 狗

    像大佬学习

  7. mcusun2000

    学习,刚开始学arduino

  8. chm87

    学习一下

  9. Mika

    学习学习

  10. SL2023

    YYSY,这教程写得很差劲。“通道”是什么,有多少组?有什么差异?都没有说明!代码也不规范。建议学习基础的,换一个教程。

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索
'); })();