idf-esp32 PWM呼吸灯(LEDC头文件)

相关宏和变量

#define LED_PIN         GPIO_NUM_3
#define LEDC_CHANNEL    LEDC_CHANNEL_0
#define LEDC_TIMER      LEDC_TIMER_0
#define LEDC_MODE       LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES   LEDC_TIMER_13_BIT  // 2^13 = 8192级亮度
#define LEDC_FREQUENCY  5000              // 5kHz频率//呼吸灯效果
int direction = 1;  // 1: 渐亮, -1: 渐暗
int duty = 0;

1.通过ledc_timer_config_t配置PWM参数

下面是结构体源码

/*** @brief Configuration parameters of LEDC timer for ledc_timer_config function*/
typedef struct {ledc_mode_t speed_mode;                /*!< LEDC speed speed_mode, high-speed mode (only exists on esp32) or low-speed mode */ledc_timer_bit_t duty_resolution;      /*!< LEDC channel duty resolution */ledc_timer_t  timer_num;               /*!< The timer source of channel (0 - LEDC_TIMER_MAX-1) */uint32_t freq_hz;                      /*!< LEDC timer frequency (Hz) */ledc_clk_cfg_t clk_cfg;                /*!< Configure LEDC source clock from ledc_clk_cfg_t.Note that LEDC_USE_RC_FAST_CLK and LEDC_USE_XTAL_CLK arenon-timer-specific clock sources. You can not have one LEDC timer usesRC_FAST_CLK as the clock source and have another LEDC timer uses XTAL_CLKas its clock source. All chips except esp32 and esp32s2 do not havetimer-specific clock sources, which means clock source for all timersmust be the same one. */bool deconfigure;                      /*!< Set this field to de-configure a LEDC timer which has been configured beforeNote that it will not check whether the timer wants to be de-configuredis binded to any channel. Also, the timer has to be paused first beforeit can be de-configured.When this field is set, duty_resolution, freq_hz, clk_cfg fields are ignored. */
} ledc_timer_config_t;

下面是配置

    // 定义 LEDC 定时器配置结构体,用于设置 PWM 信号的“时间基准”(频率、精度等)ledc_timer_config_t ledc_timer = {.speed_mode = LEDC_MODE,          // LEDC 工作模式(如 LEDC_LOW_SPEED_MODE/LEDC_HIGH_SPEED_MODE)// 低速模式适合普通 GPIO,高速模式需配合特定引脚,由宏定义指定.duty_resolution = LEDC_DUTY_RES, // PWM 占空比分辨率(单位:bit)// 例:若设为 13bit,占空比范围是 0~2^13-1=8191(数值越大精度越高).timer_num = LEDC_TIMER,          // 选择 LEDC 定时器编号(如 LEDC_TIMER_0 ~ LEDC_TIMER_3)// 每个定时器可对应多个通道,实现多路 PWM 输出.freq_hz = LEDC_FREQUENCY,        // PWM 信号的频率(单位:Hz)// 例:设为 500Hz,即 PWM 周期为 2ms,人眼无闪烁感.clk_cfg = LEDC_AUTO_CLK,         // LEDC 时钟源选择(LEDC_AUTO_CLK 表示自动选择最优时钟源)// 也可手动指定(如 LEDC_USE_APB_CLK),自动模式更便捷};// 调用 API 将配置参数写入 LEDC 定时器硬件寄存器,完成定时器初始化ledc_timer_config(&ledc_timer);

2.通过ledc_channel_config_t配置PWM通道

结构体源码

/*** @brief Configuration parameters of LEDC channel for ledc_channel_config function*/
typedef struct {int gpio_num;                   /*!< the LEDC output gpio_num, if you want to use gpio16, gpio_num = 16 */ledc_mode_t speed_mode;         /*!< LEDC speed speed_mode, high-speed mode (only exists on esp32) or low-speed mode */ledc_channel_t channel;         /*!< LEDC channel (0 - LEDC_CHANNEL_MAX-1) */ledc_intr_type_t intr_type;     /*!< configure interrupt, Fade interrupt enable  or Fade interrupt disable */ledc_timer_t timer_sel;         /*!< Select the timer source of channel (0 - LEDC_TIMER_MAX-1) */uint32_t duty;                  /*!< LEDC channel duty, the range of duty setting is [0, (2**duty_resolution)] */int hpoint;                     /*!< LEDC channel hpoint value, the range is [0, (2**duty_resolution)-1] */ledc_sleep_mode_t sleep_mode;   /*!< choose the desired behavior for the LEDC channel in Light-sleep */struct {unsigned int output_invert: 1;/*!< Enable (1) or disable (0) gpio output invert */} flags;                        /*!< LEDC flags */} ledc_channel_config_t;

