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信号的占空比

🔮占空比怎么计算
如果设置了某个通道的PWM分辨率为16位,那么duty的值理论上可以在0到65535之间变化(因为2^16 = 65536,包括0和65535两个极端值),如果配置占空比为 70 % 70\% 70%
d u t y = 70 % × 65535 = 0.7 × 65535 ≈ 45874 duty=70\% \times 65535 = 0.7 \times 65535 \approx 45874 duty=70%×65535=0.7×6553545874

函数返回值描述:
该函数返回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使用的定时器为定时器1
    ledc_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使用的通道为通道1
    ledc_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 控制器

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

227基于matlab的作业调度问题

基于matlab的作业调度问题。采用遗传算法,解决作业调度问题。一共三个作业,每个作业有不同的时间长度和紧急程度,超过时间会有惩罚措施。通过遗传算法计算出最好的作业安排,使得惩罚最小,获益最大。最终结果通过GUI用甘…

JavaScript 数据类型 对象概述

对象代表两个人,一个是你和你的对象,对于程序来说也是这个样子,一个键,一个值组成。 什么是对象?对象(object)是JavaScript语言的核心概念,也是最重要的数据类型简单说,对象就是一组“键值对”(key-value…

DC学习笔记

视频 数字逻辑综合工具实践 DC 01_哔哩哔哩_bilibili 一、DC工作模式(此小节为搬运内容) 原链接:Design_Compiler User Guide 随手笔记(9)Using Floorplan Information - 知乎 DC拥有四种工作模式: 工…

SQL优化——全自动SQL审核

文章目录 1、抓出外键没创建索引的表2、抓出需要收集直方图的列3、抓出必须创建索引的列4、抓出SELECT * 的SQL5、抓出有标量子查询的SQL6、抓出带有自定义函数的SQL7、抓出表被多次反复调用SQL8、抓出走了FILTER的SQL9、抓出返回行数较多的嵌套循环SQL10、抓出NL被驱动表走了全…

vue3的getCurrentInstance获取当前组件实例

vue3的setup中没有this时需要使用getCurrentInstance()来获取。 在 Vue 3 中,getCurrentInstance 方法可以在组合式 API(Composition API)中获取当前组件实例。这个方法返回一个包含了组件实例的对象,你可以用它来访问组件的 pro…

【刷题】代码随想录算法训练营第二十天|654、最大二叉树,617、合并二叉树,700、二叉搜索树中的搜索,98、验证二叉搜索树

目录 654、最大二叉树617、合并二叉树700、二叉搜索树中的搜索98、验证二叉搜索树 654、最大二叉树 讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html 最大二叉树的规则: 二叉树的根是数组中的最大元素。左子…

电商数据采集API接口系列|请求示例测试方式丨商品详情,详情图,sku价格等

电商数据采集API接口系列是用于从电商平台收集各种商品信息的工具,包括商品详情、详情图、SKU价格等。以下是一般情况下使用电商API接口进行数据采集的步骤和测试方式: 1.请求方式:HTTP POST GET (复制薇:Anzexi58 获…

VS安装教程

文章目录 VS安装步骤 VS安装步骤 (1) 下载VS2022社区版(根据情况选择自己需要的版本下载),下载的方式,可以通过微软官方下载。https://visualstudio.microsoft.com/zh-hans/downloads/?cidlearn-onpage-d…

uniapp——授权报错,选择合适的基础库

说明 我的小程序开发版本点击选择头像报错 更换基础库就好了

4.9 启动系统任务❤❤❤

有一些特殊的任务需要在系统启动时执行,例如配置文件加载、数据库初始化等操作。 Spring Boot对此提供了两种解决方案:CommandLineRunner和ApplicationRunner。 CommandLineRunner和ApplicationRunner基本一致,差别主要体现在参数上。 1. Co…

vue详解(3)

1. Vue 生命周期总结 四个阶段,八个钩子 -> 三个常用 created,mounted,beforeDestroy 2. 工程化开发 & 脚手架 Vue CLI 基本介绍: Vue CLI 是 Vue 官方提供的一个全局命令工具。 可以帮助我们快速创建一个开发 Vue 项目…

基于深度学习的脑部肿瘤检测系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 当大脑中形成异常细胞时,就会发生脑肿瘤。肿瘤主要有两种类型:癌性(恶性)肿瘤和良性肿瘤。恶性肿瘤可分为原发性肿瘤和继发性肿瘤,前者始…

单片机STM32中断与事件的区别

【转】1-单片机STM32---中断与事件的区别 - Engraver - 博客园 (cnblogs.com) 路径不同,处理方式不同,是否有程序不同,是否有cpu参与不同。 事件是比中断更新的升级产物。

Golang | Leetcode Golang题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; func firstMissingPositive(nums []int) int {n : len(nums)for i : 0; i < n; i {for nums[i] > 0 && nums[i] < n && nums[nums[i]-1] ! nums[i] {nums[nums[i]-1], nums[i] nums[i], nums[nums[i]-1]}}for i …

JavaScript变量及数据类型

目录 概述&#xff1a; 变量&#xff1a; 前言&#xff1a; 变量的命名&#xff1a; 定义变量&#xff1a; 为变量赋值&#xff1a; 变量提升&#xff1a; let和const关键字&#xff1a; JS数据类型&#xff1a; 前言&#xff1a; typeof操作符&#xff1a; JS基本…

一二三应用开发平台使用手册——系统管理-用户组-使用说明

概述 在RBAC模型中&#xff0c;资源、角色、用户三个关键元素&#xff0c;构成权限体系。在平台设计和实现的时候&#xff0c;以下几个核心问题思考如下&#xff1a; 角色&#xff0c;单层平铺还是树形结构&#xff1f; 在小型应用中&#xff0c;角色数量有限的情况下&#x…

Gitea 简单介绍、用法以及使用注意事项!

Gitea 是一个轻量级的代码托管解决方案&#xff0c;它提供了一个简单而强大的平台&#xff0c;用于托管和协作开发项目。基于 Go 语言编写&#xff0c;与 GitLab 和 GitHub Enterprise 类似&#xff0c;但专为自托管而设计。以下是对 Gitea 的详细介绍&#xff0c;包括常用命令…

SpringBoot---------@Value,@ConfigurationProperyies以及多环境开发配置

application.yml server:port: 8080#logging: # level: # root: info(默认)array:name: zzlage: 18subject:- Java- Vue- SpringBoot Value注解的使用:从yml配置文件中获取数据&#xff0c;即可在类中使用 Value("${server.port}")private String port;Value(&q…

SpringBoot中Bean的创建过程及扩展操作点 @by_TWJ

目录 1. 类含义2. Bean创建过程 - 流程图3. 例子3.1. 可变属性注入到实体中3.2. 模拟Bean创建的例子 1. 类含义 BeanDefinition - 类定义&#xff0c;为Bean创建提供一些定义类的信息。实现类如下&#xff1a; RootBeanDefinition - 类定义信息&#xff0c;包含有父子关系的Be…

美国RAKSmart服务器性能科普

当我们谈论服务器性能时&#xff0c;无疑会涉及多个维度&#xff0c;包括存储能力、网络连接、稳定性、管理界面以及安全性等。在这篇科普文章中&#xff0c;我们将深入探讨美国RAKSmart服务器的性能特点。 首先&#xff0c;RAKSmart服务器在存储和扩展性方面表现出色。它们配备…