与ArduinoUno引脚直接输出PWM不同,ESP32使用LED控制器(简称LEDC)来实现PWM模拟信号的生成,是不是感觉进入机器人技术五级后难度陡然升而了?不要把它想象的太难,因为esp32的接口封装的都很完善,所以具体使用并不复杂。
一、快速入门
今天我使用最新版的来写一个呼吸灯程序,这是一个典型的模拟信号输出用例,大部分初学者都会用呼吸灯练手。
1、定义变量
//定义LED连接引脚变量为4(GPIO4)
constintledPin=4;
//定义PWM频率变量为5000Hz
constintfreq=5000;
//设置PWM通道变量为0,范围0~15
constintledChannel=0;
//设置PWM分辨率变量为8(位)
constintresolution=8;
2、初始化(setup)
//初始化通道的频率、分辨率
ledcSetup(ledChannel,freq,resolution);
//连接通道(0)与引脚(GPIO4)
ledcAttachPin(ledPin,ledChannel);
3、呼吸灯效果(loop)
//由暗到亮
for(intx=0;x=255;x++){
//向通道0输出渐变占空比的PWM信号
ledcWrite(ledChannel,x);
delay(6);
}
//由亮到暗
for(intx=255;x=0;x--){
ledcWrite(ledChannel,x);
delay(6);
}
4、把这段程序编译并上传,然后演示一下呼吸灯的效果吧。
呼吸灯编译、上传
二、为什么ESP32的模拟输出相对ArduinoUno更加复杂?
看了上面的开发步骤,是不是觉得相对ArduinoUno更复杂了?其实无非是多了通道、频率、分辨率的初始化设置,以及通道和引脚的关联这两步。为了把流程讲的更清楚一些,我画了一个示意图。从示意图中可以看到,整个过程我们分三步完成:
(1)设置通道的频率和分辨率
(2)把通道关联到引脚上
(3)PWM输出
ESP32的PWM输出示意图
1、分辨率设置
为了方便理解分辨率,我们先回顾下机器人四级考试时候的一个概念”占空比“,即指在一个脉冲循环周期内,高电平持续的时间所占的比例,而分辨率,则是占空比的最小值。当分辨率设置8位的时候,PWM的分辨率为1:255,输出的计数器可以设置为0~255。
ESP32占空比分辨率设置范围为1~16位,分辨率越高,占空比分割就越细,或者可以理解为PWM输出就越精细,精度越高。
如果分辨率设置了最高的16位,输出范围为达到0~65536(2的16次方)。即便我们把分辨率设置为12位,范围也能达到0~4095,相对ArduinoUNO引脚直接输出的0~255区间,也是巨大的超越。
所以,ESP32复杂带来的好处就是,可以进行更加精细的控制,比如用在舵机上,就可以实现更加精细的操作。我们常用的分辨率设置,8位,0~255;10位,0~1023,12位,0~4095。
2、频率设置
我们在前面的例子中,分辨率设置了8位,频率设置了5000Hz,这个频率是指PWM信号的频率,即一个周期内高低电平的切换次数,范围1Hz到1MHz之间,频率越高,模拟信号输出就越平滑,但是硬件负载也越大。
如果分辨率设置了最高的16位,频率最大只能设置到1200Hz,分辨率越高,频率越低。如果分辨率降到13位,则最大频率可设置为5000Hz。
阿童木