配置

    // 定义 LEDC 通道配置结构体,用于将“定时器生成的时钟”与“具体 GPIO 引脚”绑定,输出 PWM 信号ledc_channel_config_t ledc_channel = {.speed_mode = LEDC_MODE,          // 必须与定时器的工作模式一致(低速/高速模式需匹配).channel = LEDC_CHANNEL,          // 选择 LEDC 通道编号(如 LEDC_CHANNEL_0 ~ LEDC_CHANNEL_7)// 一个定时器可对应多个通道,实现“同一频率、不同占空比”的多路 PWM.timer_sel = LEDC_TIMER,          // 绑定的定时器编号(需与上方配置的 LEDC_TIMER 一致)// 表示该通道使用此定时器生成的 PWM 基准时钟.intr_type = LEDC_INTR_DISABLE,   // 中断使能配置(LEDC_INTR_DISABLE 表示禁用中断)// 若需占空比更新完成后触发中断,可设为 LEDC_INTR_ENABLE.gpio_num = LED_PIN,              // 输出 PWM 信号的 GPIO 引脚(如 GPIO_NUM_2)// 需确保该引脚支持 LEDC 功能(参考芯片手册的引脚功能表).duty = 0,                        // 初始占空比(需与定时器分辨率匹配,此处初始为 0,LED 熄灭)// 例:分辨率 13bit 时,0 表示占空比 0%(全灭),8191 表示 100%(全亮).hpoint = 0                       // PWM 高电平起始点(单位:定时器计数周期)// 默认为 0,即定时器计数从 0 开始时输出高电平,无需特殊调整};// 调用 API 将配置参数写入 LEDC 通道硬件寄存器,完成通道初始化(此时 GPIO 已开始输出 PWM)ledc_channel_config(&ledc_channel);

实现

    while (1) {  ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, duty);ledc_update_duty(LEDC_MODE, LEDC_CHANNEL);duty += direction * 100;if (duty >= 8191) { duty = 8191;     direction = -1; }else if (duty <= 0) { duty = 0;        direction = 1;   }vTaskDelay(10 / portTICK_PERIOD_MS);}

流程

一:先配置目标PWM的参数

二:然后配置定时器的PWM输出到哪个引脚

三:编写呼吸灯的渐变

四:实现

#include <stdio.h>
#include "driver/ledc.h"
#include "esp_log.h"// 硬件配置定义
#define LED_PIN         GPIO_NUM_3
#define LEDC_CHANNEL    LEDC_CHANNEL_0
#define LEDC_TIMER      LEDC_TIMER_0
#define LEDC_MODE       LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES   LEDC_TIMER_13_BIT  // 2^13 = 8192级亮度
#define LEDC_FREQUENCY  5000               // 5kHz频率static const char *TAG = "BREATHE_LED";/*** @brief 应用程序入口*/
void app_main(void)
{printf("ESP32 Breathe LED Demo Started!\n");printf("LED Pin: GPIO %d\n", LED_PIN);printf("PWM Frequency: %d Hz\n", LEDC_FREQUENCY);printf("PWM Resolution: 13-bit (0-8191)\n");// -------------------------- 1. 配置 LEDC 定时器 ---------------------------ledc_timer_config_t ledc_timer = {.speed_mode = LEDC_MODE,.duty_resolution = LEDC_DUTY_RES,.timer_num = LEDC_TIMER,.freq_hz = LEDC_FREQUENCY,.clk_cfg = LEDC_AUTO_CLK,};ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer));// -------------------------- 2. 配置 LEDC 通道 ---------------------------ledc_channel_config_t ledc_channel = {.speed_mode = LEDC_MODE,.channel = LEDC_CHANNEL,.timer_sel = LEDC_TIMER,.intr_type = LEDC_INTR_DISABLE,.gpio_num = LED_PIN,.duty = 0,.hpoint = 0};ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel));ESP_LOGI(TAG, "Breathe LED initialized on GPIO %d", LED_PIN);// 呼吸灯变量int direction = 1;  // 1: 渐亮, -1: 渐暗int duty = 0;// -------------------------- 3. 呼吸灯主循环 ---------------------------while (1) {// 设置占空比并立即生效(推荐使用这个函数)ESP_ERROR_CHECK(ledc_set_duty_and_update(LEDC_MODE, LEDC_CHANNEL, duty, 0));// 调整占空比duty += direction * 100;// 边界检查if (duty >= 8191) {duty = 8191;direction = -1;printf("Reached maximum brightness, starting to fade out...\n");} else if (duty <= 0) {duty = 0;direction = 1;printf("Reached minimum brightness, starting to fade in...\n");}// 简单的延时(使用空循环实现,不依赖FreeRTOS)// 注意:这种方法会阻塞CPU,在实际应用中建议使用vTaskDelayfor (volatile int i = 0; i < 10000; i++) {// 空循环延时}}
}

