0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

[esp32教程] 4、LEDC使用

板凳說 ? 來源:板凳說 ? 作者:板凳說 ? 2023-06-03 09:39 ? 次閱讀

0、前期準(zhǔn)備

1、參考上一篇文章搭建好esp32環(huán)境

2、準(zhǔn)備好一塊esp32開發(fā)開發(fā)板(本作者使用了esp32c3作為開發(fā)平臺)

1、知識儲備

1.1 概述

? LEDC是樂鑫公司專門開發(fā),通過PWM來控制LED,具有軟件控制占空比以及硬件自動控制占空比的方式。同時據(jù)說也可以用來控制電機。

1.2 功能架構(gòu)

LEDC有4個定時器可以獨立配置,定時器時鐘來源有三個時鐘源,分別是:APB_CLK、RC_FAST_CLK 和 XTAL_CLK。

架構(gòu)圖如下所示:

1.3 LEDC配置流程介紹

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

1、定時器配置:設(shè)置PWM 頻率和占空比分辨率(位數(shù))

2、通道配置:設(shè)置定時器通道以及PWM的輸出引腳

3、 修改占空比

1、定時器配置

定時器的配置主要是給 ledc_timer_config_t 結(jié)構(gòu)體賦值,然后通過ledc_timer_config函數(shù)進(jìn)行對定時器設(shè)置

以下對ledc_timer_config_t 結(jié)構(gòu)體進(jìn)行說明

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以上已經(jīng)使用該參數(shù)
    };
    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 結(jié)構(gòu)體賦值,然后通過ledc_channel_config函數(shù)進(jìn)行通道設(shè)置。

以下對ledc_channel_config_t 結(jié)構(gòu)體進(jìn)行說明

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函數(shù),進(jìn)行中斷注冊,在漸變完成之后,就會調(diào)用中斷函數(shù)
    ledc_timer_t timer_sel;//設(shè)置使用哪一個定時器,需要和ledc_timer_config_t配置的一致
    uint32_t duty;//占空比
    int hpoint;//上升沿出現(xiàn)的位置,一般設(shè)置為0,最大值為0xfffff
    struct {
        unsigned int output_invert: 1;//電平是否翻轉(zhuǎn),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占空比可以通過,軟件和硬件兩個方式進(jìn)行設(shè)置。

軟件方式:主要涉及了ledc_set_duty和ledc_update_duty兩個函數(shù),其中

ledc_set_duty:用來設(shè)置占空比

ledc_update_duty:使設(shè)置生效,

函數(shù)參數(shù)說明如下:

esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty);
//參數(shù):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);
//參數(shù):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幾個函數(shù),其中

ledc_fade_func_install:用來使能硬件,使得硬件能夠改變占空比,

ledc_set_fade_with_step:用于設(shè)置漸變的步長

ledc_set_fade_with_time:用于設(shè)置漸變到某一個值,一般ledc_set_fade_with_step和ledc_set_fade_with_time使用其中一個即可

ledc_fade_start:開始漸變

(注意:ledc_set_fade_with_time和ledc_fade_start不是線程安全的,不要在不同的任務(wù)中同時調(diào)用這些函數(shù)來控制一個ledc通道,API的線程安全版本是ledc_set_fade_step_and_start)

函數(shù)參數(shù)說明如下:

esp_err_t ledc_fade_func_install(int intr_alloc_flags);
//參數(shù):intr_alloc_flags:用于分配中斷的標(biāo)志,一般填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);
// 參數(shù) :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致
//     target_duty: 目標(biāo)占空比,取值范圍: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);
// 參數(shù) :speed_mode:ledc速度模式,要和ledc_channel_config_t的speed_mode保持一致
//     channel:通道,要和ledc_channel_config_t的channel保持一致
//     target_duty: 目標(biāo)占空比,取值范圍:0 ~ (2^duty_resolution) - 1
//     max_fade_time_ms:減到目標(biāo)占空比花費的時間

esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode);
// 參數(shù) :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 # 設(shè)置工程使用的芯片

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+] 可以退出監(jiān)視窗口
idf.py -p /dev/ttyUSB0 flash monitor

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    22907

    瀏覽量

    650121
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5058

    瀏覽量

    212193
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113679
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    4771

    瀏覽量

    96172
  • ESP32
    +關(guān)注

    關(guān)注

    17

    文章

    936

    瀏覽量

    16663
