0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

[esp32教程] 4、LEDC使用

板凳说 来源:板凳说 作者:板凳说 2023-06-03 09:39 次阅读

0、前期准备

1、参考上一篇文章搭建好esp32环境

2、准备好一块esp32开发开发板(本作者使用了esp32c3作为开发平台)

1、知识储备

1.1 概述

LEDC是乐鑫公司专门开发,通过PWM来控制LED,具有软件控制占空比以及硬件自动控制占空比的方式。同时据说也可以用来控制电机。

1.2 功能架构

LEDC有4个定时器可以独立配置,定时器时钟来源有三个时钟源,分别是:APB_CLK、RC_FAST_CLK 和 XTAL_CLK。

架构图如下所示:

1.3 LEDC配置流程介绍

LEDC的配置流程可分为以下3步

1、定时器配置:设置PWM 频率和占空比分辨率(位数)

2、通道配置:设置定时器通道以及PWM的输出引脚

3、 修改占空比

1、定时器配置

定时器的配置主要是给 ledc_timer_config_t 结构体赋值,然后通过ledc_timer_config函数进行对定时器设置

以下对ledc_timer_config_t 结构体进行说明

typedef struct {
    ledc_mode_t speed_mode; // ledc速度模式:LEDC_HIGH_SPEED_MODE和LEDC_LOW_SPEED_MODE
    union {
        ledc_timer_bit_t duty_resolution; //占空比的分分辨率
        ledc_timer_bit_t bit_num __attribute__((deprecated)); //esp-idf 3.1以上已经使用该参数
    };
    ledc_timer_t  timer_num; //定时器编号
    uint32_t freq_hz; //pwm频率
    ledc_clk_cfg_t clk_cfg; //时钟源:
} ledc_timer_config_t;

例子:

// 定时器配置
ledc_timer_config_t ledcTimerConfig = {
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .duty_resolution = LEDC_TIMER_13_BIT,
    .clk_cfg = LEDC_AUTO_CLK,
    .freq_hz = 5000,
    .timer_num = LEDC_TIMER_0,
};
ledc_timer_config(&ledcTimerConfig);
2、通道配置

通道的配置主要是给 ledc_channel_config_t 结构体赋值,然后通过ledc_channel_config函数进行通道设置。

以下对ledc_channel_config_t 结构体进行说明

typedef struct {
    int gpio_num;//输出pwm的gpio口
    ledc_mode_t speed_mode// ledc速度模式:LEDC_HIGH_SPEED_MODE和LEDC_LOW_SPEED_MODE
    ledc_channel_t channel; // ledc的输出通道:
    ledc_intr_type_t intr_type; //是否使能中断,如果使能中断之后,需要使用ledc_isr_register函数,进行中断注册,在渐变完成之后,就会调用中断函数
    ledc_timer_t timer_sel;//设置使用哪一个定时器,需要和ledc_timer_config_t配置的一致
    uint32_t duty;//占空比
    int hpoint;//上升沿出现的位置,一般设置为0,最大值为0xfffff
    struct {
        unsigned int output_invert: 1;//电平是否翻转,1:0- >1, 0:1- >0
    } flags;

} ledc_channel_config_t;

例子:

// 通道配置
ledc_channel_config_t ledcChannelConfig = {
    .gpio_num = GPIO_NUM_14,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel = LEDC_CHANNEL_0,
    .intr_type = LEDC_INTR_DISABLE,
    .timer_sel = LEDC_TIMER_0,
    .duty = 0,
    .hpoint = 0,
    .flags.output_invert = 0,
};
ledc_channel_config(&ledcChannelConfig);
3、 修改占空比

ledc占空比可以通过,软件和硬件两个方式进行设置。

软件方式:主要涉及了ledc_set_duty和ledc_update_duty两个函数,其中

ledc_set_duty:用来设置占空比

ledc_update_duty:使设置生效,

函数参数说明如下:

esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty)//参数:speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致
//     duty:占空比,取值范围:0 ~ (2^duty_resolution) - 1
    
esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel);
//参数:speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致

硬件方式:主要涉及到了ledc_fade_func_install、ledc_set_fade_with_step、ledc_set_fade_with_time和ledc_fade_start几个函数,其中

ledc_fade_func_install:用来使能硬件,使得硬件能够改变占空比,

ledc_set_fade_with_step:用于设置渐变的步长

