一、PWM信号简介
- PWM:脉冲宽度调制,简称脉宽调制
- 频率(f):一秒钟PWM有多少个周期(单位Hz)
- 周期(T):一个周期的时间
- 占空比(duty):在一个脉冲周期内,高电平的时间与整个周期时间的比例
- 脉宽时间:一个周期内高电平时间
- 占空比越大,输出的有效电压越高。
二、ESP32中的LEDC(PWM控制器)
- LEDC:指LED PWM控制器,即PWM信号产生器。
- LED_PWM有16路通道(0~15)
- 8路高速通道(0~7),由80MHz时钟驱动
- 8路低速通道(8~15),由8MHz时钟驱动
三、产生PWM信号的流程
- 建立LEDC通道
- 将GPIO与LEDC通道绑定
- Write(设置指定通道的占空比)、WriteTone(输出指定频率的占空比)、WriteNote
- 解除GPIO与LEDC通道的关联
3.1 LEDC频率与分辨率的关系
3.2 LEDC频率与最大分辨率表
3.3 使用LEDC输出PWM的示例程序
#include <Arduino.h>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);// 输出PWMledcWrite(0, 255);ledcWrite(1, 255);ledcWrite(2, 255);
}void loop()
{
}
四、示例程序:ESP32板载LED呼吸灯
#include <Arduino.h>int led_pin = 2;
int ch0 = 0;
int step = 0; // 占空比步长
int duty = 0;
int count = 0;
int breatheTime = 2; // 呼吸灯的周期,单位svoid 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);
}