diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 9e16e4458..e626a2962 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -40,19 +40,6 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, byte #define DEBUG_PRINTF_P(x...) #endif -// ESP8266 has 1 MHz clock -#ifdef ESP8266 - #define CLOCK_FREQUENCY 1e6f -#else - // Use XTAL clock if possible to avoid timer frequency error when setting APB clock < 80 Mhz - // https://github.com/espressif/arduino-esp32/blob/2.0.2/cores/esp32/esp32-hal-ledc.c - #ifdef SOC_LEDC_SUPPORT_XTAL_CLOCK - #define CLOCK_FREQUENCY 40e6f - #else - #define CLOCK_FREQUENCY 80e6f - #endif -#endif - //color mangling macros #define RGBW32(r,g,b,w) (uint32_t((byte(w) << 24) | (byte(r) << 16) | (byte(g) << 8) | (byte(b)))) #define R(c) (byte((c) >> 16)) @@ -398,7 +385,7 @@ BusPwm::BusPwm(BusConfig &bc) unsigned numPins = NUM_PWM_PINS(bc.type); _frequency = bc.frequency ? bc.frequency : WLED_PWM_FREQ; // duty cycle resolution (_depth) can be extracted from this formula: CLOCK_FREQUENCY > _frequency * 2^_depth - _depth = uint8_t(log((float)CLOCK_FREQUENCY / (float)_frequency) / log(2.0)); + for (_depth=MAX_BIT_WIDTH; _depth>8; _depth--) if (((uint32_t(CLOCK_FREQUENCY)/_frequency)>>_depth) > 0) break; #ifdef ESP8266 analogWriteRange((1<<_depth)-1); diff --git a/wled00/const.h b/wled00/const.h index 0ff70e47d..110ef9f0d 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -521,6 +521,35 @@ #endif #endif +#ifndef CLOCK_FREQUENCY + #ifdef ESP8266 + // 1 MHz clock + #define CLOCK_FREQUENCY 1e6f + #else + // Use XTAL clock if possible to avoid timer frequency error when setting APB clock < 80 Mhz + // https://github.com/espressif/arduino-esp32/blob/2.0.2/cores/esp32/esp32-hal-ledc.c + #ifdef SOC_LEDC_SUPPORT_XTAL_CLOCK + #define CLOCK_FREQUENCY 40e6f + #else + #define CLOCK_FREQUENCY 80e6f + #endif + #endif +#endif + +#ifndef MAX_BIT_WIDTH + #ifdef ESP8266 + #define MAX_BIT_WIDTH 10 + #else + #ifdef SOC_LEDC_TIMER_BIT_WIDE_NUM + // C6/H2/P4: 20 bit, S2/S3/C2/C3: 14 bit + #define MAX_BIT_WIDTH SOC_LEDC_TIMER_BIT_WIDE_NUM + #else + // ESP32: 32 bit + #define MAX_BIT_WIDTH 20 + #endif + #endif +#endif + #define TOUCH_THRESHOLD 32 // limit to recognize a touch, higher value means more sensitive // Size of buffer for API JSON object (increase for more segments)