ESP32-S3学习笔记<8>:LEDC的应用

ESP32-S3学习笔记<8>:LEDC的应用

  • 1. 头文件包含
  • 2. LEDC的配置
    • 2.1 配置定时器
      • 2.1.1 speed_mode/设置速度模式
      • 2.1.2 duty_resolution/设置占空比分辨率
      • 2.1.3 timer_num/选择定时器
      • 2.1.4 freq_hz/设定PWM频率
      • 2.1.5 clk_cfg/选择LEDC的外设时钟源
      • 2.1.6 deconfigure/撤销定时器配置
    • 2.2 配置通道
      • 2.2.1 gpio_num/设置PWM输出的GPIO
      • 2.2.2 speed_mode/速度模式
      • 2.2.3 channel/选择通道
      • 2.2.4 intr_type/是否使能中断
      • 2.2.5 timer_sel/选择通道绑定定时器
      • 2.2.6 duty/占空比选择
      • 2.2.7 hpoint/设置高电平切换点
      • 2.2.8 output_invert/指定输出是否需要反相
  • 3. 软件控制PWM占空比
  • 4. 示例

1. 头文件包含

#include "driver/ledc.h"

2. LEDC的配置

配置LEDC生成PWM波,主要分为2个步骤完成:

  1. 配置LEDC的定时器。定时器决定了PWM的一些基础特性,例如频率。
  2. 配置LEDC的通道,并将通道绑定到定时器。通道可以配置和控制PWM占空比。

2.1 配置定时器

使用如下代码配置定时器。LEDC外设内一共有4个定时器,8个通道。通道可以绑定在任意一个定时器上。定时器决定了PWM的频率,因此绑定在一个定时器上的所有通道都具有相同的PWM频率。

esp_err_t ledc_timer_config(const ledc_timer_config_t *timer_conf);

参数 timer_conf 的定义为:

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;

2.1.1 speed_mode/设置速度模式

定义如下。ESP32-S3仅支持 LEDC_LOW_SPEED_MODE

typedef enum {
#if SOC_LEDC_SUPPORT_HS_MODELEDC_HIGH_SPEED_MODE = 0, /*!< LEDC high speed speed_mode */
#endifLEDC_LOW_SPEED_MODE,      /*!< LEDC low speed speed_mode */LEDC_SPEED_MODE_MAX,      /*!< LEDC speed limit */
} ledc_mode_t;

2.1.2 duty_resolution/设置占空比分辨率

所谓分辨率,就是PWM波的一个完整周期中,定时器计数多少次。在给定的输入时钟情况下。对于不同的 freq_hz(PWM频率),有不同的分辨率范围可选。可以认为,最大的duty_resolution(2的duty_resolution次方) 乘以 freq_hz,接近于输入时钟频率(但不相等)。下表罗列了不同时钟源情况下,不同的PWM频率可选的最大分辨率和最小分辨率。分辨率越大,输出PWM的占空比调节越精细。
在这里插入图片描述

2.1.3 timer_num/选择定时器

以下选项选择LEDC中的定时器:

typedef enum {LEDC_TIMER_0 = 0, /*!< LEDC timer 0 */LEDC_TIMER_1,     /*!< LEDC timer 1 */LEDC_TIMER_2,     /*!< LEDC timer 2 */LEDC_TIMER_3,     /*!< LEDC timer 3 */LEDC_TIMER_MAX,
} ledc_timer_t;

2.1.4 freq_hz/设定PWM频率

设定PWM波的频率。

2.1.5 clk_cfg/选择LEDC的外设时钟源

可用的选项有:

typedef enum {LEDC_AUTO_CLK = 0,                              /*!< LEDC source clock will be automatically selected based on the giving resolution and duty parameter when init the timer*/LEDC_USE_APB_CLK = SOC_MOD_CLK_APB,             /*!< Select APB as the source clock */LEDC_USE_RC_FAST_CLK = SOC_MOD_CLK_RC_FAST,     /*!< Select RC_FAST as the source clock */LEDC_USE_XTAL_CLK = SOC_MOD_CLK_XTAL,           /*!< Select XTAL as the source clock */LEDC_USE_RTC8M_CLK __attribute__((deprecated("please use 'LEDC_USE_RC_FAST_CLK' instead"))) = LEDC_USE_RC_FAST_CLK,   /*!< Alias of 'LEDC_USE_RC_FAST_CLK' */
} soc_periph_ledc_clk_src_legacy_t;

2.1.6 deconfigure/撤销定时器配置

如果选项 deconfigure,设置为了1,则函数仅取消对定时器的配置,不会使用上面的参数对定时器配置。

2.2 配置通道

定时器配置完成,则可以使用如下函数配置PWM通道。

