ESP32C3 LED PWM 控制器

ESP32C3 LED PWM 控制器,第1张

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

文章目录
  • 概述
  • 功能概览
  • 一、程序编写
    • 1.引入库
    • 2.定义宏
    • 2.主函数
      • 1.定时器配置
      • 2. 通道配置
      • 3.改变 PWM 信号 输出
        • 3.1 使用硬件渐变改变 PWM 信号
        • 3.2 使用软件渐变改变 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 
#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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/673279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存