17-软件脉冲宽度调制(SW_PWM)

ESP32-S3的软件脉冲宽度调制(SW_PWM)

引言

ESP32-S3 LED 控制器LEDC 主要用于控制 LED,也可产生PWM信号用于其他设备的控制。该控制器有 8 路通道,可以产生独立的波形,驱动 RGB LED 等设备。LED PWM 控制器可在无需CPU 干预的情况下自动改变占空比,实现亮度渐变。ESP32-S3 IDF 提供了两种方式改变 PWM,一种是通过软件改变 PWM 占空比,另一种是通过硬件改变PWM 占空比

什么是脉冲宽度调制(PWM)

脉冲宽度调制(PWM)是一种在数字系统中模拟模拟信号的方法。通过改变脉冲的宽度,我们可以控制电源的输出,从而控制例如LED的亮度或电机的速度。

ESP32-S3的SW_PWM 控制器

ESP32-S3 的LED PWM 控制器,简写为LEDC,用于生成控制LED 的脉冲宽度调制信号。 LED PWM 控制器具有八个独立的 PWM 生成器(即八个通道)。每个 PWM 生成器会从四个通用定时器中选择一个,以该定时器的计数值作为基准生成 PWM 信号👇。

✨LED PWM 控制器具有如下特性:

  • 八个独立的 PWM 生成器(即八个通道)
  • 四个独立定时器,可实现小数分频
  • 占空比自动渐变(即 PWM 信号占空比可逐渐增加或减小,无须处理器干预),渐变完成时产生中断
  • 输出 PWM 信号相位可调
  • 低功耗模式 (Light-sleep mode) 下可输出 PWM 信号
  • PWM 最大精度为 14 位
    在这里插入图片描述
    为了实现PWM 输出,先需要设置指定通道的PWM 参数:频率、分辨率、占空比,然后将该通道映射到指定引脚,同时LED PWM 控制器可在没有CPU 干预的情况下自动改变占空比,实现亮度以及颜色渐变。
    在这里插入图片描述

ESP32-S3的SW_PWM功能允许我们通过软件来控制PWM,而不需要额外的硬件。这意味着我们可以使用任何GPIO引脚作为PWM输出,极大地提高了系统的灵活性。

如何使用ESP32-S3的SW_PWM

要使用ESP32-S3的SW_PWM,我们需要进行以下步骤:

  1. 配置LEDC 使用的定时器为定时器 1
  2. 配置LEDC 使用的通道为通道 1
  3. 配置LEDC 定时器占空比值

✨注意,与 ESP32 不同,ESP32-S3 仅支持设置通道为低速模式

1️⃣配置 LEDC 使用的定时器为定时器1

需要注意的一点是,在首次配置LEDC 时,建议先配置定时器(调用函数 ledc_timer_config()),再配置通道(调用函数 ledc_channel_config())。这样可以确保 IO 引脚上的PWM 信号自输出开始那一刻起,其频率就是正确的。

✨要设置定时器,可调用函数ledc_timer_config()

esp_err_t ledc_timer_config(const ledc_timer_config_t *timer_conf);

函数形参描述:

形参描述
timer_conf指向配置LEDC定时器的结构体指针

函数返回值描述:

返回值描述
ESP_OK返回0,配置成功
ESP_ERR_INVALID_ARG参数错误
ESP_FAIL无法根据给定的频率和当前的duty_solution找到合适的预分频器编号

该函数使用ledc_timer_config_t类型的结构体变量传入LEDC的配置参数。

2️⃣配置 LEDC 使用的通道为通道1

✨调用ledc_channel_config()来配置通道

esp_err_t ledc_channel_config(const ledc_channel_config_t *ledc_conf);

函数形参描述:

形参描述
ledc_conf指向配置LEDC通道的结构体指针

函数返回值描述:

返回值描述
ESP_OK返回0,配置成功
ESP_ERR_INVALID_ARG参数错误

该函数使用ledc_channel_config_t类型的结构体变量传入LEDC的通道配置参数。

3️⃣配置LEDC 定时器占空比值

ledc_set_duty 函数用于设置指定LEDC通道的占空比值

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

函数形参描述:

形参描述
speed_modeLEDC的速度模式,指定LED控制器的速度模式
channelLEDC通道的索引,指定要配置的通道
dutyLEDC通道的占空比值,即PWM信号的占空比