esp_err_t ledc_channel_config(const ledc_channel_config_t *ledc_conf);

参数 ledc_conf 的定义如下:

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] */struct {unsigned int output_invert: 1;/*!< Enable (1) or disable (0) gpio output invert */} flags;                        /*!< LEDC flags */} ledc_channel_config_t;

2.2.1 gpio_num/设置PWM输出的GPIO

2.2.2 speed_mode/速度模式

对于ESP32-S3而言仅选择 LEDC_LOW_SPEED_MODE

2.2.3 channel/选择通道

参数 channel 选择一个通道进行配置。可用选项有:

typedef enum {LEDC_CHANNEL_0 = 0, /*!< LEDC channel 0 */LEDC_CHANNEL_1,     /*!< LEDC channel 1 */LEDC_CHANNEL_2,     /*!< LEDC channel 2 */LEDC_CHANNEL_3,     /*!< LEDC channel 3 */LEDC_CHANNEL_4,     /*!< LEDC channel 4 */LEDC_CHANNEL_5,     /*!< LEDC channel 5 */
#if SOC_LEDC_CHANNEL_NUM > 6LEDC_CHANNEL_6,     /*!< LEDC channel 6 */LEDC_CHANNEL_7,     /*!< LEDC channel 7 */
#endifLEDC_CHANNEL_MAX,
} ledc_channel_t;

2.2.4 intr_type/是否使能中断

LEDC外设支持硬件自动调节PWM占空比(用来调节LED灯的渐亮渐暗、呼吸效果之类的)。如果使用这项功能,可在此处选择是否使用中断。如果是软件控制占空比,则不必使能中断。

typedef enum {LEDC_INTR_DISABLE = 0,    /*!< Disable LEDC interrupt */LEDC_INTR_FADE_END,       /*!< Enable LEDC interrupt */LEDC_INTR_MAX,
} ledc_intr_type_t;

2.2.5 timer_sel/选择通道绑定定时器

定时器一共有4个,这里选择将通道绑定到哪个定时器。

2.2.6 duty/占空比选择

设置占空比。这里是配置时设置的,相当于默认占空比。后续运行时也有其他API可以修改占空比。其可设定的最小值为0,最大值为 2的duty_resolution次方
假设前面设置定时器时 duty_resolution 是10位,则最大值为1024。当 duty 设置为512时,输出信号高电平占空比为50%。设置为256时,输出高电平占空比为25%。

2.2.7 hpoint/设置高电平切换点

通道内部有2个参数,hpointlpoint。前者确定输出PWM信号从低电平到高电平切换的计数器的值。后者则决定信号从高电平到低电平切换的计数器的值。前者在此处设置。一旦 hpointduty 是确定的,则 lpoint 也是确定的。所以 lpoint 不需要用户设置,驱动代码会根据前两个参数去算。
hpoint的值最小为0,最大为2的duty_resolution次方-1
在这里插入图片描述

2.2.8 output_invert/指定输出是否需要反相

PWM输出信号默认是低电平的。设置此位,则反相输出。

3. 软件控制PWM占空比

使用如下函数设置PWM输出的占空比:

esp_err_t ledc_set_duty(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t duty) ;
esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel) ;

前一个函数设置占空比门限。调用此函数不会立即生效。调用后一个函数来使得设定生效。

4. 示例

以下示例程序,先配置一个LEDC定时器,然后设置定时器的一个通道。默认情况下,输出占空比50%。在主函数中,将占空比改为25%。
在这里插入图片描述

test_ledc.h文件:

#define TEST_LEDC_TIMER_SELECT        (LEDC_TIMER_0        )
#define TEST_LEDC_TIMER_RESOLUTION    (LEDC_TIMER_10_BIT   )
#define TEST_LEDC_TIMER_FREQ          (5000                )#define TEST_LEDC_CHANNEL_GPIO        (GPIO_NUM_4          )
#define TEST_LEDC_CHANNEL_SELECT      (LEDC_CHANNEL_0      )
#define TEST_LEDC_CHANNEL_DUTY        (512                 )
#define TEST_LEDC_CHANNEL_HPOINT      (1                   )void TEST_LEDC_LEDCConfig(void) ;
void TEST_LEDC_SoftUpdateDuty(void) ;

test_ledc.c文件:

