一、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);
// 输出PWM
ledcWrite(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; // 呼吸灯的周期,单位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);
}