ESP32芯片提供了2种用于输出PWM的信号的PWM控制器,一种LED控制器(LEDC),一种是马达PWM控制器(MCPWM)。其中MCPWM是专门用于马达调速控制的控制器,这个留在以后再讲解。今天讲解相对简单的LEDC。
LEDC虽然叫LED控制器,是主要用来控制LED,但其产生的信号用于其他设备的控制也是没有问题的。
LEDC是指LED PWM控制器,它有16路外接通道,其中8路为高速通道,另外8路为低速通道。每一个通道都可以使用不同的时钟源。
高速通道模式在硬件中实现,可以自动且无干扰地改变PWM占空比。而低速通道模式下的PWM占空比则需要由软件中的驱动器改变。高速模式的优点是可平稳地改变定时器设置。也就是说,高速模式下如定时器设置改变,在该定时器的下一次溢出中断后自动生效。而更新低速定时器的设置时,并不会自动生效,需要由软件通过函数调用来使其生效。
在使用LED PWM控制器生成PWM信号时,首先需要进行以下两个设置:
一、定时器配置
在进行定时器的配置时,需要给出以下一些信息:
- 速度模式,也就是使用LEDC的高速模式还是低速模式。
- 定时器索引,指定使用哪一个定时器。
- PWM信号频率,用于指定生成PWM信号的频率。
- PWM信号占空比分辨率,这个参数决定着PWM信号的占空比。PWM信号的频率参数和占空比分辨率是相关联的,频率越高,占空比分辨率越低,反之亦然。
- 时钟源,指定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波形的输出。