#include "driver/ledc.h"
#include "esp_log.h"#include "test_ledc.h"void TEST_LEDC_LEDCConfig(void)
{esp_err_t                 iErrCode ;const ledc_timer_config_t stLEDCConfigInfo ={.speed_mode      = LEDC_LOW_SPEED_MODE ,.duty_resolution = TEST_LEDC_TIMER_RESOLUTION ,.timer_num       = TEST_LEDC_TIMER_SELECT ,.freq_hz         = TEST_LEDC_TIMER_FREQ ,.clk_cfg         = LEDC_USE_XTAL_CLK ,.deconfigure     = 0} ;const ledc_channel_config_t stChannelConfigInfo = {.gpio_num            = TEST_LEDC_CHANNEL_GPIO ,.speed_mode          = LEDC_LOW_SPEED_MODE ,.channel             = TEST_LEDC_CHANNEL_SELECT ,.intr_type           = LEDC_INTR_DISABLE ,.timer_sel           = TEST_LEDC_TIMER_SELECT ,.duty                = TEST_LEDC_CHANNEL_DUTY ,.hpoint              = TEST_LEDC_CHANNEL_HPOINT ,.flags.output_invert = 0} ;iErrCode = ledc_timer_config(&stLEDCConfigInfo) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Config LEDC timer error! Return value is %d\n", iErrCode) ;}iErrCode = ledc_channel_config(&stChannelConfigInfo) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Config LEDC channel error! Return value is %d\n", iErrCode) ;}return ;
}void TEST_LEDC_SoftUpdateDuty(void)
{esp_err_t iErrCode ;iErrCode = ledc_set_duty(LEDC_LOW_SPEED_MODE, TEST_LEDC_CHANNEL_SELECT, 256) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Set duty error! Return value is %d\n", iErrCode) ;}iErrCode = ledc_update_duty(LEDC_LOW_SPEED_MODE, TEST_LEDC_CHANNEL_SELECT) ;if(ESP_OK != iErrCode){ESP_LOGE("test_ledc", "Update duty error! Return value is %d\n", iErrCode) ;}return ;
}

main.c文件:

#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "freertos/semphr.h"#include "test_ledc.h"void app_main(void)
{TEST_LEDC_LEDCConfig() ;while (true){vTaskDelay(1000) ;TEST_LEDC_SoftUpdateDuty() ;}
}

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

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

相关文章

网络安全第14集

前言&#xff1a;小迪安全14集&#xff0c;这集重点内容&#xff1a;0、什么是js渗透测试&#xff1f;在javascript中也存在变量和函数&#xff0c;存在可控变量和函数就有可能存在在漏洞&#xff0c;js开发的web应用和php、java开发的区别是&#xff0c;js能看得到的源代码&am…

代码随想录算法训练营第三十三天

