From 77f6c9fa25ec0688372283d1cb614e6968b4bcb3 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Thu, 10 Nov 2022 16:01:28 +0100 Subject: [PATCH 1/3] Added example scanning maximum ledc frequencies --- .../AnalogOut/ledcFrequency/ledcFrequency.ino | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino diff --git a/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino b/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino new file mode 100644 index 00000000000..d020a53542f --- /dev/null +++ b/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino @@ -0,0 +1,52 @@ +/* + * This sketch will map the maximum frequency depending on the bit resolution for the current SoC. + * Run the sketch and wait for the Final report. + * Ignore the error messages from incorrect settings such as these: + * "E (4190) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=255" + * + * Date: 10 Nov 2022 + * Author: Tomas Pilny + */ + +#include "soc/soc_caps.h" + +#define PIN 2 + +void setup() { + ledcAttachPin(PIN,analogGetChannel(PIN)); + analogWrite(PIN,128); + + uint32_t min_frequency; + uint32_t max_frequency; + uint32_t frequency; + uint32_t freq_array[SOC_LEDC_TIMER_BIT_WIDE_NUM]; + delay(500); + + for(uint8_t resolution = 1; resolution <= SOC_LEDC_TIMER_BIT_WIDE_NUM; ++resolution){ + freq_array[resolution-1] = 0; + min_frequency = 0; + max_frequency = UINT32_MAX; + while(min_frequency != max_frequency && min_frequency+1 != max_frequency){ + frequency = min_frequency + ((max_frequency-min_frequency)/2); + if(ledcChangeFrequency(analogGetChannel(PIN), frequency, resolution)){ + min_frequency = frequency; + }else{ + max_frequency = frequency; + if(frequency == 1){ // Cannot go lower, report max frequency "0" + frequency = 0; + } + } + } // while not found the maximum + freq_array[resolution-1] = frequency; + } // for all resolutions + + printf("Bit resolution | Max Frequency [Hz]\n"); + for(uint8_t r = 1; r <= SOC_LEDC_TIMER_BIT_WIDE_NUM; ++r){ + printf(" %d | %u\n", r, freq_array[r-1]); + } +} + +void loop() +{ + delay(1000); +} From 0dc130480d7d67d20cd900b1447fcdd3dfbd2ad8 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 11 Nov 2022 08:15:34 +0100 Subject: [PATCH 2/3] Removed unnecessary function call --- .../ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino b/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino index d020a53542f..29028ad1946 100644 --- a/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino +++ b/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino @@ -13,7 +13,6 @@ #define PIN 2 void setup() { - ledcAttachPin(PIN,analogGetChannel(PIN)); analogWrite(PIN,128); uint32_t min_frequency; From d7b5180542b0bc8c8a53ebedf0f582f65d63d987 Mon Sep 17 00:00:00 2001 From: Tomas Pilny Date: Fri, 11 Nov 2022 09:06:59 +0100 Subject: [PATCH 3/3] Added search for Min frequency --- .../AnalogOut/ledcFrequency/ledcFrequency.ino | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino b/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino index 29028ad1946..ced1b4dcef3 100644 --- a/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino +++ b/libraries/ESP32/examples/AnalogOut/ledcFrequency/ledcFrequency.ino @@ -4,7 +4,7 @@ * Ignore the error messages from incorrect settings such as these: * "E (4190) ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution. div_param=255" * - * Date: 10 Nov 2022 + * Date: 11 Nov 2022 * Author: Tomas Pilny */ @@ -18,30 +18,55 @@ void setup() { uint32_t min_frequency; uint32_t max_frequency; uint32_t frequency; - uint32_t freq_array[SOC_LEDC_TIMER_BIT_WIDE_NUM]; - delay(500); + uint32_t successful_frequency; + uint32_t max_freq_array[SOC_LEDC_TIMER_BIT_WIDE_NUM]; + uint32_t min_freq_array[SOC_LEDC_TIMER_BIT_WIDE_NUM]; + // Find Max Frequency for(uint8_t resolution = 1; resolution <= SOC_LEDC_TIMER_BIT_WIDE_NUM; ++resolution){ - freq_array[resolution-1] = 0; + max_freq_array[resolution-1] = 0; min_frequency = 0; max_frequency = UINT32_MAX; + successful_frequency = 0; while(min_frequency != max_frequency && min_frequency+1 != max_frequency){ frequency = min_frequency + ((max_frequency-min_frequency)/2); if(ledcChangeFrequency(analogGetChannel(PIN), frequency, resolution)){ min_frequency = frequency; + successful_frequency = frequency; }else{ max_frequency = frequency; - if(frequency == 1){ // Cannot go lower, report max frequency "0" - frequency = 0; - } } } // while not found the maximum - freq_array[resolution-1] = frequency; + max_freq_array[resolution-1] = successful_frequency; } // for all resolutions - printf("Bit resolution | Max Frequency [Hz]\n"); + // Find Min Frequency + for(uint8_t resolution = 1; resolution <= SOC_LEDC_TIMER_BIT_WIDE_NUM; ++resolution){ + min_freq_array[resolution-1] = 0; + min_frequency = 0; + max_frequency = max_freq_array[resolution-1]; + successful_frequency = max_frequency; + while(min_frequency != max_frequency && min_frequency+1 != max_frequency){ + frequency = min_frequency + ((max_frequency-min_frequency)/2); + if(ledcChangeFrequency(analogGetChannel(PIN), frequency, resolution)){ + max_frequency = frequency; + successful_frequency = frequency; + }else{ + min_frequency = frequency; + } + } // while not found the maximum + min_freq_array[resolution-1] = successful_frequency; + } // for all resolutions + + printf("Bit resolution | Min Frequency [Hz] | Max Frequency [Hz]\n"); for(uint8_t r = 1; r <= SOC_LEDC_TIMER_BIT_WIDE_NUM; ++r){ - printf(" %d | %u\n", r, freq_array[r-1]); + size_t max_len = std::to_string(UINT32_MAX).length(); + printf(" %s%d | %s%u | %s%u\n", + std::string (2 - std::to_string(r).length(), ' ').c_str(), r, + std::string (max_len - std::to_string(min_freq_array[r-1]).length(), ' ').c_str(), + min_freq_array[r-1], + std::string (max_len - std::to_string(max_freq_array[r-1]).length(), ' ').c_str(), + max_freq_array[r-1]); } }