ESP32C3 LED PWM 控制器

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


概述

LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制。 该控制器有 6 路通道,可以产生独立的波形来驱动 RGB LED 等设备。

LED PWM 控制器可以用于生成六路独立的数字波形,具有如下特性:

  • 波形的周期和占空比可配置,占空比精确度可达 18 位
  • 多种时钟源选择,包括 APB 总线时钟、外置主晶振时钟
  • 可在 Light-sleep 模式下工作
  • 支持硬件自动步进式地增加或减少占空比,可用于 LED RGB 彩色梯度发生器

功能概览

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

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

一、程序编写

1.引入库

代码如下(示例):

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/ledc.h"
#include "esp_err.h"

2.定义宏

代码如下:

#if  CONFIG_IDF_TARGET_ESP32C3

#define LEDC_LS_TIMER          LEDC_TIMER_1
#define LEDC_LS_MODE           LEDC_LOW_SPEED_MODE

#define LEDC_LS_CH0_GPIO       (12)
#define LEDC_LS_CH0_CHANNEL    LEDC_CHANNEL_0
#define LEDC_LS_CH1_GPIO       (13)
#define LEDC_LS_CH1_CHANNEL    LEDC_CHANNEL_1
#endif

#define LEDC_TEST_CH_NUM       (2)
#define LEDC_TEST_DUTY         (4000)
#define LEDC_TEST_FADE_TIME    (3000)

2.主函数

1.定时器配置

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

    //1.定时器配置 指定 PWM 信号的频率和占空比分辨率。
    /*
     * Prepare and set configuration of timers
     * that will be used by LED Controller
     */
    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_LS_MODE,           // timer mode
        .timer_num = LEDC_LS_TIMER,            // timer index
        .clk_cfg = LEDC_AUTO_CLK,              // Auto select the source clock
    };
    ledc_timer_config(&ledc_timer);

频率和占空比分辨率相互关联。PWM 频率越高,占空比分辨率越低,反之亦然。

2. 通道配置

定时器设置好后,请配置所需的通道(ledc_channel_config_t)。配置通道需调用函数 ledc_channel_config()。

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

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

  //2.通道配置 绑定定时器和输出 PWM 信号的 GPIO。
    /*
     * Prepare individual configuration
     * for each channel of LED Controller
     * by selecting:
     * - controller's channel number
     * - output duty cycle, set initially to 0
     * - GPIO number where LED is connected to
     * - speed mode, either high or low
     * - timer servicing selected channel
     *   Note: if different channels use one timer,
     *         then frequency and bit_num of these channels
     *         will be the same
     */
    ledc_channel_config_t ledc_channel[LEDC_TEST_CH_NUM] = {
#if  CONFIG_IDF_TARGET_ESP32C3
        {
            .channel    = LEDC_LS_CH0_CHANNEL,
            .duty       = 0,
            .gpio_num   = LEDC_LS_CH0_GPIO,
            .speed_mode = LEDC_LS_MODE,
            .hpoint     = 0,
            .timer_sel  = LEDC_LS_TIMER
        },
        {
            .channel    = LEDC_LS_CH1_CHANNEL,
            .duty       = 0,
            .gpio_num   = LEDC_LS_CH1_GPIO,
            .speed_mode = LEDC_LS_MODE,
            .hpoint     = 0,
            .timer_sel  = LEDC_LS_TIMER
        },
#endif

    };

    // Set LED Controller with previously prepared configuration
    for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
        ledc_channel_config(&ledc_channel[ch]);
    }

    // Initialize fade service.
    ledc_fade_func_install(0);

3.改变 PWM 信号 输出

3.1 使用硬件渐变改变 PWM 信号

LED PWM 控制器硬件可逐渐改变占空比的数值。要使用此功能,需用函数 ledc_fade_func_install() 使能渐变,之后用下列可用渐变函数之一配置:

  • ledc_set_fade_with_time()
  • ledc_set_fade_with_step()
  • ledc_set_fade()

最后用 ledc_fade_start() 开启渐变。

如不需要渐变和渐变中断,可用函数 ledc_fade_func_uninstall() 关闭。

        for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
           
            ledc_set_fade_with_time(ledc_channel[ch].speed_mode,
                    ledc_channel[ch].channel, LEDC_TEST_DUTY, LEDC_TEST_FADE_TIME);
            ledc_fade_start(ledc_channel[ch].speed_mode,
                    ledc_channel[ch].channel, LEDC_FADE_NO_WAIT);
        }
3.2 使用软件渐变改变 PWM 信号

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

  • ledc_set_duty()
  • ledc_update_duty()
  • ledc_get_duty()
        for (ch = 0; ch < LEDC_TEST_CH_NUM; ch++) {
            ledc_set_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel, LEDC_TEST_DUTY);
            ledc_update_duty(ledc_channel[ch].speed_mode, ledc_channel[ch].channel);
        }

总结

完整例程:https://download.csdn.net/download/tengyihong/85142299

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

藤一泓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值