说明

esp32的ledc库专门负责PWM信号的生成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98309.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PLC_博图系列☞基本指令”S_ODTS:分配保持型接通延时定时器参数并启动“

PLC_博图系列☞基本指令”S_ODTS&#xff1a;分配保持型接通延时定时器参数并启动“ 文章目录PLC_博图系列☞基本指令”S_ODTS&#xff1a;分配保持型接通延时定时器参数并启动“背景介绍S_ODTS&#xff1a; 分配保持型接通延时定时器参数并启动说明参数脉冲时序图示例关键字&a…

OneCode 可视化揭秘系列(三):AI MCP驱动的智能工作流逻辑编排

OneCode 可视化揭秘系列&#xff08;三&#xff09;&#xff1a;AI MCP驱动的智能工作流逻辑编排 引言 在前两篇系列博文中&#xff0c;我们详细探讨了OneCode可视化动作的基础配置与界面设计&#xff0c;以及组件交互与数据流管理。在本篇文章中&#xff0c;我们将深入剖析逻辑…

TypeORM、Sequelize、Hibernate 的优缺点对比:新手常见 SQL 与 ORM 踩坑总结

1. ORM 与关系型数据库&#xff08;MySQL、PostgreSQL&#xff09; 的使用 SQL 语句编写&#xff08;JOIN、GROUP BY、索引使用、事务控制&#xff09;与 ORM 映射&#xff08;如 Sequelize、TypeORM、Hibernate&#xff09;之间的差异会让新手非常纠结&#xff1b;尤其是理解…

JavaScript 创建型设计模式详解

1. 单例模式1.1. 使用场景在前端开发中&#xff0c;全局状态管理、配置信息、数据库连接等往往需要在应用中只存在一个实例&#xff0c;避免多次实例化带来的数据不一致性。例如&#xff0c;在一个前端应用中&#xff0c;全局的 loading 状态通常需要一个单例模式来确保其唯一性…

k8s除了主server服务器可正常使用kubectl命令,其他节点不能使用原因,以及如何在其他k8s节点正常使用kubectl命令??

kubectl 并不是“只能”在主节点&#xff08;Control Plane Node&#xff09;使用&#xff0c;而是因为它需要访问 Kubernetes 的 kube-apiserver&#xff0c;而 kube-apiserver 通常只在主节点上运行并监听内部网络。简单来说kubectl 需要连接 kube-apiserver&#xff01;&…

Custom SRP - Complex Maps

https://catlikecoding.com/unity/tutorials/custom-srp/complex-maps/1 创建材质球我们的材质已经支持光照,并且支持 Albedo 和 Emission 贴图.创建材质球,并应用下面的电路板的图分别作为 albedo emission设置材质球的金属度为 1 , 光滑度为 0.952 Mask Map在 albedo 图上的不…

repo 学习教程

你现在会用 git 了&#xff0c;接下来学 repo&#xff08;Google 推出来的多仓库管理工具&#xff09;&#xff0c;其实就是在 Git 的基础上做了一层封装&#xff0c;方便同时管理很多 Git 仓库。像 Android 源码、Rockchip 全套 SDK 都是靠 repo 来拉取和管理的。 我给你分几个…

[SWERC 2020] Safe Distance题解

[SWERC 2020] Safe Distance 题意 给定 NNN 个点与一个坐标 (X,Y)(X,Y)(X,Y)&#xff0c;求从点 (0,0)(0,0)(0,0) 到点 (X,Y)(X,Y)(X,Y) 规划一条路线&#xff0c;不能走出 (0,0)(0,0)(0,0) 与 (X,Y)(X,Y)(X,Y) 间形成的矩形&#xff0c;使得通过这条路线时距离最近的点的距离…

Rewind-你人生的搜索引擎

本文转载自&#xff1a;Rewind-你人生的搜索引擎 - Hello123工具导航 ** 一、&#x1f50d; Rewind 是什么&#xff1f;你的数字记忆增强神器 Rewind 是一款人工智能驱动的个人记忆助手&#xff0c;就像为你配备了一个「数字第二大脑」。它能自动记录、保存并索引你在电脑和手…

