ESP32之LEDC(PWM信号的输出)

一、PWM信号简介

  • PWM:脉冲宽度调制,简称脉宽调制
  • 频率(f):一秒钟PWM有多少个周期(单位Hz)
  • 周期(T):一个周期的时间
  • 占空比(duty):在一个脉冲周期内,高电平的时间与整个周期时间的比例
  • 脉宽时间:一个周期内高电平时间
  • 占空比越大,输出的有效电压越高。

二、ESP32中的LEDC(PWM控制器)

ESP32之LEDC(PWM信号的输出)_第1张图片

  • LEDC:指LED PWM控制器,即PWM信号产生器。
  • LED_PWM有16路通道(0~15)
  • 8路高速通道(0~7),由80MHz时钟驱动
  • 8路低速通道(8~15),由8MHz时钟驱动

 三、产生PWM信号的流程

  1. 建立LEDC通道
  2. 将GPIO与LEDC通道绑定
  3. Write(设置指定通道的占空比)、WriteTone(输出指定频率的占空比)、WriteNote
  4. 解除GPIO与LEDC通道的关联

3.1 LEDC频率与分辨率的关系

ESP32之LEDC(PWM信号的输出)_第2张图片

3.2 LEDC频率与最大分辨率表

ESP32之LEDC(PWM信号的输出)_第3张图片

 3.3 使用LEDC输出PWM的示例程序

#include 

int pwmA = 12;
int pwmB = 13;
int pwmC = 14;

void setup()
{
    // 建立LEDC通道
    ledcSetup(0, 30000, 8); // pwm频道, 频率, 精度
    ledcSetup(1, 30000, 8); // pwm频道, 频率, 精度
    ledcSetup(2, 30000, 8); // pwm频道, 频率, 精度

    // 将GPIO与LEDC通道绑定
    ledcAttachPin(pwmA, 0);
    ledcAttachPin(pwmB, 1);
    ledcAttachPin(pwmC, 2);

    // 输出PWM
    ledcWrite(0, 255);
    ledcWrite(1, 255);
    ledcWrite(2, 255);
}

void loop()
{
}

四、示例程序:ESP32板载LED呼吸灯

#include 

int led_pin = 2;
int ch0 = 0;
int step = 0; // 占空比步长
int duty = 0;
int count = 0;
int breatheTime = 2; // 呼吸灯的周期,单位s

void setup()
{
  // 建立LEDC通道
  ledcSetup(ch0, 1000, 8); // pwm频道, 频率, 精度

  // 将GPIO与LEDC通道绑定
  ledcAttachPin(led_pin, ch0);
  count = pow(2, 8);

  step = 2 * count / (50 * breatheTime);
}

void loop()
{
  ledcWrite(ch0, duty);
  duty += step;
  if (duty > count)
  {
    duty = count;
    step = -step;
  }
  else if (duty < 0)
  {
    duty = 0;
    step = -step;
  }
  delay(20);
}

你可能感兴趣的:(ESP32,ESP32)