ESP32模拟信号输出(机器人五级)入门与进阶

与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。

阿童木

发布于 2024-12-14
162
目录

    推荐阅读