在本教程中,我们将讨论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。
常量 int ledpin = 16; // 16对应gpio16
之后,在下一行设置 pwm 信号属性。我将 pwm 频率设置为 9000,分辨率设置为 10,您可以更改它以生成不同的 pwm 信号。esp32 板支持从 1 位到 16 位的 pwm 分辨率。您还需要选择一个 pwm 通道。esp32 共有 16 个(0 到 15)个 pwm 通道。
常量 int 频率 = 9000;常量 int ledchannel = 0;常量 int 分辨率 = 10;
现在在void setup()函数中,使用ledcsetup()函数使用您之前设置的属性配置 led pwm。在下一行中,定义连接 led 的 gpio 引脚。ledcattachpin ()函数用于定义 gpio 引脚和生成信号的通道。在我的例子中,我使用了 gpio 16 的 ledpin 和对应于通道 0 的 ledchannel。
无效设置(){ 序列号.开始(9600); ledcsetup(ledchannel, 频率, 分辨率); ledcattachpin(ledpin, ledchannel);}
在void 循环中,读取连接 pot 的模拟引脚并将读数存储在名为'dutycycle'的变量中。led 亮度会随着电位器的旋转而增加或减少。ledcwrite ()与analogwrite()非常相似。
无效循环(){ dutycycle = 模拟读取(a0); ledcwrite(ledchannel, dutycycle); 延迟(15); }
测试 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);
}
中国移动计划全年发展1亿5G套餐用户
一加手机CEO刘作虎表示:将加大对北美市场的投入
趋势or过渡,量子点屏幕真的优于OLED?
寒武纪副总裁钱诚带来《深度学习处理器》
数字化的5G,未来的新布局
利用ESP32 PWM信号控制LED的亮度
微机电系统(MEMS)惯性组件应用起飞
verilog移位操作和C语言的移位操作的异同点有哪些?
导线截面的计算公式
区块链还有哪些局限性
霉菌培养箱的用途是什么,它的使用说明介绍
任正非圆桌采访纪要
一次搞定开关电源设计时PCB布局关键
商务手机首选:华为Mate10还未发布华为Mate9就再次降价,现在性价比爆棚
基于森国科MCU SPIN的落地扇和循环扇应用方案
亚马逊推出一款黑科技的电视盒子,你可以通过语音让它去执行命令
周鸿祎赚大了,大富科技欲收购百立丰51%以上股权
如何获得同步降压转换器的关键设计技术
鸿蒙系统有啥用 鸿蒙分布式系统的好处
曝索尼将在2月5日公布PS5更多信息