[LEDC-3.12] LEDC 递减渐变,duty 值溢出错误

影响版本: v0.0 v1.0 v1.1 v3.0 v3.1

描述

在配置 LEDC 为递减渐变且 LEDC_DUTY_SCALE_HSCHn 为 1 的情况下,当 duty 值为 2LEDC_HSTIMERx_DUTY_RES 时,下一次 duty 变化应该为 2LEDC_HSTIMERx_DUTY_RES – 1,但是实际上 duty 值等于 2LEDC_HSTIMERx_DUTY_RES+1,即出现 duty 值溢出的错误。(HSCHn 代表高速通道,n 为 0-7;HSTIMERx 代表高速定时器,x 为 0-3。)

对于低速通道,存在同样的问题。

变通方法

使用 LEDC 的过程中,应避免以下三个条件同时成立:

  1. LEDC 启动递减渐变功能;

  2. LEDC 渐变过程中 scale 寄存器设置为 1;

  3. LEDC 递减渐变开始时刻或者过程中的某一时刻,duty 值为 2LEDC_HSTIMERx_DUTY_RES 或 2LEDC_LSTIMERx_DUTY_RES

解决方案

此问题在 ESP-IDF commit ID 为 b2e264e 及以后版本的 LEDC 驱动中已自动绕过,并于 ESP-IDF v3.1 中发布。