脉冲宽度调制(PWM)是一种在保持波频率恒定的同时改变脉冲宽度的技术。PWM技术主要用于控制LED的亮度,直流电动机的速度,控制伺服电动机,或在其他情况下必须使用数字源生成模拟信号的情况。我们在上一篇文章中详细介绍了PWM。
在本教程中,我们将讨论ESP32开发板的PWM(脉冲宽度调制)引脚。ESP32开发板的所有GPIO引脚(电源,GND,Tx,Rx和EN除外)均可用于获取PWM信号。以ESP32 PWM为例,我们将建立一个简单的电路,根据PWM信号改变LED的亮度。
所需组件
- ESP32
- LED
- 330电阻
- 10k锅
- 面包板
PWM产生
在解释ESP32上的PWM生成之前,让我们讨论一些与PWM相关的术语。
TON(接通时间):信号为高电平的持续时间。
TOFF(关闭时间):信号为低电平时的持续时间。
周期:它是PWM信号的开启时间和关闭时间的总和。
TotalPeriod = T ON + T OFF
占空比:在PWM信号周期内信号为高电平的时间百分比。
占空比= T ON / T合计* 100
例如,如果一个总周期为10ms的脉冲在5ms内保持ON(高)状态。然后,占空比将为:
占空比= 5/10 * 100 = 50%占空比
该电路包含一个LED,一个电阻和一个10K电位器。LED的负极引脚通过330电阻连接到ESP32的GND。您可以使用230Ω至500Ω之间的任何电阻值。将LED的正极引脚连接到GPIO 16,并将Pot的信号引脚连接到ESP32的ADC1(VP)引脚。
ESP32 PWM的代码说明
完整的代码在页面末尾给出。
该代码不需要任何库,因此通过定义LED所连接的引脚来开始您的代码。就我而言,我使用GPIO 16连接LED。
const int ledPin = 16; // 16对应于GPIO16
之后,在下一行中设置PWM信号属性。我将PWM频率设置为9000,将分辨率设置为10,可以更改它以生成不同的PWM信号。ESP32开发板支持从1位到16位的PWM分辨率。您还需要选择一个PWM通道。ESP32共有16(0至15)个PWM通道。
const int freq = 9000; const int ledChannel = 0; const int resolution = 10;
现在,在 void setup() 函数内部,使用 ledcSetup() 函数将LED PWM配置为您先前设置的属性。在下一行中,定义连接LED的GPIO引脚。所述 ledcAttachPin() 函数是用来定义的GPIO引脚和被产生的信号中的信道。就我而言,我使用了GPIO 16的ledPin和对应于通道0的ledChannel。
void setup(){Serial.begin(9600); ledcSetup(ledChannel,freq,resolution); ledcAttachPin(ledPin,ledChannel); }
在 空循环中, 读取电位计连接到的模拟引脚,并将读数存储在名为 “ dutyCycle” 的变量中。LED亮度将根据电位器的旋转而增加或减少。该 ledcWrite() 非常相似, analogWrite()。
void loop(){dutyCycle = AnalogRead(A0); ledcWrite(ledChannel,dutyCycle); 延迟(15); }
测试ESP32 PWM信号
要测试ESP32的PWM信号,请按照电路图连接LED和电位器,并将代码上传到ESP32。确保选择了正确的板和COM端口。现在旋转电位计以增加或减少LED亮度。
下面的视频显示了完整的工作。此外,通过链接检查其他基于ESP32的项目。