ESP32-C3 入门教程 基础篇(七、LEDC — LED PWM 控制器)

前言
基本的 PWM 控制器测试。
测试使用的开发板:
自己画一块 ESP32-C3 的开发板(第一次使用立创 EDA)(PCB 到手)
https://xie.infoq.cn/article/30387388381a0d915b2494f91
测试使用的开发环境:
ESP32-C3 VScode 开发环境搭建(基于乐鑫官方 ESP-IDF——Windows 和 Ubuntu 双环境)
https://xie.infoq.cn/article/5b639e112cabba00cc1b8941a
基础篇系列相关博文:
ESP32-C3 入门教程 基础篇(一、ADC 采样)
https://xie.infoq.cn/article/78eff739dd2ed4971f445272a
ESP32-C3 入门教程 基础篇(二、GPIO 中断、按键驱动测试)
https://xie.infoq.cn/article/7d090d74fb0a9449986954810
ESP32-C3 入门教程 基础篇(三、UART 模块 — 与 Enocean 无线模块串口通信)
https://xie.infoq.cn/article/55d8a9cbd211b4d99b53935ee
ESP32-C3 入门教程 基础篇(四、I2C 总线 — 与 SHT21 温湿度传感器通讯)
https://xie.infoq.cn/article/75a22c7d3499c2d5428f726e8
ESP32-C3 入门教程 基础篇(五、RMT 应用 — 控制 SK6812 全彩 RGB 灯)
https://xie.infoq.cn/article/375c5cc5c6790b56117d0232e
ESP32-C3 入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)

1、LED PWM 控制器基础介绍
1.1 基本介绍
对于 ESP32-C3 通用定时器的介绍,乐鑫的官网的说明链接如下:
ESP32C3 技术参考手册 在第 26 章: LED PWM 控制器(LEDC)

PWM 的基础知识不过多介绍,用一张资料中的截图表示:

关于 PWM 的渐变,是通过改变Lpointn
的值,开启了占空比渐变,Lpointn
的值会在计数器溢出固定次数后(可配置)递增或递减(可配置),渐变值也可以配置:

1.2 使用步骤
老子样子,看一下 PWM 的使用步骤,根据示例代码分析一下就可以测试了:

1、配置定时器,使用 ledc_timer_config
函数,参数为ledc_timer_config_t
结构体:

在示例中,有如下配置:

注意:PWM 频率越高,占空比分辨率越低,反之则越高。对应关系如下:

2、配置通道ledc_channel_config
,参数为ledc_channel_config_t
结构体:

在示例中,有如下配置,选取一个通道为例 :

注意一下,ESP32-C3 只有 6 个通道:

3、完成上述配置后,就可以通过对应的操作控制 LED 渐变,这里可以使用软件,也可以使用硬件,硬件渐变不需要额外的干涉,使用ledc_fade_func_install(0);
使能即可:

在示例程序中的代码如下:

2、LED PWM 示例测试
在官方例程中,我们参考的示例程序为ledc
:

2.1 基础测试
对于官方的例程,使用到了 4 路输出,但是我们的板子上并没有这么多 IO 用于控制 LED 灯,而且例程使用了一些宏定义,所以针对我们的板子上只有一个 LED 的 IO 口 GPIO1 ,只有一个 LED 灯,我们把例程改简单点,也更加直观, 下面直接上修改的代码:
上面的例子是一个通道输出,一个 LED 灯,初始化的时候占空比为 0,起初 LED 灯是最亮的,然后目标占空比为 8000(分辨率为LEDC_TIMER_13_BIT
,最大值 8192),设置在 3000ms 内完成渐变。
上面的例子烧录后,可以看到 LED 灯在 3s 内由亮变暗,不会熄灭,需要设置为 8192 才会完全灭。
只是上面只会执行一次,那么需要每次都由亮便变灭,就需要在渐变前,把占空比设置为 0,如下:

根据上面的测试,所以一个完成的呼吸灯程序,应该是下面这样的:

2.2 ESP32-C3 与 ESP32 LEDC 的区别
为什么区别放在这里,因为这些区别都是通过示例代码测试,自己修改配置和看底层驱动判断过的。
2.2.1 通道数量
在前面基础介绍中有提到过,ESP32-C3 的 PWM 通道只有 6 个,ESP32 是 8 个。这个在 ESP32C3 技术参考手册 中也有提到。
2.2.2 速度模式
在示例原本的程序中,我们看到如果是使用 ESP32-C3,都是使用的LEDC_LOW_SPEED_MODE
低速模式,我们可以看到ledc_mode_t
结构体的定义:

在官网介绍的时候提到过 高速模式:

但是在 ESP32C3 技术参考手册 中没有关于高速模式的说明(我没有找到= =!),然后测试过程我试着把速度模式设置为高速:
确实是报错了。基本说明 ESP32-C3 的 PWM 不支持高速模式
然后在 ESP32 芯片的配置文件下是能够找到定义,他确实可以使用高速通道(通过代码判断是因为代码驱动是官方提供的,肯定是根据芯片手册来写的驱动):

在 ESP32-C3 配置文件下没有相关宏定义:

2.2.3 分辨率
对于分辨率结构体ledc_timer_bit_t
,不同芯片也有不同支持的分辨率:

对于目前我们使用的 ESP32-C3 而言,最大只能支持到 14 位:

而 ESP32 能够支持到 20 位:

版权声明: 本文为 InfoQ 作者【矜辰所致】的原创文章。
原文链接:【http://xie.infoq.cn/article/788b073cb8ee89aa01688d66a】。文章转载请联系作者。
评论