开发小点 - 存

开发小点 1.Req注解 EqualsAndHashCode(callSuper true) Data public class BillSituationReq extends BillQueryReq {/*** Whether to display the ring ratio, default is not displayed*/ApiModelProperty("Whether to Display YoY Comparison")private Boolean …

只会npm install?这5个隐藏技巧让你效率翻倍!

原文链接&#xff1a;https://mp.weixin.qq.com/s/nijxVWj-E5U08DX2fl3vgg最近有个刚学前端的小伙伴问我&#xff1a;“为什么我的node_modules这么大&#xff1f;为什么别人装依赖那么快&#xff1f;npx到底是啥玩意儿&#xff1f;” 相信不少人都跟他一样&#xff0c;对npm的…

(二).net面试(static)

文章目录项目地址一、基础501.1 new keyword1.2 static class vs. static method1. static class2. static method3. static constructor 静态构造函数4. 静态成员的生命周期1.3 LinQ1.what is LinQ2. List<T>、IEnumerable<T>、IQueryable<T>3. 在数据库里用…

docker,本地目录挂载

理解Docker本地目录挂载的基本概念Docker本地目录挂载允许容器与宿主机共享文件或目录&#xff0c;实现数据持久化和实时交互。挂载方式分为bind mount和volume两种&#xff0c;前者直接映射宿主机路径&#xff0c;后者由Docker管理存储路径。本地目录挂载的核心方法bind mount…

IO多路复用相关知识

select、poll、epoll 在传入的性能差异是不是体现在&#xff0c;当有新的连接过来&#xff0c;此时需要将新的fd传入到内核中&#xff0c;但是poll/select需要出入整个数组&#xff0c;而epoll方式只需要出入单个fd&#xff1f; 1. select/poll 的情况它们没有内核中“长期保存…

【CF】Day139——杂题 (绝对值变换 | 异或 + 二分 | 随机数据 + 图论)

B. Meeting on the Line题目&#xff1a;思路&#xff1a;数形结合首先考虑如果没有 t 的影响该怎么写显然我们就是让最大时间最小化&#xff0c;那么显然选择最左端点和最右端点的中间值即可&#xff0c;即 (mi mx) / 2&#xff0c;那么现在有了 t 该怎么办我们不妨考虑拆开绝…

在 Ubuntu 上安装和配置 PostgreSQL 实录

一、查看ubuntu版本 lsb_release -a postgresq尽量安装在新的稳定版本的ubuntu上 二、安装postgresql 2.1 直接安装 sudo apt install postgresql 结果如下 2.2 使用PPA源安装 Ubuntu官方源提供了PostgreSQL的PPA(Personal Package Archive),通过PPA源安装可以确保获取…

WebGIS三维可视化 + 数据驱动:智慧煤仓监控系统如何破解煤炭仓储行业痛点

目录 一、项目背景&#xff1a;煤炭仓储管理的痛点与转型需求 二、建设意义&#xff1a;从 “被动管理” 到 “主动掌控” 的价值跃迁 三、项目核心&#xff1a;技术架构与核心目标的深度融合 四、数据与技术&#xff1a;系统稳定运行的 “双支柱” &#xff08;一&#x…

使用 Spring Security 实现 OAuth2:一步一步的操作指南

前言 OAuth 是一种授权框架&#xff0c;用于创建权限策略&#xff0c;并允许应用程序对用户在 HTTP 服务&#xff08;如 GitHub 和 Google&#xff09;上的账户进行有限访问。它的工作原理是允许用户授权第三方应用访问他们的数据&#xff0c;而无需分享他们的凭证。本文将指导…

VMware共享文件夹设置

启用共享文件夹 编辑虚拟机设置-选项-共享文件夹&#xff0c;上面的选项选择启用下面点击添加一个路径&#xff0c;跟着向导走 设置共享文件夹在主机的路径&#xff0c;和文件夹名称添加完成后可以点击这个共享文件夹条目&#xff0c;查看属性虚拟机里安装vm-tools sudo apt up…

华为云昇腾云服务

华为云&#xff0c;一切皆服务共建智能世界云底座面向未来的智能世界&#xff0c;数字化是企业发展的必由之路。数字化成功的关键是以云原生的思维践行云原生&#xff0c;全数字化、全云化、AI驱动&#xff0c;一切皆服务。华为云将持续创新&#xff0c;携手客户、合作伙伴和开…