PWM(脉冲调制)人为地产生 0 至 3.3V 之间的可变电压。ESP32 上的 PWM 比 Arduino 上的更完整。
PWM工作原理提醒
esp32单片机的数字引脚,其实只能输出高电平和低电平,也就是要不就是3.3伏要不就是输出0伏,而PWM 是一种在数字引脚上获取模拟信号的方法。pwm简单的说就是快速再高低电平之间,有规律的切换,由于切换的速度特别的快,从而创造出一种中间电平的假象。
通过 Arduino 代码在 ESP32 上使用 PWM
在 ESP32 上使用 PWM 与使用 Arduino 不同。可以将 16 个独立的 PWM 通道分配给 GPIO 引脚(GPIO36、GPIO39、GPIO34 和 GPIO35 引脚除外),每一个管脚只能分配一个通道。ESP32 上的 PWM 配置稍微复杂一些,但功能更强大。该 ledc
模块负责 PWM,并且允许使用它的三个主要功能: ledcSetup()
、 ledcAttachPin()
、 ledcWrite()
例如,要在引脚 GPIO23 上生成 PWM 信号,您必须:
-
选择 PWM 通道 (0 - 15)
-
选择脉宽调制频率
-
选择 1 到 16 位之间的脉冲宽度分辨率
-
选择将生成 PWM 信号的 GPIO 引脚
-
向输出端输出指定所需的电压值
int pwmChannel = 0; // 选择通道
int frequence = 1000; // pwm的频率1000赫兹
int resolution = 8; // 8为分辨率,也就是将0到3.3伏分成256份
int pwmPin = 23;
void setup(){
ledcSetup(pwmChannel, frequence, resolution);
// pwm关联23号管脚
ledcAttachPin(pwmPin, pwmChannel);
// 输出pwm信号,也就是向23号管脚设定127*3.3/256=1.637V电压。
ledcWrite(pwmChannel, 127);
}
void loop(){
}
一旦完成ledcSetup()
和函数的配置,我们仅使用该 函数来设置电压。
ledcAttachPin()
ledcWrite()
警告
该analogWrite()
功能不适用于 ESP32。你应该改用ledcWrite()
。
迷你项目:通过 PWM 调光 LED
我们将使用 PWM 信号调暗三个 LED。
电气原理图
选择您想要的 LED 颜色。
电路
电路(面包板版)
警告
3.3伏的输出对于led来说还是太大了,蓝色led的耐压值是3伏,红白led是2-2.2伏。不要忘记将电阻器与 LED 串联,以免将其烧坏。220Ω 到 330Ω 之间的值就可以很好地完成这项工作。
控制 LED 亮度的代码
解决方案
const int ledPin = 23;
const int ledPin2 = 22;
const int ledPin3 = 21;
// PWM channel 0 parameter
const int freq = 5000; // 5000 Hz
const int ledChannel = 0;
const int resolution = 8; // 8-bit resolution
void setup(){
// Configure the channel 0
ledcSetup(ledChannel, freq, resolution);
// Attach the channel 0 on the 3 pins
ledcAttachPin(ledPin, ledChannel);
ledcAttachPin(ledPin2, ledChannel);
ledcAttachPin(ledPin3, ledChannel);
}
void loop(){
// 调整led亮度在0-255之间
for(int dutyCycle = 0; dutyCycle <= 255; dutyCycle++){
ledcWrite(ledChannel, dutyCycle);
delay(15);
}
}
同时控制3个led,不用为每个引脚指定三个不同的 PWM 通道,而是仅使用一个并将其分配给三个引脚。也就是说可以将一路pwm信号发送给多个引脚,从而控制多个led,但是结果就是他们是同步变化的。否则你就需要给每一个led指定不同的PWM通道了。