找回密码
 立即注册
搜索
0赞
赞赏
手机版
扫码打开手机版
把文字装进口袋

利用ESP32 PWM信号控制LED的亮度

东阿制造 2022-8-26 14:30:32
在本教程中,我们将讨论ESP32 开发板的 PWM(脉冲宽度调制)引脚。ESP32 开发板的所有 GPIO 引脚(Power、GND、Tx、Rx 和 EN 除外)均可用于获取 PWM 信号。作为ESP32 PWM 示例,我们将构建一个简单的电路,根据 PWM 信号改变 LED 亮度。
        所需组件
        ESP32
        引领
        330Ω电阻
        10k 锅
        面包板
        PWM 生成
        在解释 ESP32 上的 PWM 生成之前,让我们讨论一些与 PWM 相关的术语。
        TON(开启时间):信号为高电平的持续时间。
        TOFF(关闭时间):信号为低电平的持续时间。
        周期:它是 PWM 信号的开启时间和关闭时间的总和。
        TotalPeriod = T ON + T OFF
        占空比:在 PWM 信号周期内信号为高电平的时间百分比。
        占空比 = T ON /T总计* 100
        例如,如果一个总周期为 10ms 的脉冲保持 ON(高)5ms。然后,占空比将是:
        占空比 = 5/10 * 100 = 50% 占空比
       
        PWM的频率:PWM 信号的频率决定了 PWM 完成一个周期的速度。一个周期是完成一个 PWM 信号的 ON 和 OFF,如上图所示。
        ESP32 上的 PWM 生成
        在Arduino和 NodeMCU 中,我们使用模拟写入()函数将 0 到 254 之间的值“写入”到 LED 引脚。但是ESP32开发板不支持analogWrite()函数。所以我们将使用另一个函数而不是analogWrite(),即ledcWrite()函数。ledcWrite ()与analogWrite()非常相似。它还需要两个参数:我们想要“写入”PWM 值的 PWM 通道和我们想要写入所选通道的 PWM 值。ESP32 有 16 个 PWM 通道,您可以使用任何 GPIO 来生成 PWM 输出。ESP32 提供了三个函数来分配一个 PWM 通道到一个引脚,以及配置 PWM 信号的分辨率、频率和占空比。这些功能是:
        ledcAttachPin(gpio, channel)
        ledcSetup(channel, frequency, resolution)
        ledcWrite(channel, dutycycle)
        电路原理图
        ESP32 PWM的电路图如下所示。
       
        该电路包含一个 LED、一个电阻器和一个 10K 电位器。LED 的负极通过一个 330 Ω 的电阻连接到 ESP32 的 GND。您可以使用 230 Ω 和 500 Ω 之间的任何电阻值。将 LED 正极引脚连接到 GPIO 16,将 Pot 的信号引脚连接到 ESP32 的 ADC1 (VP) 引脚。
        ESP32 PWM 代码说明
        完整的代码在页面末尾给出。
        此代码不需要任何库,因此通过定义引脚开始您的代码,LED 连接到。就我而言,我使用 GPIO 16 连接 LED。
       
  1. 常量 int ledPin = 16; // 16对应GPIO16
复制代码

        之后,在下一行设置 PWM 信号属性。我将 PWM 频率设置为 9000,分辨率设置为 10,您可以更改它以生成不同的 PWM 信号。ESP32 板支持从 1 位到 16 位的 PWM 分辨率。您还需要选择一个 PWM 通道。ESP32 共有 16 个(0 到 15)个 PWM 通道。
       
  1. 常量 int 频率 = 9000;
  2. 常量 int ledChannel = 0;
  3. 常量 int 分辨率 = 10;
复制代码

        现在在void setup()函数中,使用ledcSetup()函数使用您之前设置的属性配置 LED PWM。在下一行中,定义连接 LED 的 GPIO 引脚。ledcAttachPin()函数用于定义 GPIO 引脚和生成信号的通道。在我的例子中,我使用了 GPIO 16 的 ledPin 和对应于通道 0 的 ledChannel。
       
  1. 无效设置(){
  2.   序列号.开始(9600);
  3.   ledcSetup(ledChannel, 频率, 分辨率);
  4.   ledcAttachPin(ledPin, ledChannel);
  5. }
复制代码

        在void 循环中,读取连接 Pot 的模拟引脚并将读数存储在名为'dutyCycle'的变量中。LED 亮度会随着电位器的旋转而增加或减少。ledcWrite()与analogWrite()非常相似。
       
  1. 无效循环(){
  2.    dutyCycle = 模拟读取(A0);
  3.    ledcWrite(ledChannel, dutyCycle);
  4.    延迟(15);
  5.   }
复制代码

        测试 ESP32 PWM 信号
        要测试 ESP32 PWM 信号,请按照电路图连接 LED 和电位器,然后将代码上传到您的 ESP32。确保您选择了正确的板和 COM 端口。现在旋转电位器来增加或减少 LED 亮度。
       
        常量 int ledPin = 16; // 16对应GPIO16
        uint16_t 占空比;
        // 设置 PWM 属性
        常量 int 频率 = 15000;
        常量 int ledChannel = 0;
        常量 int 分辨率 = 13;
        无效设置(){
        序列号.开始(9600);
        // 配置 LED PWM 功能
        ledcSetup(ledChannel, 频率, 分辨率);
        // 将通道附加到要控制的 GPIO
        ledcAttachPin(ledPin, ledChannel);
        }
        无效循环(){
        dutyCycle = 模拟读取(A0);
        Serial.print(dutyCycle);
        // 使用 PWM 改变 LED 亮度
        ledcWrite(ledChannel, dutyCycle);
        延迟(15);
        }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

使用道具 举报

您需要登录后才可以回帖 立即登录
◥█▄▃▁
.......◥█☆█▅▄▃▁▁▁▁▁▃▄▅▅ 四川代表队 ▅▅▅▄▁
〓▇█████ 雷雷雷雷雷雷██████████████████▅▄▃▁▁
〓〓〓█████████████◤
....................轰炸过
..................轰炸过
...............轰炸过
............轰炸过
..........轰炸过
........轰炸过
......轰炸过
.....轰炸过
....轰炸过
...轰炸过
..轰炸过
.轰炸过 .轰炸过 楼上l楼下保持队行 !!!!!
2022-8-26 18:55:04
卧槽,我居然看完了
2022-8-26 19:42:26
◥█▄▃▁
.......◥█☆█▅▄▃▁▁▁▁▁▃▄▅▅ 重庆代表队 ▅▅▅▄▁
〓▇█████ 雷雷雷雷雷雷██████████████████▅▄▃▁▁
〓〓〓█████████████◤
....................轰炸过
..................轰炸过
...............轰炸过
............轰炸过
..........轰炸过
........轰炸过
......轰炸过
.....轰炸过
....轰炸过
...轰炸过
..轰炸过
.轰炸过 .轰炸过 楼上l楼下保持队行 !!!!!
2022-8-28 09:35:42
2022-8-29 03:38:28
第一次评论啊,好紧张啊,该怎么说啊,打多少字才显的有文采啊,这样说好不好啊,会不会成热贴啊,我写的这么好会不会太招遥,写的这么深奥别人会不会看不懂啊,怎样才能写出我博士后的水平呢,半年写了这么多会不会太快啊,好激动啊
2022-8-29 06:21:24
支持你们一下下哈
2022-8-29 07:37:36
不错哦  喜欢 嘿嘿
2022-8-29 08:53:48
顶一个了
2022-8-29 10:10:00
顶起  很好的帖
2022-8-29 11:26:12
1234下一页
返回顶部