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

简介: 测试第7课,补一补基本的PWM控制器的测试。说明一下,ESP32-C3没有MCPWM硬件,所以测试只有LEDPWM,如果想用ESP32-C3控制电机,可以考虑使用 RMT,后期有机会测试一下。
测试第7课,补一补基本的PWM控制器的测试。
说明一下,ESP32-C3没有MCPWM硬件,所以测试只有LEDPWM,
如果想用ESP32-C3控制电机,可以考虑使用 RMT,后期有机会测试一下。

前言

ESP32-C3系列博文连接:

测试使用的开发板:
自己画一块ESP32-C3 的开发板(第一次使用立创EDA)(PCB到手)

测试使用的开发环境:
ESP32-C3 VScode开发环境搭建(基于乐鑫官方ESP-IDF——Windows和Ubuntu双环境)

基础篇系列相关博文:
ESP32-C3入门教程 基础篇(一、ADC采样)
ESP32-C3入门教程 基础篇(二、GPIO中断、按键驱动测试)
ESP32-C3入门教程 基础篇(三、UART模块 — 与Enocean无线模块串口通信)
ESP32-C3入门教程 基础篇(四、I2C总线 — 与SHT21温湿度传感器通讯)
ESP32-C3入门教程 基础篇(五、RMT应用 — 控制SK6812全彩RGB 灯)
ESP32-C3入门教程 基础篇(六、TIMG 硬件定时器 与 软件定时器)

在开发板上,测试需要用到的东西比较简单,只需要使用到 用户 LED,如下图:
在这里插入图片描述

1、LED PWM控制器基础介绍

1.1 基本介绍

对于ESP32-C3 通用定时器的介绍,乐鑫的官网的说明链接如下:

乐鑫官方ESP32-C3 LED PWM部分说明

ESP32­C3 技术参考手册 在第 26章: LED PWM 控制器(LEDC)
在这里插入图片描述

PWM的基础知识不过多介绍,用一张资料中的截图表示:
在这里插入图片描述
关于PWM的渐变,是通过改变Lpointn的值,开启了占空比渐变,Lpointn的值会在计数器溢出固定次数后(可配置)递增或递减(可配置),渐变值也可以配置:
在这里插入图片描述

1.2 使用步骤

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

在这里插入图片描述

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

在这里插入图片描述
在示例中,有如下配置:
在这里插入图片描述
注意:PWM 频率越高,占空比分辨率越低,反之则越高。对应关系如下:
在这里插入图片描述

  1. 配置通道ledc_channel_config,参数为ledc_channel_config_t结构体:

在这里插入图片描述
在示例中,有如下配置,选取一个通道为例 :
在这里插入图片描述
注意一下,ESP32-C3只有6个通道:
在这里插入图片描述

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

在这里插入图片描述
在示例程序中的代码如下:
在这里插入图片描述

2、LED PWM示例测试

在官方例程中,我们参考的示例程序为ledc
在这里插入图片描述

2.1 基础测试

对于官方的例程,使用到了4路输出,但是我们的板子上并没有这么多IO用于控制LED灯,而且例程使用了一些宏定义,所以针对我们的板子上只有一个LED的IO口 GPIO1 ,只有一个LED灯,我们把例程改简单点,也更加直观, 下面直接上修改的代码:

void app_main(void)
{
    ledc_timer_config_t ledc_timer = {
        .duty_resolution = LEDC_TIMER_13_BIT, // resolution of PWM duty
        .freq_hz = 5000,                      // frequency of PWM signal
        .speed_mode = LEDC_LOW_SPEED_MODE,           // timer mode
        .timer_num = LEDC_TIMER_0,            // timer index
        .clk_cfg = LEDC_AUTO_CLK,              // Auto select the source clock
    };
    ledc_timer_config(&ledc_timer);

    ledc_channel_config_t ledc_channel= {
        .channel    = LEDC_CHANNEL_1,
        .duty       = 0,
        .gpio_num   = 1,
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .hpoint     = 0,
        .timer_sel  = LEDC_TIMER_0
    };
    ledc_channel_config(&ledc_channel);
    
    // Initialize fade service.
    ledc_fade_func_install(0);

    while (1) {
        ledc_set_fade_with_time(ledc_channel.speed_mode,ledc_channel.channel, 8000, 3000);
        ledc_fade_start(ledc_channel.speed_mode,ledc_channel.channel, LEDC_FADE_NO_WAIT);
        vTaskDelay(3000 / portTICK_PERIOD_MS);
    }
}

上面的例子是一个通道输出,一个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个。这个在 ESP32­C3 技术参考手册 中也有提到。

2.2.2 速度模式

在示例原本的程序中,我们看到如果是使用ESP32-C3,都是使用的LEDC_LOW_SPEED_MODE低速模式,我们可以看到ledc_mode_t结构体的定义:
在这里插入图片描述

在官网介绍的时候提到过 高速模式:
在
但是在 ESP32­C3 技术参考手册 中没有关于高速模式的说明(我没有找到= =!),然后测试过程我试着把速度模式设置为高速:

.speed_mode = LEDC_HIGH_SPEED_MODE,           // timer mode

确实是报错了。基本说明 ESP32-C3 的PWM不支持高速模式

然后在ESP32芯片的配置文件下是能够找到定义,他确实可以使用高速通道(通过代码判断是因为代码驱动是官方提供的,肯定是根据芯片手册来写的驱动 ):
在这里插入图片描述
在 ESP32-C3 配置文件下没有相关宏定义:
在这里插入图片描述

2.2.3 分辨率

对于分辨率结构体ledc_timer_bit_t,不同芯片也有不同支持的分辨率:
在这里插入图片描述
对于目前我们使用的 ESP32-C3 而言,最大只能支持到14位:
在这里插入图片描述
而 ESP32 能够支持到20位:
在这里插入图片描述

相关文章
|
传感器 编解码 IDE
ESP32开发板引脚介绍【附有引脚使用实例】
ESP32开发板引脚介绍👨‍🏫内容1:背景👨‍⚖️内容2:限制类引脚👨‍💻内容3:ESP32 周边设备🍉文末备注 👨‍🏫。
ESP32开发板引脚介绍【附有引脚使用实例】
|
6月前
|
Linux 芯片
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-1
|
6月前
|
Ubuntu Linux
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯
Linux驱动入门 —— 利用寄存器操作GPIO进行LED点灯-2
|
4月前
|
监控
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
stm32f407探索者开发板(十八)——串口通信实验讲解(USART_RX_STA流程图详解)
330 0
|
6月前
|
Linux 芯片 Ubuntu
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
Linux驱动入门 —— 利用引脚号操作GPIO进行LED点灯
|
6月前
|
测试技术 Perl
【ZYNQ】ZYNQ7000 UART 控制器及驱动应用示例
【ZYNQ】ZYNQ7000 UART 控制器及驱动应用示例
268 0
STM32F0单片机快速入门五 GPIO中断
STM32F0单片机快速入门五 GPIO中断
51单片机学习--LCD模块使用
51单片机学习--LCD模块使用
139 0
|
芯片
【STC15单片机】初始化程序原理
【STC15单片机】初始化程序原理
278 0