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

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

3天内不再提示

ESP32C3 LED PWM控制器的使用方法

CHANBAEK 来源: FunIO 作者: FunIO 2023-07-23 11:06 次阅读

目前对于遥控双发差速小飞机计划采用如下架构:

图片

遥控小飞机框图

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

简介

esp32c3 中把 pwm 外设称为“LED PWM 控制器”,共有 6 个通道,可分配到任意 GPIO 管脚:

  • 四个独立定时器,可实现小数分频
  • 波形的周期和占空比可配置,占空比精确度可达 14 位
  • PWM 输出信号相位可调节
  • 可在 Light-sleep 模式下工作
  • 多种时钟源选择,包括 APB 总线时钟、外置主晶振时钟
  • 支持硬件自动步进式地增加或减少占空比,可用于 LED RGB 彩色梯度发生器

占空比自动渐变是一个特色功能,用于呼吸灯或其它 LED 灯效会很方便,在官方文档特意介绍说是 LED PWM 控制器。

使用方法

图片

LED PWM控制器架构

4 个定时器可独立配置(可配置时钟分频器和计数器最大值),每个定时器内部有一个时基计数器(即基于基准时钟周期计数的计数器)。每个 PWM 生成器在四个定时器中择一,以该定时器的计数值为基准生成 PWM 信号。

下图为定时器和 PWM 生成器的主要功能块。

图片

定时器和PWM生成器功能块

LED PWM 控制器的每个定时器内部都有一个时基计数器。上图中时基计数器使用的时钟信号称为ref_pulsex。所有定时器使用同一个时钟源信号LEDC_CLKx,该时钟源信号经分频器分频后产生ref_pulsex供计数器使用。

设置 LEDC 通道分三步完成。注意,与 ESP32 不同,ESP32-C3 仅支持设置通道为低速模式。

  1. 定时器配置,指定 PWM 信号的频率和占空比分辨率。
  2. 通道配置,绑定定时器和输出 PWM 信号的 GPIO。
  3. 改变 PWM 信号,输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。

另一个可选步骤是可以在渐变终端设置一个中断。

图片

LED PWM 控制器 API 的关键配置

首次 LEDC 配置时,最好先配置定时器(调用函数 ledc_timer_config()),再配置通道(调用函数 ledc_channel_config())。这样可以确保 IO 脚上的 PWM 信号自有输出开始其频率就是正确的。

定时器配置

要设置定时器,可调用函数 ledc_timer_config(),并将包括如下配置参数的数据结构 ledc_timer_config_t 传递给该函数:

  • 速度模式(值必须为 LEDC_LOW_SPEED_MODE
  • 定时器索引 ledc_timer_t
  • PWM 信号频率(Hz)
  • PWM 占空比分辨率
  • 时钟源 ledc_clk_cfg_t

频率和占空比分辨率相互关联。PWM 频率越高,占空比分辨率越低,反之亦然。如果 API 不是用来改变 LED 亮度,而是用于其它目的,这种相互关系可能会很重要。时钟源同样可以限制 PWM 频率。选择的时钟源频率越高,可以配置的 PWM 频率上限就越高。

图片
esp32c3 ledc时钟源特性

备注

1.如果 ESP32-C3 的定时器选用了 RC_FAST_CLK 作为其时钟源,驱动会通过内部校准来得知这个时钟源的实际频率。这样确保了输出 PWM 信号频率的精准性。

  1. ESP32-C3 的所有定时器共用一个时钟源。因此 ESP32-C3 不支持给不同的定时器配置不同的时钟源。

当一个定时器不再被任何通道所需要时,可以通过调用相同的函数 ledc_timer_config() 来重置这个定时器。此时,函数入参的配置结构体需要指定:

  • 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 之一)。配置通道需调用函数 ledc_channel_config()

通道的配置与定时器设置类似,需向通道配置函数传递包括通道配置参数的结构体 ledc_channel_config_t

此时,通道会按照 ledc_channel_config_t 的配置开始运作,并在选定的 GPIO 上生成由定时器设置指定的频率和占空比的 PWM 信号。在通道运作过程中,可以随时通过调用函数 ledc_stop() 将其暂停。

改变 PWM 占空比

调用函数 ledc_set_duty() 可以设置新的占空比。之后,调用函数 ledc_update_duty() 使新配置生效。要查看当前设置的占空比,可使用 _get_ 函数 ledc_get_duty()

另外一种设置占空比和其他通道参数的方式是调用 通道配置 一节提到的函数 ledc_channel_config()

