【快速上手ESP32(基于ESP-IDFVSCode)】04-PWM

PWM

PWM,即脉冲宽度调制(Pulse Width Modulation),是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而达到控制开关稳压电源输出的目的。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术,广泛应用于测量,通信,功率控制与变换等许多领域。

PWM的一个优点是从处理器到被控系统信号都是数字形式的,无需进行数模转换。让信号保持为数字形式可将噪声影响降到最小。噪声只有在强到足以将逻辑1改变为逻辑0或将逻辑0改变为逻辑1时,也才能对数字信号产生影响。

对模拟信号而言,噪声对其产生的影响较大。另外,PWM还简化了模拟电路与数字逻辑电路之间的接口,因为PWM信号都属于数字形式。从模拟信号转向PWM可以极大地简化系统的结构。

以上介绍来自文心一言。

简单来说就是通过在一段时间内,我们控制高电平和低电平持续时间的比例,可以得到介于一直在低电平和一直在高电平之间的效果。

比如说低电平可以使得LED亮,高电平可以使得LED灭。通过PWM控制每个周期时间里的高低电平的比例,可以让LED亮但是没那么亮。如果动态调整PWM的占空比(高电平在一个周期时间中的占比),还可以实现呼吸灯的效果。

上一篇文章我们讲了定时器,那么根据我们的经验(STM32),PWM和定时器是分不开的,因为PWM的频率就是定时器的频率,PWM的占空比要依赖于定时器的自动重装载寄存器。

因此我们这篇就讲讲PWM。

ESP32中的PWM

ESP32中的PWM有两种。

LEDPWM和MCPWM是两个不同的模块,它们各自具有不同的特点和应用场景。

LEDPWM通常用于控制LED灯的亮度和颜色。它可以产生独立的波形来驱动RGB LED等设备,具有高速和低速两种通道模式。高速通道模式在硬件中实现,可以自动且无干扰地改变PWM占空比,而低速通道模式下,PWM占空比需要由软件中的驱动器改变。通过这种方式,LEDPWM能够实现对LED亮度的精确控制,适用于各种需要调节亮度的场景。

而MCPWM(多通道PWM)外设则更适用于一些复杂的控制场景,如有刷/无刷直流电机控制、RC伺服电机控制等。它基于开关模式的数字电源转换,能够计算外部脉宽并将其转换为其他模拟值,如速度、距离等。此外,MCPWM还可以为磁场定向控制(FOC)生成空间矢量调制(SVPWM)信号。MCPWM具有多个子模块,如定时器模块和操作器模块,这些模块协同工作以生成精确的PWM波形,满足各种控制需求。

总的来说,LEDPWM和MCPWM在ESP-IDF中各自扮演着不同的角色。LEDPWM主要关注于LED亮度和颜色的控制,而MCPWM则更适用于电机控制和电源转换等复杂场景。在选择使用哪个模块时,需要根据具体的应用需求和场景来决定。

以上介绍来自文心一言。

简单来说,给LED就用LEDPWM,给电机就用MCPWM。

LEDPWM

#include "driver/ledc.h"

在ESP32中要控制PWM和STM32中有些许不同,在STM32中我们配置完定时器后再额外加一些配置PWM的函数即可。但是在ESP32中我们需要全部重新配置。

首先我们先配置定时器。

从函数名字我们也看得出(ledc开头)这是专门配置LEDPWM的定时器的。

我们需要传入一个结构体变量的指针,我们来看看这个结构体。

关于参数的选择,我们可以参考立创开发板的文档。

那么我们上面配置完定时器之后,接下来要配置的就是通道,来绑定定时器和输出 PWM 信号的 GPIO。

我们再来看看需要什么参数。

然后再参考一下参数的选择。

hpoint这个参数经过我实测,发现选啥都没影响,控制占空比的还是duty。当然也可能是我没有理解到位。然后这边的定时器选择以及速度选择要和上面的一致。

如果不是很清楚如何选择参数的小伙伴可以参考我之后的代码。

上面两个函数配置完之后我们就可以发出PWM了,但是还不够,我们需要动态地调整PWM的占空比以及频率,这样才能更好的完成我们要达到的目的。

上面两个函数分别是设置和获取频率。

修改频率其实用的不多,用的比较多的还是修改占空比。

上面两个函数分别是设置和获取占空比。

我们这边设置占空比的范围是根据我们之前选择的分辨率动态调整的,假设我们选择了n位的分辨率,那么占空比这边的范围就是0~2^n-1。

另外,和调整频率不一样的是,修改完占空比之后需要手动更新之后才会生效。

知道上面这些函数之后我们就可以来写一个呼吸灯的代码了。

