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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

ESP32C3 LED PWM控制器的使用方法

CHANBAEK ? 來源: FunIO ? 作者: FunIO ? 2023-07-23 11:06 ? 次閱讀

目前對于遙控雙發(fā)差速小飛機計劃采用如下架構:

圖片

遙控小飛機框圖

馬達控制要用到 pwm,今天把 esp32c3 的 pwm 跑一下。

簡介

esp32c3 中把 pwm 外設稱為“LED PWM 控制器”,共有 6 個通道,可分配到任意 GPIO 管腳:

  • 四個獨立定時器,可實現(xiàn)小數(shù)分頻
  • 波形的周期和占空比可配置,占空比精確度可達 14 位
  • PWM 輸出信號相位可調(diào)節(jié)
  • 可在 Light-sleep 模式下工作
  • 多種時鐘源選擇,包括 APB 總線時鐘、外置主晶振時鐘
  • 支持硬件自動步進式地增加或減少占空比,可用于 LED RGB 彩色梯度發(fā)生器

占空比自動漸變是一個特色功能,用于呼吸燈或其它 LED 燈效會很方便,在官方文檔特意介紹說是 LED PWM 控制器。

使用方法

圖片

LED PWM控制器架構

4 個定時器可獨立配置(可配置時鐘分頻器和計數(shù)器最大值),每個定時器內(nèi)部有一個時基計數(shù)器(即基于基準時鐘周期計數(shù)的計數(shù)器)。每個 PWM 生成器在四個定時器中擇一,以該定時器的計數(shù)值為基準生成 PWM 信號。

下圖為定時器和 PWM 生成器的主要功能塊。

圖片

定時器和PWM生成器功能塊

LED PWM 控制器的每個定時器內(nèi)部都有一個時基計數(shù)器。上圖中時基計數(shù)器使用的時鐘信號稱為ref_pulsex。所有定時器使用同一個時鐘源信號LEDC_CLKx,該時鐘源信號經(jīng)分頻器分頻后產(chǎn)生ref_pulsex供計數(shù)器使用。

設置 LEDC 通道分三步完成。注意,與 ESP32 不同,ESP32-C3 僅支持設置通道為低速模式。

  1. 定時器配置,指定 PWM 信號的頻率和占空比分辨率。
  2. 通道配置,綁定定時器和輸出 PWM 信號的 GPIO。
  3. 改變 PWM 信號,輸出 PWM 信號來驅動 LED??赏ㄟ^軟件控制或使用硬件漸變功能來改變 LED 的亮度。

另一個可選步驟是可以在漸變終端設置一個中斷。

圖片

LED PWM 控制器 API 的關鍵配置

首次 LEDC 配置時,最好先配置定時器(調(diào)用函數(shù) ledc_timer_config()),再配置通道(調(diào)用函數(shù) ledc_channel_config())。這樣可以確保 IO 腳上的 PWM 信號自有輸出開始其頻率就是正確的。

定時器配置