传递给函数的占空比数值范围取决于选定的 duty_resolution,应为 0(2 ** duty_resolution) - 1。例如,如选定的占空比分辨率为 10,则占空比的数值范围为 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%占空比

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

    关注

    240

    文章

    22907

    浏览量

    650141
  • 控制器
    +关注

    关注

    112

    文章

    15886

    浏览量

    175389
  • 陀螺仪
    +关注

    关注

    44

    文章

    768

    浏览量

    98190
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5059

    浏览量

    212205
  • 定时器
    +关注

    关注

    23

    文章

    3218

    浏览量

    113688
收藏 人收藏

    评论

    相关推荐

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

    在本教程中,我们将讨论ESP32 开发板的 PWM(脉冲宽度调制)引脚。ESP32 开发板的所有 GPIO 引脚(Power、GND、Tx、Rx 和 EN 除外)均可用于获取 PWM
    的头像 发表于 08-12 15:21 1.6w次阅读
    利用<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的智能家居四路控制器设计

    今天小编给大家带来的是印度的Maker Technolab creation的基于ESP32C3的智能家居四路控制器,该控制器可以通过传统的手动开关按钮、红外遥控、智能手机进行
    的头像 发表于 01-02 10:53 1479次阅读
    基于XIAO <b class='flag-5'>ESP32C3</b>的智能家居四路<b class='flag-5'>控制器</b>设计

    esp32c3项目采用wss_server例程,把wifi断开的话esp32c3会重启,为什么?

    esp32c3项目采用wss_server 例程,运行后连接WiFi正常,但是如果之后把wifi断开的话,esp32c3会重启,监视显示“assert failed: tlsf_free
    发表于 06-06 07:29

    请问ESP32C3怎么作为普通IO口使用?

    请教下ESP32C3怎么作为普通IO口使用?GPIO14~17, 我直接使用配置GPIO的方法都不行,还有哪里需要调整吗?
    发表于 06-17 08:10

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

    你好我想使用esp32c3开发低功耗设备,由外部电子开关控制1小时检测一次传感并上传,考虑到芯片功耗我有几个疑问; 1:esp32c3 在160mhz 80mhz下的正常工作电流是多
    发表于 06-20 06:17

    【DFRobot Beetle ESP32-C3开发板试用体验】WEBSOKET—PWMLED

    本帖最后由 华仔stm32 于 2022-6-1 09:57 编辑 【目的】展示ESP32作为web服务的,用ESP32C3写一个websocket服务,用网页来实现
    发表于 06-01 08:11

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

    你好我想使用esp32c3开发低功耗设备,由外部电子开关控制1小时检测一次传感并上传,考虑到芯片功耗我有几个疑问;1:esp32c3 在160mhz 80mhz下的正常工作电流是多少
    发表于 02-17 06:44

    esp32c3不能操纵RTC引脚而只能保持它们或被唤醒吗?

    我想在存根函数中操作(输入,输出)我的ESP32C3的RTC PINS。但我开始怀疑 esp32c3 是否有能力做到这一点……确实,在功能存根中,我尝试了以下方法但没有成功:[size=150
    发表于 03-02 08:32

    esp32c3不能操纵RTC引脚而只能保持它们或被唤醒吗?

    我想在存根函数中操作(输入,输出)我的ESP32C3的RTC PINS。但我开始怀疑 esp32c3 是否有能力做到这一点……确实,在功能存根中,我尝试了以下方法但没有成功:[size=150
    发表于 04-14 07:30

    深入剖析esp32c3的系统底层启动

    riscv底层的爱好者来说,跳过ESP-IDF框架,直接像使用单片机一样去使用ESP32C3更加有意思。本文的目的就是理解ESP32C3的裸机开发流程,像玩单片机一样去使用这个riscv的mcu。 2.
    的头像 发表于 07-06 10:38 1.2w次阅读
    深入剖析<b class='flag-5'>esp32c3</b>的系统底层启动

    在Arduino IDE环境下用ESP32控制多路LED调光

    ESP32带一个包含16通道LED PWM控制器,可配置以产生不同特性的PWM信号。项目开始之前需要先安装Arduino IDE,连接妥当后
    发表于 03-17 11:04 4292次阅读

    ESP32 LED控制器

    电子发烧友网站提供《ESP32 LED控制器板.zip》资料免费下载
    发表于 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开发板试用体验】WEBSOKET—PWMLED

    的,用ESP32C3写一个websocket服务,用网页来实现控制板载LED灯亮度的例子。 【实现思路】1、ESP32建立webserve
    的头像 发表于 11-28 14:11 1419次阅读
    【DFRobot Beetle <b class='flag-5'>ESP32-C3</b>开发板试用体验】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
    发表于 03-20 11:37 2次下载
    <b class='flag-5'>ESP32</b> <b class='flag-5'>PWM</b>驱动电机

    如何使用ESP32的LEDC进行PWM控制

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