#include <stdio.h>
#include "driver/ledc.h"
#include <unistd.h>void Z_LEDPWM_Init(void){ledc_timer_config_t timer_initer={.clk_cfg=LEDC_AUTO_CLK,                 //自动选择时钟源.duty_resolution=LEDC_TIMER_10_BIT,     //10bit的分辨率(可以为1~15).freq_hz=1000,                          //1000Hz.speed_mode=LEDC_LOW_SPEED_MODE,        //低速模式.timer_num= LEDC_TIMER_0                //选择定时器};ledc_timer_config(&timer_initer);ledc_channel_config_t channel_initer={.channel=0,                             //0~7一共八个通道,随便选一个就行.duty=1023,                             //上面选择了10bit的分辨率,因此占空比选择范围为0~1023.gpio_num=18,                           //GPIO18.hpoint=1023,                           //随便填.intr_type=LEDC_INTR_DISABLE,           //不需要中断.speed_mode=LEDC_LOW_SPEED_MODE,        //低速模式.timer_sel=  - LEDC_TIMER_0             //选择定时器};ledc_channel_config(&channel_initer);
}void app_main(void){printf("Hello World!\r\n");Z_LEDPWM_Init();while(1){for(int i=0;i<1023;++i) {ledc_set_duty(LEDC_LOW_SPEED_MODE,0,i);ledc_update_duty(LEDC_LOW_SPEED_MODE, 0);usleep(1000);       //delay 1ms            }for(int i=1023;i>=0;--i) {ledc_set_duty(LEDC_LOW_SPEED_MODE,0,i);ledc_update_duty(LEDC_LOW_SPEED_MODE, 0);usleep(1000);       //delay 1ms            }}
}

不过上面的代码执行起来会有点小问题,那就是会使得ESP-IDF中自带的FreeRTOS中的看门狗无法被喂狗,导致输出一堆警告信息。

解决方法就是把上面的延时函数替换成FreeRTOS中的延时函数vTaskDelay。这个延时函数会进入阻塞状态,会触发调度,而我们使用的usleep是单纯的延时空循环。

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"//下面是延时10ms,而且最少就是10ms起步延时.
vTaskDelay(10 / portTICK_PERIOD_MS);  

关于MCPWM,感兴趣的小伙伴可以自行去编程指南中查阅用法。

电机控制脉宽调制器 (MCPWM) - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com)icon-default.png?t=N7T8https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/peripherals/mcpwm.html

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

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

相关文章

物联网系统设计 8

1 规划中小型LoRa 中小型分时复用&#xff0c;大型项目需要学习LoRaWAN 1.1 通信记录 1.2 节点能耗 1278芯片 满功率20DMB&#xff0c;增加PA&#xff0c;发送功率 30 DBM 内置天线柔性 棒状 3db 203 休眠、发生、接收 计算链路预算&#xff0c;工作电流&#xff0c;工…

Blocs v5.2.3 mac版 可视化网页设计工具 兼容 M1/M2/M3

Mac毒搜集到的Blocs 是一款mac上专业强大的精美网页设计软件。特点就是简介、高效、高质&#xff0c;可以帮助我们快速设计出精美的网页&#xff0c;retina视网膜特性支持&#xff0c;优化自适应网页的开发。 应用介绍 Blocs 是一款mac上专业强大的精美网页设计软件。专注于简…

实现WAF对CC攻击的零误封防护:关键技术解析与实践

一、引言 Web应用防火墙&#xff08;WAF&#xff09;作为网站安全的重要防线&#xff0c;其在防御CC&#xff08;Challenge Collapsar&#xff0c;即挑战黑洞&#xff0c;一种分布式拒绝服务攻击&#xff09;攻击中的效能至关重要。然而&#xff0c;精准识别并有效拦截CC攻击的…

2024阿里云2核4G服务器优惠价格表_2核4G性能测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

pytesseract,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pytesseract。 Github地址&#xff1a;https://github.com/madmaze/pytesseract 在当今数字化时代&#xff0c;文字识别技术扮演着越来越重要的角色。…

设计模式-装饰者模式(Decorator)

1. 概念 装饰者模式是一种结构型设计模式&#xff0c;它允许用户在不修改原始对象的基础上&#xff0c;通过将对象包装在装饰者类的对象中&#xff0c;动态地给原始对象添加新的行为或职责。 2. 原理结构图 图1 图2 抽象组件&#xff08;Component&#xff09;&#xff1a…

离散化实现低通滤波器(选用双线性变换)

学习了离散化后整理了其中的核心步骤&#xff0c;此处不对原理进行深究&#xff0c;仅仅介绍如何对一个连续系统进行离散化 此处可以得到低通滤波器的截止频率为1000rad/s. 离散化的过程为将s 2/Ts * [(z - 1) / (z 1)] (选用双线性变换) 得到离散化序列为 Y(z) [w…

Python-VBA函数之旅-bytearray函数

目录 1、bytearray函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 bytearray函数在Python中提供了一种可变字节序列的表示方式&#xff0c;这在实际编程中有多种应用场景。常见的应用场…

如何用Python编写简单的网络爬虫(页面代码简单分析过程)

一、什么是网络爬虫 在当今信息爆炸的时代&#xff0c;网络上蕴藏着大量宝贵的信息&#xff0c;如何高效地从中获取所需信息成为了一个重要课题。网络爬虫&#xff08;Web crawler&#xff09;作为一种自动化工具&#xff0c;可以帮助我们实现这一目标&#xff0c;用于数据分析…

项目实战 | 使用python分析Excel销售数据(用groupby)

项目实战 | 使用python分析Excel销售数据 本文目录&#xff1a; 零、00时光宝盒 一、提出问题 二、理解数据 2.1、安装python读取excel文件的库 2.2、查看excel表的字段名和前几行记录 2.3、查看excel表结构 2.4、查看索引 2.5、查看每一列的列表头内容 2.6、查看每一…

移除元素Java实现

题意 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 额外空间 并 原地 修改数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元…

websocket实践

文章目录 背景WebSocket API使用场景优点 实例步骤 1: 设置 WebSocket 服务器步骤 2: 创建客户端 HTML 页面步骤 3: 测试 WebSocket 通信注意事项实际操作 参考资料 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它使得浏览器和服务器只需建立一个连接&#xff0c;…

CSS:filter属性介绍

一、filter属性简介 值描述示例blur(Npx)设置高斯模糊效果。N是模糊半径&#xff0c;值越大&#xff0c;模糊效果越明显。filter: blur(5px);brightness(%)调整图像的亮度。百分比值小于100%会使图像变暗&#xff0c;大于100%会使图像变亮。filter: brightness(75%);contrast(…

el-table合计行添加按钮操作

针对于el-table中合计功能中的操作栏也可以按钮&#xff0c;并且可以添加点击事件 ElTable源码里footer部分是&#xff0c;这种方式渲染的&#xff0c;也就是 支持传递VNode。使用h第一个参数传递 组件&#xff0c;可以把组件转成VNode&#xff0c;比如现在要在右下角加一个 详…

无货源,0基础做电商,6个选品逻辑快速出单!

首先我们要先解决货源问题&#xff0c;再来谈选品逻辑。初入电商行业&#xff0c;进货渠道建议使用1688。首先1688是国内最大的B2B批发平台&#xff0c;平台服务和安全性都提供了一定的保障&#xff0c;以及丰富的货源选择。你可以浏览不同供应商的产品&#xff0c;对比价格、质…

如何关闭WordPress的自动更新功能

Wordpress为什么自动更新 WordPress自动更新是为了提供更好的安全性和稳定性。 安全性&#xff1a;WordPress是一个广泛使用的内容管理系统&#xff0c;因此成为恶意攻击的目标。WordPress的自动更新功能确保你的网站及时获得最新的安全补丁和修复程序&#xff0c;以保护你的网…

【智能优化算法】基于领导者优化的哈里斯鹰优化算法(LHHO)

01.引言 基于领导者优化的哈里斯鹰优化算法leader Harris hawks optimization (LHHO)&#xff0c;以增强Harris hawks optimization (HHO)的搜索能力。通过在探索阶段的适应性栖息和每一代哈里斯鹰的基于领导者的突变选择&#xff0c;可以实现更多的探索。使用经典的23个基准函…

Flink常见面试问题(附答案)

目录 基础篇1. 什么是Apache Flink&#xff1f;2. Flink与Hadoop的区别是什么&#xff1f;3. Flink中的事件时间&#xff08;Event Time&#xff09;和处理时间&#xff08;Processing Time&#xff09;有什么区别&#xff1f;4. Flink的容错机制是如何实现的&#xff1f;5. 什…

node.js 包管理工具介绍 (npm与Yarn详细说明)

一、什么是包&#xff1f; 包&#xff08;package&#xff09;代表了一组特定功能的源码集合 二、什么是包管理工具&#xff1f; 也就是管理包的应用软件&#xff0c;可以对包进行下载、更新、删除、上传等操作。借助包管理工具&#xff0c;可以快速开发项目提升开发效率。包…

4.2.4 理解路由器数据包过程

1、实验目的 通过本实验可以掌握&#xff1a; 了解IP路由原理了解数据包封装和解封装的概念了解路由器路由和交换过程 2、实验拓扑 观察路由器路由数据包过程的实验拓扑如图4-3所示&#xff0c;设备接口地址信息如表4-2所示。 图4-3 观察路由器路由数据包过程的实验拓扑 本…