要設置定時器,可調(diào)用函數(shù) ledc_timer_config(),并將包括如下配置參數(shù)的數(shù)據(jù)結構 ledc_timer_config_t 傳遞給該函數(shù):

  • 速度模式(值必須為 LEDC_LOW_SPEED_MODE
  • 定時器索引 ledc_timer_t
  • PWM 信號頻率(Hz)
  • PWM 占空比分辨率
  • 時鐘源 ledc_clk_cfg_t

頻率和占空比分辨率相互關聯(lián)。PWM 頻率越高,占空比分辨率越低,反之亦然。如果 API 不是用來改變 LED 亮度,而是用于其它目的,這種相互關系可能會很重要。時鐘源同樣可以限制 PWM 頻率。選擇的時鐘源頻率越高,可以配置的 PWM 頻率上限就越高。

圖片
esp32c3 ledc時鐘源特性

備注

1.如果 ESP32-C3 的定時器選用了 RC_FAST_CLK 作為其時鐘源,驅動會通過內(nèi)部校準來得知這個時鐘源的實際頻率。這樣確保了輸出 PWM 信號頻率的精準性。

  1. ESP32-C3 的所有定時器共用一個時鐘源。因此 ESP32-C3 不支持給不同的定時器配置不同的時鐘源。

當一個定時器不再被任何通道所需要時,可以通過調(diào)用相同的函數(shù) ledc_timer_config() 來重置這個定時器。此時,函數(shù)入?yún)⒌呐渲媒Y構體需要指定:

  • ledc_timer_config_t::speed_mode 重置定時器的所屬速度模式 (ledc_mode_t
  • ledc_timer_config_t::timer_num 重置定時器的索引 (ledc_timer_t
  • ledc_timer_config_t::deconfigure 將指定定時器重置必須配置此項為 true

通道配置

定時器設置好后,請配置所需的通道(ledc_channel_t 之一)。配置通道需調(diào)用函數(shù) ledc_channel_config()

通道的配置與定時器設置類似,需向通道配置函數(shù)傳遞包括通道配置參數(shù)的結構體 ledc_channel_config_t

此時,通道會按照 ledc_channel_config_t 的配置開始運作,并在選定的 GPIO 上生成由定時器設置指定的頻率和占空比的 PWM 信號。在通道運作過程中,可以隨時通過調(diào)用函數(shù) ledc_stop() 將其暫停。

改變 PWM 占空比

調(diào)用函數(shù) ledc_set_duty() 可以設置新的占空比。之后,調(diào)用函數(shù) ledc_update_duty() 使新配置生效。要查看當前設置的占空比,可使用 _get_ 函數(shù) ledc_get_duty()。

另外一種設置占空比和其他通道參數(shù)的方式是調(diào)用 通道配置 一節(jié)提到的函數(shù) ledc_channel_config()。

傳遞給函數(shù)的占空比數(shù)值范圍取決于選定的 duty_resolution,應為 0(2 ** duty_resolution) - 1。例如,如選定的占空比分辨率為 10,則占空比的數(shù)值范圍為 01023。此時分辨率為 ~0.1%。

圖片
常用配置頻率及精度

實例

/* LEDC (LED Controller) basic example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include < stdio.h >
#include "driver/ledc.h"
#include "esp_err.h"

#define LEDC_OUTPUT_IO          (5) // Define the output GPIO
#define LEDC_DUTY               (4095) // Set duty to 50%. ((2 ** 13) - 1) * 50% = 4095
#define LEDC_FREQUENCY          (5000) // Frequency in Hertz. Set frequency at 5 kHz

static void example_ledc_init(void)
{
    // Prepare and then apply the LEDC PWM timer configuration
    ledc_timer_config_t ledc_timer = {
        .speed_mode       = LEDC_LOW_SPEED_MODE,
        .timer_num        = LEDC_TIMER_0,
        .duty_resolution  = LEDC_TIMER_13_BIT,
        .freq_hz          = LEDC_FREQUENCY,  // Set output frequency at 5 kHz
        .clk_cfg          = LEDC_AUTO_CLK
    };
    ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));

    // Prepare and then apply the LEDC PWM channel configuration
    ledc_channel_config_t ledc_channel = {
        .speed_mode     = LEDC_LOW_SPEED_MODE,
        .channel        = LEDC_CHANNEL_0,
        .timer_sel      = LEDC_TIMER_0,
        .intr_type      = LEDC_INTR_DISABLE,
        .gpio_num       = LEDC_OUTPUT_IO,
        .duty           = 0, // Set duty to 0%
        .hpoint         = 0
    };
    ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
}

void app_main(void)
{
    // Set the LEDC peripheral configuration
    example_ledc_init();
    // Set duty to 50%
    ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY));
    // Update duty to apply the new value
    ESP_ERROR_CHECK(ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0));
}

編譯后運行,捕捉如下波形:

圖片

5kHz 50%占空比

修改下占空比:

ESP_ERROR_CHECK(ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, LEDC_DUTY-400));

編譯后運行,捕捉如下波形:

圖片

5kHz 45.1%占空比

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

    關注

    242

    文章

    23320

    瀏覽量

    661855
  • 控制器
    +關注

    關注

    112

    文章

    16412

    瀏覽量

    178721
  • 陀螺儀
    +關注

    關注

    44

    文章

    787

    瀏覽量

    98816
  • PWM
    PWM
    +關注

    關注

    114

    文章

    5194

    瀏覽量

    214347
  • 定時器
    +關注

    關注

    23

    文章

    3253

    瀏覽量

    115067
收藏 人收藏

    評論

    相關推薦

    利用ESP32 PWM信號控制LED的亮度

    在本教程中,我們將討論ESP32 開發(fā)板的 PWM(脈沖寬度調(diào)制)引腳。ESP32 開發(fā)板的所有 GPIO 引腳(Power、GND、Tx、Rx 和 EN 除外)均可用于獲取 PWM
    的頭像 發(fā)表于 08-12 15:21 ?1.7w次閱讀
    利用<b class='flag-5'>ESP32</b> <b class='flag-5'>PWM</b>信號<b class='flag-5'>控制</b><b class='flag-5'>LED</b>的亮度

    基于XIAO ESP32C3的智能家居四路控制器設計

    今天小編給大家?guī)淼氖怯《鹊腗aker Technolab creation的基于ESP32C3的智能家居四路控制器,該控制器可以通過傳統(tǒng)的手動開關按鈕、紅外遙控、智能手機進行
    的頭像 發(fā)表于 01-02 10:53 ?1790次閱讀
    基于XIAO <b class='flag-5'>ESP32C3</b>的智能家居四路<b class='flag-5'>控制器</b>設計

    esp32c3項目采用wss_server例程,把wifi斷開的話esp32c3會重啟,為什么?

    esp32c3項目采用wss_server 例程,運行后連接WiFi正常,但是如果之后把wifi斷開的話,esp32c3會重啟,監(jiān)視顯示“assert failed: tlsf_free
    發(fā)表于 06-06 07:29

    請問ESP32C3怎么作為普通IO口使用?

    請教下ESP32C3怎么作為普通IO口使用?GPIO14~17, 我直接使用配置GPIO的方法都不行,還有哪里需要調(diào)整嗎?
    發(fā)表于 06-17 08:10

    esp32c3是否能在40mhz運行,功耗是多少?

    你好我想使用esp32c3開發(fā)低功耗設備,由外部電子開關控制1小時檢測一次傳感并上傳,考慮到芯片功耗我有幾個疑問; 1:esp32c3 在160mhz 80mhz下的正常工作電流是多
    發(fā)表于 06-20 06:17

    【DFRobot Beetle ESP32-C3開發(fā)板試用體驗】WEBSOKET—PWMLED

    本帖最后由 華仔stm32 于 2022-6-1 09:57 編輯 【目的】展示ESP32作為web服務的,用ESP32C3寫一個websocket服務,用網(wǎng)頁來實現(xiàn)
    發(fā)表于 06-01 08:11

    esp32c3連接wifi和tcp服務速度能否加快,esp8266 速度在5-7s左右,esp32c3能否加快?

    你好我想使用esp32c3開發(fā)低功耗設備,由外部電子開關控制1小時檢測一次傳感并上傳,考慮到芯片功耗我有幾個疑問;1:esp32c3 在160mhz 80mhz下的正常工作電流是多少
    發(fā)表于 02-17 06:44

    esp32c3不能操縱RTC引腳而只能保持它們或被喚醒嗎?

    我想在存根函數(shù)中操作(輸入,輸出)我的ESP32C3的RTC PINS。但我開始懷疑 esp32c3 是否有能力做到這一點……確實,在功能存根中,我嘗試了以下方法但沒有成功:[size=150
    發(fā)表于 03-02 08:32

    esp32c3不能操縱RTC引腳而只能保持它們或被喚醒嗎?

    我想在存根函數(shù)中操作(輸入,輸出)我的ESP32C3的RTC PINS。但我開始懷疑 esp32c3 是否有能力做到這一點……確實,在功能存根中,我嘗試了以下方法但沒有成功:[size=150
    發(fā)表于 04-14 07:30

    深入剖析esp32c3的系統(tǒng)底層啟動

    riscv底層的愛好者來說,跳過ESP-IDF框架,直接像使用單片機一樣去使用ESP32C3更加有意思。本文的目的就是理解ESP32C3的裸機開發(fā)流程,像玩單片機一樣去使用這個riscv的mcu。 2.
    的頭像 發(fā)表于 07-06 10:38 ?1.3w次閱讀
    深入剖析<b class='flag-5'>esp32c3</b>的系統(tǒng)底層啟動

    在Arduino IDE環(huán)境下用ESP32控制多路LED調(diào)光

    ESP32帶一個包含16通道LED PWM控制器,可配置以產(chǎn)生不同特性的PWM信號。項目開始之前需要先安裝Arduino IDE,連接妥當后
    發(fā)表于 03-17 11:04 ?4663次閱讀

    ESP32 LED控制器

    電子發(fā)燒友網(wǎng)站提供《ESP32 LED控制器板.zip》資料免費下載
    發(fā)表于 08-05 11:41 ?3次下載
    <b class='flag-5'>ESP32</b> <b class='flag-5'>LED</b><b class='flag-5'>控制器</b>板

    【DFRobot Beetle ESP32-C3開發(fā)板試用體驗】WEBSOKET—PWMLED

    的,用ESP32C3寫一個websocket服務,用網(wǎng)頁來實現(xiàn)控制板載LED燈亮度的例子。 【實現(xiàn)思路】1、ESP32建立webserve
    的頭像 發(fā)表于 11-28 14:11 ?1602次閱讀
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>開發(fā)板試用體驗】WEBSOKET—<b class='flag-5'>PWM</b>—<b class='flag-5'>LED</b>

    ESP32 PWM驅動電機

    18 PWM控制B電機 4 A1 15 A2 17 B1 5 B2PWM控制電機方法參考—— PWM
    發(fā)表于 03-20 11:37 ?4次下載
    <b class='flag-5'>ESP32</b> <b class='flag-5'>PWM</b>驅動電機

    如何使用ESP32的LEDC進行PWM控制?

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