ESP32 入门笔记03:PWM (ESP32 for Arduino IDE)

先导知识


在这里插入图片描述

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 或 GPIO 上。为此,您将使用以下功能:

ledcAttachPin(GPIO, channel)

该函数接受两个参数。第一个是输出信号的GPIO,第二个是产生信号的通道。

5.最后,要使用 PWM 控制 LED 亮度,请使用以下函数

ledcWrite(channel, dutycycle)

此函数接受生成 PWM 信号的通道和占空比作为参数。

实验目的: 使用 Arduino IDE 使用 ESP32 生成 PWM 信号。例如,我们将构建一个简单的电路,使用 ESP32 的 LED PWM 控制器调暗 LED。我们还将向您展示如何在不同的 GPIO 上同时获得相同的 PWM 信号。

电路连接:

ESP32LED
GPIO5+
GND-

代码

打开您的 Arduino IDE 并复制以下代码。

//V.04.15
// PWM通道 0 
#define LEDC_CHANNEL_0     0

// 占空比分辨率 13位   注意:使用1至2^13-1的值来控制亮度
#define LEDC_TIMER_13_BIT  13

// PWM 信号频率 5000 Hz 
#define LEDC_BASE_FREQ     5000

//获取信号的 GPIO
#define LED_PIN            5    //#define 宏定义
//const int LED_PIN = 5;          //const   定义固定变量

int brightness = 0;    // 亮度值变量
int fadeAmount = 5;    // 累计值

// Arduino like analogWrite
// value has to be between 0 and valueMax
void ledcAnalogWrite(uint8_t channel, uint32_t value, uint32_t valueMax = 255) {
  //  8191 = 2 ^ 13 - 1
  uint32_t duty = (8191 / valueMax) * min(value, valueMax);

  // write duty to LEDC
  ledcWrite(channel, duty);
}

void setup() {
  
  Serial.begin(9600);
  // Setup timer and attach timer to a led pin 
  //设置定时器并将定时器连接到led引脚
  ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_13_BIT);
  ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
}

void loop() {
  Serial.println(brightness);
  // set the brightness on LEDC channel 0 
  //在LEDC通道0上设置亮度
  ledcAnalogWrite(LEDC_CHANNEL_0, brightness);

  // change the brightness for next time through the loop
  // 通过循环更改下一次的亮度:
  brightness = brightness + fadeAmount;

  // 通过判断调整亮度值累加?累减?
  if (brightness <= 0 || brightness >= 255) {
    fadeAmount = -fadeAmount;
  }

  delay(30);
}

注意:点击编译上传程序到开发板子中,下载程序的时候按住BOOT按键,直到下载成功。当Arduino IDE提上传成功后,再按一下开发板上的RST按键,此时开发板才会正常运行程序。


//V.05.06
// PWM通道 0 
#define LEDC_CHANNEL_0     0
// 占空比分辨率 8位   2^8 = 256
#define LEDC_TIMER_8_BIT  8
// PWM 信号频率 5000 Hz 
#define LEDC_BASE_FREQ     5000
//获取信号的 GPIO
const int LED_PIN = 25;          //PWM 输出引脚 
int dutyCycle = 0;               // PWM 占空比
int fadeAmount = 5;              // 累加数 

void setup() { 
  Serial.begin(9600);
  ledcSetup(LEDC_CHANNEL_0, LEDC_BASE_FREQ, LEDC_TIMER_8_BIT);
  ledcAttachPin(LED_PIN, LEDC_CHANNEL_0);
  ledcWrite(LEDC_CHANNEL_0, 0);
}

/* PWM占空比 调速
 */
void pwm()
{  
   Serial.println(dutyCycle);
  //在LEDC通道0上设置亮度
  ledcWrite(LEDC_CHANNEL_0, dutyCycle);
  // 更改下一次的PWM
  dutyCycle = dutyCycle + fadeAmount;
  delay(5000);
  if (dutyCycle <= 0 || dutyCycle >= 255) {
    fadeAmount = -fadeAmount;  //升序降序跳转
  }
  
}

void loop() 
{
	pwm();//
}

参考资料

在这里插入图片描述

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naiva

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值