先导知识
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 信号。
电路连接:
ESP32 | LED |
---|---|
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();//
}
参考资料