当前位置: 首页 > news >正文

一起玩儿物联网人工智能小车(ESP32)——21. ESP32的LED PWM控制器说明

摘要:本文介绍ESP32的LED PWM控制器的详细原理说明

ESP32芯片提供了2种用于输出PWM的信号的PWM控制器,一种LED控制器(LEDC),一种是马达PWM控制器(MCPWM)。其中MCPWM是专门用于马达调速控制的控制器,这个留在以后再讲解。今天讲解相对简单的LEDC。

LEDC虽然叫LED控制器,是主要用来控制LED,但其产生的信号用于其他设备的控制也是没有问题的。

LEDC是指LED PWM控制器,它有16路外接通道,其中8路为高速通道,另外8路为低速通道。每一个通道都可以使用不同的时钟源。

高速通道模式在硬件中实现,可以自动且无干扰地改变PWM占空比。而低速通道模式下的PWM占空比则需要由软件中的驱动器改变。高速模式的优点是可平稳地改变定时器设置。也就是说,高速模式下如定时器设置改变,在该定时器的下一次溢出中断后自动生效。而更新低速定时器的设置时,并不会自动生效,需要由软件通过函数调用来使其生效。

在使用LED PWM控制器生成PWM信号时,首先需要进行以下两个设置:

一、定时器配置

在进行定时器的配置时,需要给出以下一些信息:

  1. 速度模式,也就是使用LEDC的高速模式还是低速模式。
  2. 定时器索引,指定使用哪一个定时器。
  3. PWM信号频率,用于指定生成PWM信号的频率。
  4. PWM信号占空比分辨率,这个参数决定着PWM信号的占空比。PWM信号的频率参数和占空比分辨率是相关联的,频率越高,占空比分辨率越低,反之亦然。
  5. 时钟源,指定LEDC所使用的时钟源,这个时钟源也与PWM信号频率相关,时钟源的频率越高,可以配置的PWM信号频率上限也就越高。

下表列举了ESP32 LEDC时钟源的时钟频率、速度模式和相关特性:Á

时钟名称

时钟频率

速度模式

时钟功能

APB_CLK

80 MHz

高速 / 低速

/

REF_TICK

1 MHz

高速 / 低速

支持动态调频 (DFS) 功能

RC_FAST_CLK

~ 8 MHz

低速

支持动态调频(DFS)功能,支持 Light-sleep 模式

那么PWM信号占空比最大分辨率与指定的时钟源频率、输出的PWM信号频率之间的关系如下公式所示:

其中:floor()函数为向下取整。

下表为不同时钟源对应常用的PWM信号频率的PWM信号占空比最大分辨率和PWM信号的最高精度。

LEDC时钟源

LEDC输出(PWM)频率

占空比最大分辨率

最高精度

APB_CLK (80 MHz)

1 kHz

16 bit

1/65536

APB_CLK (80 MHz)

5 kHz

13 bit

1/8192

APB_CLK (80 MHz)

10 kHz

12 bit

1/4096

RTC8M_CLK (8 MHz)

1 kHz

12 bit

1/4096

RTC8M_CLK (8 MHz)

8 kHz

9 bit

1/512

REF_TICK (1 MHz)

1 kHz

9 bit

1/512

所以,在开发的时候,要依据计划输出的PWM信号的频率和可以选取的时钟源来计算出所生成PWM信号占空比的最高精度,以此来判断是否满足设计的要求。

配置完LEDC的定时器后,还需要进行通道配置。

二、通道配置

通道配置的有些参数与前面定时器配置的参数含义相同,这里就不解释了。最主要的不同就是要指定PWM信号输出GPIO引脚,也就是由那个GPIO引脚输出PWM信号。在选择GPIO引脚的时候同样要注意之前说的注意事项。最关键的就是两点,一是有特殊功能且被占用的引脚不能使用,另一个就是只有输入功能的GPIO不能使用。

在完成通道的配置后,该通道便开始运行,并在选定的GPIO引脚上生成由定时器设置指定的频率和占空比的PWM信号。

PWM信号在输出的过程中,开发人员还可以通过软件来改变PWM信号的频率和占空比。另外,LEDC也提供了硬件自动改变占空比,也就是不在CPU的干预下,可以自动的改变输出PWM信号的占空比,这个功能主要用来实现LED的颜色和亮度的渐变。

好了,ESP32的LEDC PWM控制器的基本知识就介绍到这里了,似乎有些复杂,一时理解不了也没关系,初期能够照着例子把程序做出来就可以了。这么多参数也不是都需要配置的,开发软件会给很多参数选取合适的默认值。所以,真正开发起来,并不是那么的难。

今天就到这里了,接下来会讲解如何用Mixly实现PWM波形的输出。

相关文章:

  • List常见方法和遍历操作
  • Linux Shell 017-文本行合并工具paste
  • Spring Boot IO官方文档中文版
  • 雨课堂作业整理
  • 几代WiFi有什么差异,它们有什么区别
  • Python---多进程---多线程
  • <JavaEE> TCP 的通信机制(四) -- 流量控制 和 拥塞控制
  • Python 中的运算符介绍(1)
  • 第二节 linux操作系统安装与配置
  • 进阶学习——Linux系统磁盘管理与文件系统
  • 4、内存泄漏检测(多线程)
  • 【网络安全 | Misc】miss_01 太湖杯
  • OSPF的DR与BDR-新版(16)
  • MariaDB单机多实例的配置方法
  • Vue - 使用Element UI Upload / importExcelJs进行文件导入
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • C++11: atomic 头文件
  • Java 网络编程(2):UDP 的使用
  • JavaScript 奇技淫巧
  • js
  • nfs客户端进程变D,延伸linux的lock
  • nodejs:开发并发布一个nodejs包
  • react 代码优化(一) ——事件处理
  • React中的“虫洞”——Context
  • vue.js框架原理浅析
  • 彻底搞懂浏览器Event-loop
  • 分布式熔断降级平台aegis
  • 复习Javascript专题(四):js中的深浅拷贝
  • 前端设计模式
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 怎么把视频里的音乐提取出来
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #HarmonyOS:软件安装window和mac预览Hello World
  • $.ajax,axios,fetch三种ajax请求的区别
  • (1)SpringCloud 整合Python
  • (八十八)VFL语言初步 - 实现布局
  • (分布式缓存)Redis持久化
  • (六)软件测试分工
  • (南京观海微电子)——COF介绍
  • (三)模仿学习-Action数据的模仿
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转)Oracle 9i 数据库设计指引全集(1)
  • ***检测工具之RKHunter AIDE
  • .axf 转化 .bin文件 的方法
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Net MVC4 上传大文件,并保存表单
  • .Net 转战 Android 4.4 日常笔记(4)--按钮事件和国际化
  • .NET开发人员必知的八个网站