风筝
发表于: 2021-9-7 15:26:43 | 显示全部楼层

脉宽调制 (PWM) 是一种在保持波形频率恒定的同时改变脉冲宽度的技术。PWM技术主要用于控制LED的亮度、直流电机的速度、控制伺服电机,以及需要使用数字源生成模拟信号的场景。


在本篇文章中,我们将讨论ESP32开发板的PWM(脉宽调制)功能。 ESP32开发板的所有GPIO引脚(Power、GND、Tx、Rx和EN 除外)均可用于产生PWM信号。我们将制作一个简单的电路作为ESP32 PWM示例,根据PWM信号改变LED的亮度。


所需的组件

●    ESP32开发板

●    LED指示灯

●    330欧电阻

●    10k电位器

●    面包板


PWM生成技术

在解释ESP32上的PWM功能之前,让我们讨论一些与PWM相关的术语。

●    TON(导通时间):信号为高电平时的持续时间。

●    TOFF(关断时间):信号为低电平时的持续时间。

●    周期:PWM信号的导通时间和关断时间之和。

●    占空比:PWM信号周期内信号为高电平的时间百分比。

      例如,如果总周期为10ms的脉冲保持 ON(高)5ms。然后,占空比将为:占空比 = 5/10 * 100 = 50%

pulse-width-modulation-duty-cycle.jpg


●    PWM的频率:PWM信号的频率决定了PWM完成一个周期的速度。一个周期是一个PWM信号的完整ON和OFF,如上图所示。


ESP32上的PWM功能

在Arduino和NodeMCU中,我们使用analogWrite()函数将0到254之间的值写入到LED引脚。但是ESP32开发板不支持analogWrite()函数。因此,我们将使用另一个函数,即ledcWrite()函数,而不是analogWrite()。 ledcWrite()与analogWrite() 非常相似。它还需要两个参数:我们想要写入PWM 值的PWM通道和我们想要写入所选通道的PWM值。 ESP32有16个PWM通道,您可以使用任何GPIO产生PWM输出。 ESP32提供了三个函数,用于为引脚分配PWM通道以及配置PWM 信号的分辨率、频率和占空比。这些函数分别是:

  1. ledcAttachPin(gpio, channel)
  2. ledcSetup(channel, frequency, resolution)
  3. ledcWrite(channel, dutycycle)
复制代码

电路图

ESP32产生PWM的电路图如下。

ESP32-PWM-Circuit-Diagram.jpg


该电路包含一个 LED、一个电阻和一个10K电位器。 LED的负极通过330欧电阻连接到ESP32的GND。您可以使用230欧和500欧之间的任何电阻值。将LED正极引脚连接到GPIO 16,将电位器的信号引脚连接到ESP32的ADC1 (VP) 引脚。


PWM代码说明

该代码不需要任何库,可以直接在代码中定义LED连接的引脚。本文中使用GPIO 16连接LED。

  1. const int ledPin = 16;  // 16 corresponds to GPIO16
复制代码

之后,在代码中设置PWM信号属性。我把PWM频率设置为9000,分辨率设置为10,你可以改变它来产生不同的PWM信号。 ESP32板支持从1位到16位的PWM分辨率。还需要选择一个PWM通道。 ESP32共有16 个PWM通道。

  1. const int freq = 9000;
  2. const int ledChannel = 0;
  3. const int resolution = 10;
复制代码

void setup()函数中,使用ledcSetup()函数配置LED PWM通道属性。然后绑定连接LED的GPIO引脚。ledcAttachPin()函数用于定义生成信号的GPIO引脚和通道。本文使用了GPIO 16的 ledPin和对应于通道0的ledChannel

  1. void setup(){
  2.   Serial.begin(9600);
  3.   ledcSetup(ledChannel, freq, resolution);
  4.   ledcAttachPin(ledPin, ledChannel);
  5. }
复制代码

void loop()函数中,读取连接电位器的模拟引脚并将读数存储在名为“dutyCycle”的变量中。 LED亮度会随着电位器的转动而增加或减少。 ledcWrite()与analogWrite()功能非常相似。

  1. void loop(){
  2.    dutyCycle =  analogRead(A0);
  3.    ledcWrite(ledChannel, dutyCycle);
  4.    delay(15);
  5.   }
复制代码

测试ESP32 PWM信号

要测试ESP32产生的PWM信号,请按照电路图连接LED和电位器,并将代码上传到ESP32开发板。确保选择了正确的电路板型号和COM端口。现在旋转电位器来增加或减小LED亮度。

ESP32-PWM-Development-Board.jpg


以上就是本文的全部内容,如果有任何疑问,请在本帖下面进行回复。

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 54 | 回复: 107



手机版|

GMT+8, 2024-4-23 16:00 , Processed in 0.065152 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表