ledc_set_fade_with_time:用于设置渐变到某一个值,一般ledc_set_fade_with_step和ledc_set_fade_with_time使用其中一个即可

ledc_fade_start:开始渐变

(注意:ledc_set_fade_with_time和ledc_fade_start不是线程安全的,不要在不同的任务中同时调用这些函数来控制一个ledc通道,API的线程安全版本是ledc_set_fade_step_and_start)

函数参数说明如下:

esp_err_t ledc_fade_func_install(int intr_alloc_flags);
//参数:intr_alloc_flags:用于分配中断的标志,一般填0即可

esp_err_t ledc_set_fade_with_step(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, uint32_t scale, uint32_t cycle_num);
// 参数 :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致
//     target_duty: 目标占空比,取值范围:0 ~ (2^duty_resolution) - 1
//     scale:控制增加或减少步长比例。
//     cycle_num:每cycle_num个周期增加或减少占空比

esp_err_t ledc_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_fade_time_ms);
// 参数 :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致
//     target_duty: 目标占空比,取值范围:0 ~ (2^duty_resolution) - 1
//     max_fade_time_ms:减到目标占空比花费的时间

esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode);
// 参数 :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致
//     fade_mode: 渐变模式,阻塞(LEDC_FADE_WAIT_DONE)和非阻塞(LEDC_FADE_NO_WAIT)

2、新建工程

idf.py create-project project_led # 新建工程
cd project_led
idf.py set-target esp32c3 # 设置工程使用的芯片

2、查看原理图确定按键控制引脚

p.png

3、编写程序

本例子是使用软件,配置占空比方式,有兴趣的小伙伴可以尝试使用硬件方式

#include 

#include 
#include 

#include 

void app_main(void) {
    // 定时器配置
    ledc_timer_config_t ledcTimerConfig = {
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .duty_resolution = LEDC_TIMER_13_BIT,
        .clk_cfg = LEDC_AUTO_CLK,
        .freq_hz = 5000,
        .timer_num = LEDC_TIMER_0,
    };
    ledc_timer_config(&ledcTimerConfig);

    // 通道配置
    ledc_channel_config_t ledcChannelConfig = {
        .gpio_num = GPIO_NUM_5,
        .speed_mode = LEDC_LOW_SPEED_MODE,
        .channel = LEDC_CHANNEL_0,
        .intr_type = LEDC_INTR_DISABLE,
        .timer_sel = LEDC_TIMER_0,
        .duty = 0,
        .hpoint = 0,
        .flags.output_invert = 0,
    };
    ledc_channel_config(&ledcChannelConfig);

    float duty_num = 0;
    int der = 1;
    while (pdTRUE) {
        ledc_set_duty(LEDC_LOW_SPEED_MODE,LEDC_CHANNEL_0,(int)(8191*(duty_num/200)));
        ledc_update_duty(LEDC_LOW_SPEED_MODE,LEDC_CHANNEL_0);
        if(duty_num  == 200)
            der = 0;
        else if(duty_num  == 0)
            der = 1;
        if (der == 1)
            duty_num +=1;
        else
            duty_num -=1;
        vTaskDelay(10/portTICK_PERIOD_MS);

    }
}

4、编译下载

#编译
idf.py build
#烧录以及查看日志,使用ctrl+] 可以退出监视窗口
idf.py -p /dev/ttyUSB0 flash monitor

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    237

    文章

    22445

    浏览量

    645848
  • PWM
    PWM
    +关注

    关注

    114

    文章

    4897

    浏览量

    209886
  • 定时器
    +关注

    关注

    23

    文章

    3146

    浏览量

    112033
  • 开发板
    +关注

    关注

    25

    文章

    4426

    浏览量

    93940
  • ESP32
    +关注

    关注

    13

    文章

    896

    浏览量

    15806