函数返回值描述:
该函数返回ESP_OK(0)表示配置成功。

ledc_update_duty 函数用于更新指定LEDC通道的占空比值。
在调用 ledc_set_duty 函数设置占空比后,必须调用 ledc_update_duty 函数才能使设置生效。它的功能是更新指定通道的占空比,确保之前设置的占空比值在LEDC的通道中生效。

函数原型:

esp_err_t ledc_update_duty(ledc_mode_t speed_mode, ledc_channel_t channel);

函数形参描述:

形参描述
speed_modeLEDC的速度模式,指定LED控制器的速度模式
channelLEDC通道的索引,指定要更新占空比的通道

函数返回值描述:
该函数返回ESP_OK(0)表示更新成功。

示例如何使用ESP32-S3的SW_PWM来控制一个LED的亮度:

#include "driver/ledc.h"#define LEDC_TIMER          LEDC_TIMER_1          // LEDC定时器
#define LEDC_MODE           LEDC_LOW_SPEED_MODE   // LEDC模式
#define LEDC_CH1_GPIO       (10)                 // LEDC通道1 GPIO引脚
#define LEDC_CH1_CHANNEL    LEDC_CHANNEL_1       // LEDC通道1
#define LEDC_TEST_DUTY      (4000)               // LEDC测试占空比
#define LEDC_TEST_FADE_TIME (3000)               // LEDC测试淡入淡出时间void app_main(void)
{// ①:配置LEDC使用的定时器为定时器1ledc_timer_config_t ledc_timer = {.duty_resolution = LEDC_TIMER_13_BIT, // PWM占空比分辨率.freq_hz = 5000,                      // PWM信号频率.speed_mode = LEDC_MODE,              // 定时器模式.timer_num = LEDC_TIMER               // 定时器索引};// 使用之前准备好的配置设置定时器ledc_timer_config(&ledc_timer);// ②:配置LEDC使用的通道为通道1ledc_channel_config_t ledc_channel = {.channel    = LEDC_CH1_CHANNEL, // LEDC通道号设置为通道1.duty       = 0,                 // 初始占空比为0.gpio_num   = LEDC_CH1_GPIO,    // GPIO引脚设置为LEDC_CH1_GPIO.speed_mode = LEDC_MODE,        // 使用LEDC模式.hpoint     = 0,                 // 占空比更新点设为0.timer_sel  = LEDC_TIMER        // 使用LEDC定时器1};// 使用之前准备好的配置设置LEDC通道ledc_channel_config(&ledc_channel);// ③:配置LEDC定时器占空比值ledc_set_duty(ledc_channel.speed_mode, ledc_channel.channel, LEDC_TEST_DUTY);ledc_update_duty(ledc_channel.speed_mode, ledc_channel.channel);
}

结论

参考资料乐鑫官方文档👇
LED PWM 控制器

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

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

相关文章

二叉树相关

二叉树相关 力扣104 二叉树最大深度 普通递归遍历力扣 104 递归遍历2二叉树求前序遍历结果二叉树求 每个节点所在层数与每个节点的左右子树上的节点总数力扣 543 二叉树的直径 力扣104 二叉树最大深度 普通递归遍历 int depth 0;int maxDepth 0;public int maxDepth(TreeNod…

CLion远程调试

一 CLion远程调试 ## 1.1 建立远程连接过程 设置——部署——“”——SFTP——新建服务器名称——输入主机、用户名、密码信息——确定 工具链建立远程主机 设置——工具链——“”——远程主机——凭据新增服务器信息 上传本地代码到服务器 ps:要保证本地文件完整&#…

测试人员一定要避免的这些不专业行为!

软件测试并非一个简单的任务,需要高度的专业性和责任感,本文将探讨一些常见的不专业行为,及其对软件开发过程和产品质量可能产生的负面影响。 1. 忽略细节 在测试过程中忽视细节,导致测试不彻底,漏洞未被发现。 2. …

橡胶衬板在食品与制药领域中的应用

橡胶衬板在食品与制药领域中的应用 随着工业技术的不断进步,橡胶衬板在众多领域中的应用越来越广泛。特别是在食品与制药领域,橡胶衬板以其独特的优势,发挥着不可或缺的作用。本文将探讨橡胶衬板在食品与制药领域中的应用及其重要性。 一、…

K8s: 在Pod里面创建init容器与健康检查

pod中init容器的创建 1 )概述 每个 Pod 中可以包含多个容器, 应用运行在这些容器里面同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器Init 容器与普通的容器非常像,除了如下两点 a. 它们总是运行到完成。b. 每个都必须在下一个启动…

