LEDC_PWM

   LED 控制器 (LEDC) 主要用于控制 LED,也可产生 PWM 信号用于其他设备的控制,ESP32C3有 6 路通道。设置 LEDC 通道分三步完成。与 ESP32 不同,ESP32-C3 仅支持设置通道为低速模式。

定时器配置 指定 PWM 信号的频率和占空比分辨率。

通道配置 绑定定时器和输出 PWM 信号的 GPIO。

改变 PWM 信号 输出 PWM 信号来驱动 LED。可通过软件控制或使用硬件渐变功能来改变 LED 的亮度。另一个可选步骤是可以在渐变终端设置一个中断。

1、定时器配置

    设置定时器,可调用函数 ledc_timer_config(),配置参数的数据结构 ledc_timer_config_t 传递给该函数:

速度模式(值必须为 LEDC_LOW_SPEED_MODE)

定时器索引 ledc_timer_t

PWM 信号频率(Hz)

PWM 占空比分辨率

时钟源 ledc_clk_cfg_t

PWM 频率越高,占空比分辨率越低,反之亦然。

官方文档

https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.1/esp32c3/api-reference/peripherals/ledc.html

ESP32-C3 LEDC 时钟源特性

APB_CLK--------80 MHz

RC_FAST_CLK---20 MHz

XTAL_CLK-------40 MHz

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

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

2、通道配置

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

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

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

3、改变 PWM 信号

    通道开始运行、生成具有恒定占空比和频率的 PWM 信号之后,有几种方式可以改变该信号。驱动 LED 时,主要通过改变占空比来变化光线亮度。

在 ESP32-C3 的 LED PWM 控制器中,所有的定时器和通道都只支持低速模式。

(1)使用软件改变 PWM 占空比

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

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

传递给函数的占空比数值范围取决于选定的 duty_resolution,应为 0 至 (2 ** duty_resolution) - 1。例如,如选定的占空比分辨率为 10,则占空比的数值范围为 0 至 1023。此时分辨率为 ~0.1%。

(2)使用硬件改变 PWM 占空比

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

ledc_set_fade_with_time() 在有限的时间内设置LEDC淡入淡出功能

ledc_set_fade_with_step() 设置LEDC淡入淡出功能

ledc_set_fade() 设置LEDC梯度,函数调用ledc_update_duty函数后,函数即可生效。

最后需要调用 ledc_fade_start() 开启渐变,中止一个正在运行中的渐变需要调用函数 ledc_fade_stop()。(此外,在使能渐变后,每个通道都可以额外通过调用 ledc_cb_register() 注册一个回调函数用以获得渐变完成的事件通知。回调函数的原型被定义在 ledc_cb_t。每个回调函数都应当返回一个布尔值给驱动的中断处理函数,用以表示是否有高优先级任务被其唤醒。由于驱动的中断处理函数被放在了 IRAM 中, 回调函数和其调用的函数也需要被放在 IRAM 中。 ledc_cb_register() 会检查回调函数及函数上下文的指针地址是否在正确的存储区域。

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

(3)改变 PWM 频率

    LED PWM 控制器 API 有多种方式即时改变 PWM 频率:调用函数 ledc_set_freq() 设置频率。 ledc_get_freq() 查看当前频率。调用函数 ledc_bind_channel_timer() 将其他定时器绑定到该通道来改变频率和占空比分辨率。

通过调用函数 ledc_channel_config() 改变通道的定时器。

4、程序实现

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "driver/gpio.h"
#include "led_strip.h"
#include "driver/ledc.h"
#include "esp_timer.h"
#include "esp_err.h" /*函数声明*/
void Led_gpio_init(void);
static void ledc_init(void);
void Breath_Blink(void); /*
* @brief LEDC PWM
*
*/
static void ledc_init(void)
{
//LEDC PWM 定时器结构体配置 ledc_timer
ledc_timer_config_t ledc_timer = {
.speed_mode = LEDC_LOW_SPEED_MODE, //定时器模式 低速
.timer_num = LEDC_TIMER_0, //设置定时器源0(0-3)
.duty_resolution = LEDC_TIMER_13_BIT, //将占空比分辨率设置为 13 位 (1-15)
.freq_hz = 1000, //将pwm输出频率设置 1kHz
.clk_cfg = LEDC_AUTO_CLK //配置LEDC时钟源,自动选择
};
ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));//配置LEDC定时器 //LEDC PWM 通道结构体配置 ledc_channel
ledc_channel_config_t ledc_channel = {
.speed_mode = LEDC_LOW_SPEED_MODE,
.channel = LEDC_CHANNEL_0, //通道0
.timer_sel = LEDC_TIMER_0,
.intr_type = LEDC_INTR_DISABLE, //失能LEDC中断
.gpio_num = 12, //输出GPIO12
.duty = 0, //将占空比设置为 0%
.hpoint = 0 //LEDC通道的hpoint,最大值为0xfffff
};
ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));
} /*
* @brief 呼吸效果 渐亮到渐灭
*
*/
void Breath_Blink(void)
{
// 初始化淡入淡出服务
ledc_fade_func_install(0); // 注册LEDC服务,在调用前使用,参数是作为是否允许中断 //参数:指定速度模式 LEDC通道 衰落的目标占空比 衰落的最长时间(ms)
ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL, 8192,500);//在有限的时间内设置LEDC淡入功能
//参数:指定速度模式 LEDC通道 淡入淡出功能
ledc_fade_start(LEDC_MODE,LEDC_CHANNEL, LEDC_FADE_NO_WAIT);//开始LEDC衰落 vTaskDelay(200); ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL, 0,500);
ledc_fade_start(LEDC_MODE,LEDC_CHANNEL, LEDC_FADE_NO_WAIT);
} int main()
{ Led_gpio_init();
ledc_init(); while(1)
{
Breath_Blink();
vTaskDelay(1);//延时10ms,一个时间片
}
}