收藏 人收藏

    评论

    相关推荐

    ESP32开发指南

    - 01 - gpio&ledc&uart零、准备相关资料1、 教程笔记:ESP32开发指南目录(开源一小步出品),这是由“嘉友创科技”发布在CSDN上的教程,我前期准备编译环境的时候也参考了,虽然没起到什么作用。不过后面的章节编写e
    发表于 12-13 06:57

    ESP32的UART驱动程序时其工作流程有哪些

    ESP32的UART驱动程序时其工作流程有哪些?ESP32LEDC控制模块有何功能?
    发表于 01-14 06:21

    请问如何在低速模式下使用LEDC PWM?

    我正在使用 ledc pwm 来控制伺服电机,效果很好。现在我需要控制超过 8 个,我已经检查了 ESP32 数据表,有 16 个通道可以使用,8 个在高速模式下,8 个在低速模式下。但是ledc库现在不支持低速模式,有什么办法
    发表于 03-01 08:24

    请问如何在低速模式下使用LEDC PWM?

    我正在使用 ledc pwm 来控制伺服电机,效果很好。现在我需要控制超过 8 个,我已经检查了 ESP32 数据表,有 16 个通道可以使用,8 个在高速模式下,8 个在低速模式下。但是ledc库现在不支持低速模式,有什么办法
    发表于 04-12 07:58

    ESP32环境搭建以及入门编程_esp32引脚图

    本文主要介绍了ESP32环境搭建以及入门编程及ESP32的引脚图。
    发表于 04-23 11:15 1.3w次阅读
    <b class='flag-5'>ESP32</b>环境搭建以及入门编程_<b class='flag-5'>esp32</b>引脚图

    ESP32模组的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型开发板,集WIFI+蓝牙方案于一体,板上模组绝大部分管脚均已引出,开发人员可根据实际需求,轻松通过跳线连接多种外围器件,或将开发板直接
    发表于 11-04 14:54 3473次阅读

    ESP32开发套件 ESP32-DevKitC

    今天推出的一款套件是来自全球创客届大名鼎鼎的乐鑫科技官方提供的经典ESP32开发套件 - ESP32-DevKitC。 它基于乐鑫ESP32控制器(32-bit MCU 2.4 GHz Wi-Fi
    的头像 发表于 01-06 16:55 7691次阅读

    esp32和arduino的区别,esp32能否替代arduino

    很多创客爱好者甚至有些技术工程师在理解esp32和arduino的时候总是问一句这两块板子哪个更好用?他们可能潜意识中就觉得arduino和esp32是竞品的关系,但实际是这样吗?今天我们就深入
    发表于 06-24 17:11 2.4w次阅读

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在说明如何使用标准的 ESP32-WROOM-32D 开发板进行 SDIO 的通信。本文档适用于所有需要与 ESP32 SDIO slave 通信的方案
    发表于 11-23 17:51 224次下载
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32系列芯片的规格

    ESP32是一款2.4GHz Wi-Fi和蓝牙组合芯片,采用TSMC超低功耗40nm设计技术它旨在实现最佳功率和射频性能,显示出鲁棒性、多功能性和灵活性在各种应用和电源场景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    发表于 04-25 16:21 7次下载

    ESP32 WROVER B/ESP32 WROVER IB技术规格书

    电子发烧友网站提供《ESP32 WROVER B/ESP32 WROVER IB技术规格书.pdf》资料免费下载
    发表于 09-23 14:45 1次下载
    <b class='flag-5'>ESP32</b> WROVER B/<b class='flag-5'>ESP32</b> WROVER IB技术规格书

    ESP32 WROVER/ESP32 WROVER IE技术规格书

    电子发烧友网站提供《ESP32 WROVER/ESP32 WROVER IE技术规格书.pdf》资料免费下载
    发表于 09-23 11:28 5次下载
    <b class='flag-5'>ESP32</b> WROVER/<b class='flag-5'>ESP32</b> WROVER IE技术规格书

    如何使用ESP32LEDC进行PWM控制?

    LEDC(LED控制器)是ESP32中的一个功能强大的PWM(脉冲宽度调制)控制器。
    发表于 05-19 11:14 1937次阅读
    如何使用<b class='flag-5'>ESP32</b>的<b class='flag-5'>LEDC</b>进行PWM控制?

    乐鑫ESP32-MINI-1U参考设计

    乐鑫ESP32-MINI-1U参考设计乐鑫多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安全稳定、高性价比的无线通信SoC,现已发布ESP8266、ESP32
    发表于 10-19 16:13 1次下载

    乐鑫ESP32-MINI-1参考设计

    乐鑫ESP32-MINI-1参考设计乐鑫多年来深耕?AIoT?领域软硬件产品的研发与设计,专注于研发高集成、低功耗、性能卓越、安全稳定、高性价比的无线通信SoC,现已发布ESP8266、ESP32
    发表于 10-19 16:13 12次下载