LeetCode42-接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 思路:对于每个柱子(不包括最左边和最右边的,因为这两根柱子无论如何也装不下水),找出其…

Shell学习 - 2.28 Shell declare -i:将变量声明为整数类型

在《Shell declare命令》一节中,我们已经讲解了 declare 命令的各种选项,为了让 Shell 进行整数运算,本节我们重点讲解-i选项。 默认情况下,Shell 中每一个变量的值都是字符串(参见之前的《Shell变量》)&am…

从 Android 恢复已删除文件的 3 种简单方法

如何从 Android 恢复已删除的文件?毫不犹豫,有些人可能会认为从 Google 备份恢复 Android 文件太容易了。但是,如果删除的文件未同步到您的帐户或未备份怎么办?您错误的恢复可能会永久删除您想要的数据。因此,我们发布…

常见的软件架构模式

在软件开发过程中,软件架构模式是实现高质量、可扩展系统的关键。本文将介绍一些常见的软件架构模式,分析其优缺点和适用场景,从而帮助大家在实际项目中做出更明智的架构选择(注意以下的架构模式相互之间并不一定互斥,…

23种设计模式之抽象工厂

简单工厂和工厂方法 关注 产品等级 抽象工厂 关注 产品族 对于比较稳定的产品,抽象工厂更有效率(一个工厂生产很多产品族) 抽象工厂代码例子加深理解

vue中使用自定义组件规则

使用自定义组件规则 1.定义组件中不要绑定el 2.data必须使用函数写法 3.注册时可以取别名,别名不可以驼峰命名,需要使用-连接,不能使用已有的标签作为名称 4.模板时只能有一个父级,只在vue2中 5.未搭建脚手架使用单标签会使后面代…

我与C++的爱恋:类和对象(三)

​ ​ 🔥个人主页:guoguoqiang. 🔥专栏:我与C的爱恋 先来回顾一下,上一节的内容并且通过上次的内容来做一道oj题。 https://leetcode.cn/problems/implement-queue-using-stacks/ class MyQueue { private:stack&l…

【LeetCode:216. 组合总和 III + 递归】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

JavaSE-15笔记【注解(+2024新)】

文章目录 1.注解概述2.几个常用的JDK内置的注解2.1 Deprecated2.2 Override2.3 SuppressWarnings2.4 FunctionalInterface 3.自定义注解3.1 注解也可以定义属性3.2 注解的使用规则补充 4.元注解4.1 Retention4.2 Target4.3 Documented4.4 Inherited4.5 Repeatable 5.通过反射获…

Python的pytest框架(3)--fixtrue固件

fixture是pytest的一项核心特性,它提供了一种组织和管理测试依赖项(如初始化环境、创建资源、清理操作等)的有效机制。下面将对fixture进行深入讲解,包括其基本概念、作用、使用方式、特性以及高级应用: 目录 一、基…

微信小程序开发

微信小程序隶属于前端,因此我们只需要了解掌握一些基本的功能与业务逻辑即可。 HttpClient HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议…

Java初学日记 十三 (GUI)

GUI编程 概述 GUI(Graphical Uers Interface)全称图形用户界面 swing指javax.swing包,该包中包含实现界面的类,这些类都可称为组件 组件可分为两大类: 容器组件 窗口 import javax.swing.*; ​ public class LoginFrame extends JFram…

深入理解与运用Vue 2中的插槽(Slots)

深入理解与运用Vue 2中的插槽(Slots) Vue.js作为一种强大的前端框架,以其组件化、声明式编程理念深受开发者喜爱。其中,Vue 2的插槽(Slots)机制更是极大地提升了组件复用性和灵活性。本文将深入探讨Vue 2中…

FreeSWITCH 1.10.10 简单图形化界面15 - JsSIP媒体控制(LookLook)

FreeSWITCH 1.10.10 简单图形化界面15 - JsSIP媒体控制 0、 界面预览1、本地媒体流获取session本地音频本地视频 2、远端媒体流获取媒体流远端音频远端视频 FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/137820796 0、 界面预览 http…