收藏 人收藏

    評論

    相關(guān)推薦

    ESP32-C6的LEDC PWM訊號在light sleep時無法持續(xù)產(chǎn)生是怎么回事?

    我使用IDF里的”ledc_basic” example code,并加入了esp_light_sleep_start()進(jìn)入light sleep。我有參考一些相關(guān)問題的帖子,在進(jìn)入前有設(shè)置了
    發(fā)表于 06-05 07:02

    ESP32 LEDC初始化通道時GPIO會輸出短暫低電平,為什么?

    ESP32LEDC 主要用于 LED 燈的調(diào)光電路. LED 控制電路的驅(qū)動電平有兩種, 高電平驅(qū)動或者低電平驅(qū)動. 通過控制輸出 PWM 的占空比, 可達(dá)到調(diào)光的目的. 今天分享的是如何解
    發(fā)表于 06-26 07:33

    求助,關(guān)于ESP32C3自動light sleep模式下RMT,LEDC, ADC配置問題求解

    開發(fā)環(huán)境: 開發(fā)板:ESP32-C3-DEVKITM-1 IDE: Vscode esp-idf 操作系統(tǒng):win10 IDF 版本:5.1.1 使用自動light sleep模式時,RMT
    發(fā)表于 07-19 06:36

    ESP32模組的主要特性

    WT-ESP32-DevKitC V4是一款基于ESP32的小型開發(fā)板,集WIFI+藍(lán)牙方案于一體,板上模組絕大部分管腳均已引出,開發(fā)人員可根據(jù)實際需求,輕松通過跳線連接多種外圍器件,或?qū)㈤_發(fā)板直接
    發(fā)表于 11-04 14:54 ?3786次閱讀

    ESP32開發(fā)套件 ESP32-DevKitC

    ,具備豐富的外設(shè)和優(yōu)化的引腳布局,助力用戶快速實現(xiàn)產(chǎn)品開發(fā),它有4MB Flash,有I/O,USB以及按鍵、LED ? 支持 Wi-Fi 藍(lán)牙連接 ESP32-DevKitC 是一款基于 ESP32
    的頭像 發(fā)表于 01-06 16:55 ?8137次閱讀

    esp32和arduino的區(qū)別,esp32能否替代arduino

    很多創(chuàng)客愛好者甚至有些技術(shù)工程師在理解esp32和arduino的時候總是問一句這兩塊板子哪個更好用?他們可能潛意識中就覺得arduino和esp32是競品的關(guān)系,但實際是這樣嗎?今天我們就深入
    發(fā)表于 06-24 17:11 ?2.6w次閱讀

    ESP32驅(qū)動0.96寸彩屏

    繼上次的ESP324寸彩屏的應(yīng)用外,還有哪些規(guī)格的彩屏同樣可以被ESP32驅(qū)動呢?沒錯,0.96寸的彩屏同樣可以!
    發(fā)表于 06-07 17:14 ?2488次閱讀

    ESP32 開發(fā)之旅② Arduino For ESP32說明

    文章目錄1. Arduino Core For ESP32是什么?2.Arduino core for ESP32庫3.與ESP8266庫類比3.1 WiFi —— ESP
    發(fā)表于 11-13 19:51 ?33次下載
    <b class='flag-5'>ESP32</b> 開發(fā)之旅② Arduino For <b class='flag-5'>ESP32</b>說明

    ESP32 SDIO 使用教程

    ESP32 SDIO 使用教程本文旨在說明如何使用標(biāo)準(zhǔn)的 ESP32-WROOM-32D 開發(fā)板進(jìn)行 SDIO 的通信。本文檔適用于所有需要與 ESP32 SDIO slave 通信的方案
    發(fā)表于 11-23 17:51 ?233次下載
    <b class='flag-5'>ESP32</b> SDIO 使用教程

    ESP32系列芯片的規(guī)格

    ESP32是一款2.4GHz Wi-Fi和藍(lán)牙組合芯片,采用TSMC超低功耗40nm設(shè)計技術(shù)它旨在實現(xiàn)最佳功率和射頻性能,顯示出魯棒性、多功能性和靈活性在各種應(yīng)用和電源場景中的可靠性。ESP32系列芯片包括ESP32-D0WDQ
    發(fā)表于 04-25 16:21 ?7次下載

    ESP32 PWM驅(qū)動電機

    18 PWM控制B電機 4 A1 15 A2 17 B1 5 B2PWM控制電機方法參考—— PWM如何控制直流電機 驅(qū)動芯片TB6612FNG ESP32使用PWM frommachineimportP
    發(fā)表于 03-20 11:37 ?2次下載
    <b class='flag-5'>ESP32</b> PWM驅(qū)動電機

    如何使用ESP32LEDC進(jìn)行PWM控制?

    LEDC(LED控制器)是ESP32中的一個功能強大的PWM(脈沖寬度調(diào)制)控制器。
    發(fā)表于 05-19 11:14 ?2273次閱讀
    如何使用<b class='flag-5'>ESP32</b>的<b class='flag-5'>LEDC</b>進(jìn)行PWM控制?

    ESP32ESP32通過Internet進(jìn)行通信

    電子發(fā)燒友網(wǎng)站提供《ESP32ESP32通過Internet進(jìn)行通信.zip》資料免費下載
    發(fā)表于 06-15 09:58 ?4次下載
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通過Internet進(jìn)行通信

    ESP32-PICO系列技術(shù)規(guī)格書

    ESP32-PICO 系列是基于 ESP32 芯片 的系統(tǒng)級封裝 (SiP) 產(chǎn)品。ESP32-PICO 系列產(chǎn)品包括 ESP32-PICO-D4、
    發(fā)表于 12-12 16:56 ?0次下載
    <b class='flag-5'>ESP32</b>-PICO系列技術(shù)規(guī)格書

    樂鑫科技發(fā)布全新ESP32-H4 SoC

    樂鑫信息科技最新發(fā)布了ESP32-H4,這一創(chuàng)新產(chǎn)品是對其ESP32-H2系列的完美補充,進(jìn)一步鞏固了公司在802.15.4和Bluetooth LE領(lǐng)域的產(chǎn)品布局。ESP32-H4作為新一代SoC
    的頭像 發(fā)表于 05-06 15:18 ?706次閱讀