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. 2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 。返回能走出来的最长的递增链长度。

    2021-05-06:给定一个二维数组matrix, 你可以从任何位置出发,走向上下左右四个方向 .返回能走出来的最长的递增链长度. 福大大 答案2021-05-06: 自然智慧即可. 动态规划.二维 ...

  2. phalApi非常好用的php-api框架

    偶然的一天,在开源中国,找到了phalApi,看到了介绍,我一下子被吸引了,这正是我一直要找的后端生成json的API框架,有了这个造数据的系统,我前端做得更得心应手了,渐渐我有了全栈开发的想法!

  3. 如何借助Kafka持久化存储K8S事件数据?

    大家应该对 Kubernetes Events 并不陌生,特别是当你使用 kubectl describe 命令或 Event API 资源来了解集群中的故障时. $ kubectl get even ...

  4. props传值遇Cannot read property getAttribute of undefined异常

    今有一个echarts 图标的子组件使用watch 监听接受父组件传入的data,而在父组件页面再次根据日期筛选数据,重新传入子组件进行图表重绘时老实会提示报错 vue.runtime.esm.js? ...

  5. StampedLock:高并发场景下一种比读写锁更快的锁

    摘要:在读多写少的环境中,有没有一种比ReadWriteLock更快的锁呢?有,那就是JDK1.8中新增的StampedLock! 本文分享自华为云社区<[高并发]高并发场景下一种比读写锁更快的 ...

  6. Java关键字break、continue 、return的区别,嵌套循环,数组的概念以及数组案例

    一.关键字 break.continue .return的区别 1.break : 用于在switch..case中放置语句块穿透, ​ 用于跳出循环 // 从1-100 遇到7的倍数 break f ...

  7. 读文献先读图——主成分分析 PCA 图

    上周五彩斑斓的气泡图 有让你眼花缭乱吗? 本周,化繁为简的PCA图 你值得拥有!  数据分析| 科研制图﹒PCA 图 关键词:主成分分析.降维 1665 年的鼠疫 牛顿停课在家提出了万有引力 ;183 ...

  8. 【技术积累】Python中的Pandas库【二】

    如何在 Pandas 中进行文本的匹配和替换操作? 在 Pandas 中,使用 str 属性与正则表达式可以进行文本的匹配和替换操作.下面是一些常用的方法: str.contains():判断字符串中 ...

  9. 【后端面经】MySQL主键、唯一索引、联合索引的区别和作用

    目录 0. 简介 1. 主键 2. 唯一索引 3. 联合索引 4. 索引对数据库操作的影响 5. 其他索引 5.1 普通索引 5.2 全文索引 5.3 前缀索引 6. 总结 7. 参考资料 0. 简介 ...

  10. 如何取消Blazor Server烦人的重新连接?

    如何取消Blazor Server烦人的重新连接? 相信很多Blazor的用户在开发内部系统上基本上都选择速度更快,加载更快的Blazor Server模式. 但是Blazor Server由于是Si ...