LeetCode.62 不同路径 题目链接 不同路径 题解 class Solution {public int uniquePaths(int m, int n) {// dp表示到达ij有多少条路径int[][] dp new int[110][110];dp[1][1] 1;for(int i 0;i<m;i){dp[i][0] 1;}for(int j 0;j<n;j){dp[0][j] 1;}for(int i 1;i…

银行回单OCR识别技术原理

银行回单OCR&#xff08;光学字符识别&#xff09;技术通过结合图像处理、模式识别和自然语言处理&#xff08;NLP&#xff09;技术&#xff0c;将纸质或电子版银行回单中的非结构化文本&#xff08;如账号、金额、日期等&#xff09;转化为结构化数据。以下是其核心原理和关键…

Day22-二叉树的迭代遍历

昨天学习了递归遍历&#xff1a;递归就是一次次的把参数压入栈中&#xff0c;然后返回的时候还是上一次递归保存的参数。今天学习迭代遍历。迭代遍历就是用栈去模拟保存二叉树的节点&#xff0c;然后依次去遍历&#xff0c;只不过要注意栈的后入先出的规则。前序遍历&#xff1…

知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出

知识蒸馏 - 通过引入温度参数T调整 Softmax 的输出 flyfish import torch import torch.nn.functional as F import matplotlib.pyplot as plt import numpy as np# 设置中文字体支持 plt.rcParams["font.family"] [AR PL UMing CN] # Linux plt.rcParams[axes.uni…

Java研学-RabbitMQ(三)

一 消息通信协议 1 AMQP AMQP 是一个开放的、跨语言、跨平台的消息协议标准&#xff0c;用于在分布式系统中传递业务消息。它定义了消息队列的二进制协议格式和交互模型&#xff08;如交换机、队列、绑定等&#xff09;&#xff0c;确保不同语言&#xff08;Java、Python、C#等…

http.client 教程-如何使用 Python 标准库发送 HTTP 请求

http.client 教程-如何使用 Python 标准库发送 HTTP 请求以下是 http.client 模块的详细使用教程&#xff0c;帮助你理解如何使用 Python 标准库发送 HTTP 请求&#xff1a;1. http.client 概述http.client 是 Python 内置的 HTTP 客户端库&#xff0c;提供了底层的 HTTP 协议实…

Android-三种持久化方式详解

持久化技术分为3种&#xff0c;文件&#xff0c;sharedPreferences存储&#xff0c;数据库来存储&#xff1b; 目录 文件存储&#xff1a; 利用SharedPreferences中读取数据 SQLite创建数据库 更新 添加 删除 查找&#xff1a; 文件存储&#xff1a; 文件存储是 Andr…

并发安全之锁机制一

锁机制一 锁机制是计算机系统中解决并发冲突的核心工具&#xff0c;其存在和应用场景源于一个根本问题&#xff1a;当多个执行单元&#xff08;线程、进程、分布式节点&#xff09;同时访问或修改同一份共享资源时&#xff0c;如何保证数据的正确性、一致性和系统可靠性&#x…

结合项目阐述 设计模式:单例、工厂、观察者、代理

原文链接&#xff1a;https://download.csdn.net/blog/column/12433305/133862792#_1613 1、工厂模式应用 C17及之后可编译 /*日志落地模块的实现1.抽象落地基类2.派生子类&#xff08;根据不同落地方向进行派生&#xff09;3.使用工厂模式进行创建与表示的分离 */#ifndef _…

uniapp 更新apk有缓存点不动,卸载安装apk没有问题。android

方式一。pages.json&#xff1a;"globalStyle" : {"navigationBarTextStyle" : "black","navigationBarTitleText" : "uni-app","navigationBarBackgroundColor" : "#F8F8F8","backgroundColor&qu…

HTML响应式SEO公司网站源码

核心优势 100%纯HTML/CSS开发自动适配手机/平板/PC内置SEO优化结构0.5秒极速加载 包含页面 • 首页&#xff08;关键词布局优化版&#xff09; • 服务项目展示页 • 客户案例库 • 新闻资讯系统 • 联系方式&#xff08;带地图API&#xff09; 技术参数 兼容Chrome/Firefo…

Error: llama runner process has terminated: exit status 2

我是i7 12700h ,3080显卡&#xff0c;在 Windows 11 上运行 ollama run deepseek-r1:1.5b 出现 Error: llama runner process has terminated: exit status 2 之前是好用的&#xff0c;后来不知为什么就不好用了。 原因&#xff1a; 检查 Microsoft Visual C Redistributab…

Linux中ssh远程登录原理与配置

SSH连接的五个阶段 1. 版本协商阶段&#xff08;Protocol Version Negotiation&#xff09;目的&#xff1a;协商使用SSH-1或SSH-2协议&#xff08;现代系统默认SSH-2&#xff09;。流程&#xff1a;关键点&#xff1a;若版本不兼容&#xff08;如客户端只支持SSH-1&#xff0c…

Kubernetes --存储入门

一、Volume 的概念对于大多数的项目而言&#xff0c;数据文件的存储是非常常见的需求&#xff0c;比如存储用户上传的头像、文件以及数据库的数据。在 Kubernetes 中&#xff0c;由于应用的部署具有高度的可扩展性和编排能力&#xff08;不像传统架构部署在固定的位置&#xff…

蚂蚁 KAG 框架开源:知识图谱 + RAG 双引擎

引言&#xff1a;从RAG到KAG&#xff0c;专业领域知识服务的技术突破 在大语言模型&#xff08;LLM&#xff09;应用落地过程中&#xff0c;检索增强生成&#xff08;RAG&#xff09; 技术通过引入外部知识库有效缓解了模型幻觉问题&#xff0c;但在专业领域仍面临三大核心挑战…

V-Ray 7.00.08 for 3ds Max 2021-2026 安装与配置教程(含语言补丁)

本文介绍 V-Ray 7.00.08 渲染器在 3ds Max 2021-2026 各版本中的安装与使用配置步骤&#xff0c;适合需要进行可视化渲染工作的设计师、建筑师及相关从业者。附带语言补丁配置方式&#xff0c;帮助用户获得更顺畅的使用体验。 &#x1f4c1; 一、安装文件准备 软件名称&#xf…

Go-Elasticsearch Typed Client查询请求的两种写法强类型 Request 与 Raw JSON

1 为什么需要两种写法&#xff1f; 在 Golang 项目中访问 Elasticsearch&#xff0c;一般会遇到两类需求&#xff1a;需求场景特点最佳写法后台服务 / 业务逻辑查询固定、字段清晰&#xff0c;需要编译期保障Request 结构体仪表盘 / 高级搜索 / 模板 DSL查询片段由前端或脚本动…

Leaflet 综合案例-聚类图层控制

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

React组件中的this指向问题

在 React 组件中&#xff0c;函数定义方式影响this指向的核心原因是箭头函数与普通函数的作用域绑定规则不同&#xff0c;具体差异如下&#xff1a;​ 1. 普通函数&#xff08;function定义&#xff09;需要手动bind(this)的原因​ 当用function在组件内定义方法时&#xff1…