5、效果

视频:【ESP32C3 LEDC PWM呼吸灯-哔哩哔哩】 https://b23.tv/p3rfUdZ

ESP32C3 LEDC_PWM的更多相关文章

  1. 花10几元买ESP32-C3,体验一下MicroPython (和CircuitPython)

    ESP32是近年很火的国产低成本MCU系列. 买了芯片ESP32-C3的模组安信可 ESP-C3-32S的开发板安信可 NodeMCU ESP-C3-32S-Kit .开发板很小,没有任何多余的东西, ...

  2. 痞子衡嵌入式:盘点国内RISC-V内核MCU厂商

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商. 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量芯片公司崛起 ...

  3. 痞子衡嵌入式:盘点国内RISC-V内核MCU厂商(2020年发布产品)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是国内RISC-V内核MCU厂商(2020). 虽然RISC-V风潮已经吹了好几年,但2019年才是其真正进入主流市场的元年,最近国内大量 ...

  4. Arduino+ESP32 之 驱动GC9A01圆形LCD(一),基于Arduino_GFX库

    最近买了一块圆形屏幕,驱动IC是GC9A01,自己参考淘宝给的stm32的驱动例程, 在ubuntu下使用IDF开发ESP32,也在windows的vscode内安装IDF开发ESP32,虽然都做到了 ...

  5. Arduino+ESP32 之 驱动GC9A01圆形LCD(二),移植LVGL,跑示例程序,显示自制图片

    在前文Arduino+ESP32 之 驱动GC9A01圆形LCD(一), 我们已经移植好了arduino GFX库, 该库的示例程序内,还有LVGL的示例程序哦. arduino环境下移植lvgl是很 ...

  6. esp-idf 安装(Windows )

    esp32的开发有两种环境,分别是 Arduino 和 esp32-idf. Arduino 是在 esp32-idf 基础上进行封装的,虽然使用起来比较方便,但是能自由更改的就变少了,适合新手使用. ...

  7. .NET周报【11月第4期 2022-11-30】

    国内文章 .NET 7 的 AOT 到底能不能扛反编译? https://www.cnblogs.com/huangxincheng/p/16917197.html 在B站,公众号上发了一篇 AOT ...

  8. esp32 开发资料

    开发工具下载 https://dl.espressif.cn/dl/esp-idf/ 设置芯片型号等 Windows 平台工具链的标准设置 - ESP32-C3 - - ESP-IDF 编程指南 la ...

随机推荐

  1. 2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先。

    2022-03-19:已知一棵二叉树上所有的值都不一样, 给定这棵二叉树的头节点head, 给定一个整型数组arr,arr里放着不同的值,每个值一定在树上 返回数组里所有值的最低公共祖先. 答案202 ...

  2. 2022-01-29:连接词。 给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 。 连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串

    2022-01-29:连接词. 给你一个 不含重复 单词的字符串数组 words ,请你找出并返回 words 中的所有 连接词 . 连接词 定义为:一个完全由给定数组中的至少两个较短单词组成的字符串 ...

  3. < Python全景系列-3 > Python控制流程盘点及高级用法、神秘技巧大揭秘!

    欢迎来到我们的系列博客<Python全景系列>!在这个系列中,我们将带领你从Python的基础知识开始,一步步深入到高级话题,帮助你掌握这门强大而灵活的编程语法.无论你是编程新手,还是有一 ...

  4. 使用taro+canvas实现微信小程序的图片分享功能

    业务场景 二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠. ...

  5. [学习笔记]解决因C#8.0的语言特性导致EFCore实体类型映射的错误

    今天下午在排查一个EF问题时,遇到了个很隐蔽的坑,特此记录. 问题 使用ef执行Insert对象到某表时报错,此对象的Address为空: 不能将值 NULL 插入列 'Address',表 'dbo ...

  6. lxml中xpath获取当前节点所有子节点的文本方法

    一.场景还原 现在假定有如下html代码: <div class="content"> <p>输入只有一行半径r.</p> </div&g ...

  7. Charles抓包补充解释

    配置 大佬的博客真的很详细很详细,我就不重复造轮子了,第一次直接看大佬的博客就好,这里Python爬取微信小程序(Charles) 补充解释 在这一步疑问很多,大佬说的不是很详细,就由我来补充下吧~ ...

  8. ODDO之三 :Odoo 13 开发之创建第一个 Odoo 应用

    Odoo 开发通常都需要创建自己的插件模块.本文中我们将通过创建第一个应用来一步步学习如何在 Odoo 中开启和安装这个插件.我们将从基础的开发流学起,即创建和安装新插件,然后在开发迭代中更新代码来进 ...

  9. 曲线艺术编程 coding curves 第三章 弧,圆,椭圆(ARCS, CIRCLES, ELLIPSES)

    第三章 弧,圆,椭圆(TRIG CURVES) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二 ...

  10. WPF入门教程系列二十八 ——DataGrid使用示例MVVM模式(5)

    WPF入门教程系列目录 WPF入门教程系列二--Application介绍 WPF入门教程系列三--Application介绍(续) WPF入门教程系列四--Dispatcher介绍 WPF入门教程系 ...