1 ESP32上的PWM资源
ESP32本身提供了两种PWM输出,分别是
1.1 LED PWM 控制器 (LEDC)
ESP32上提供最高16路 LEDC的PWM输出,其中8路为高速PWM,8路为低速PWM,而高低速通道都分别含有4个对应的高/低速时钟。
该PWM输出主要针对LED的驱动(但实际应用中不限制)。这个针对是因为其预定义了类似逐渐增加占空比等操作,可以在不占用处理器资源的情况下,实现对亮度(幅值)和颜色(频率)的调控。
1.2 电机控制脉宽调制器 (MCPWM)
ESP32提供6个该PWM输出,含有两个MCPWM外设,每个外设可以提供3个PWM通道。
该PWM个人理解是包含更多高级的功能,但对于PWM波形的控制则相对没有LEDC的精细。
结构如下图所示,可以看到除了分频器、计时器、和操作器外,还包含了错误检测,专用捕获模块(例如捕获电机转速等)
2 ESP32-Arduino使用PWM资源
首先,上述的两个资源并不都在ESP32-Arduino上提供支持,仅LEDC提供支持(查询支持的外设)。
因此我们下文主要集中在LEDC中。但参考上一篇blogESP32+Arduino+VS code开发环境搭建+BLINK,若确实需要MCPWM,可以考虑在程序中调用ESP-IDF的语法去使用,这应该是可能的。
2.1 LEDC的频率与解析度
与Arduino Uno板的8位固定PWM解析度不同,ESP32的PWM解析度是动态的,与设定相关。
解析度:即输出PWM波输出中,对时间的离散化精度,对应的结果,若是等频率,改变占空比以改变等效幅值的应用中,会得到更精细的等效电压输出。例如,对于UNO,8位的解析度,则最小的变化电压是1/256*3.3V=0.01289V,而若是10位的解析度,则为0.0032V。
对于ESP32的LEDC输出,其最高解析度可以根据下式计算并向下取整,具体原因可参照下一节的解析。
[ l o g 2 ( 80 M H z P W M 输 出 频 率 ) ] f l o o r [log_2(\frac{80MHz}{PWM输出频率})]_{floor} [log2(PWM输出频率80MHz)]floor