From dbeae9480d0a6675b9ea95d1710632b26ff37a86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:25:31 +0100 Subject: [PATCH] AnalogWrite - frequency and resolution log errors + returns (#7471) * Added log errors + returns * Update LEDC docs --- cores/esp32/esp32-hal-ledc.c | 17 +++++++++++++---- docs/source/api/ledc.rst | 22 ++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/cores/esp32/esp32-hal-ledc.c b/cores/esp32/esp32-hal-ledc.c index 4b58c1d9a..a02431b58 100644 --- a/cores/esp32/esp32-hal-ledc.c +++ b/cores/esp32/esp32-hal-ledc.c @@ -222,9 +222,12 @@ void analogWrite(uint8_t pin, int value) { log_e("No more analogWrite channels available! You can have maximum %u", LEDC_CHANNELS); return; } + if(ledcSetup(cnt_channel - 1, analog_frequency, analog_resolution) == 0){ + log_e("analogWrite setup failed (freq = %u, resolution = %u). Try setting different resolution or frequency"); + return; + } + ledcAttachPin(pin, cnt_channel - 1); pin_to_channel[pin] = cnt_channel--; - ledcSetup(cnt_channel, analog_frequency, analog_resolution); - ledcAttachPin(pin, cnt_channel); } ledcWrite(pin_to_channel[pin] - 1, value); } @@ -237,7 +240,10 @@ int8_t analogGetChannel(uint8_t pin) { void analogWriteFrequency(uint32_t freq) { if (cnt_channel != LEDC_CHANNELS) { for (int channel = LEDC_CHANNELS - 1; channel >= cnt_channel; channel--) { - ledcChangeFrequency(channel, freq, analog_resolution); + if (ledcChangeFrequency(channel, freq, analog_resolution) == 0){ + log_e("analogWrite frequency cant be set due to selected resolution! Try to adjust resolution first"); + return; + } } } analog_frequency = freq; @@ -250,7 +256,10 @@ void analogWriteResolution(uint8_t bits) { } if (cnt_channel != LEDC_CHANNELS) { for (int channel = LEDC_CHANNELS - 1; channel >= cnt_channel; channel--) { - ledcChangeFrequency(channel, analog_frequency, bits); + if (ledcChangeFrequency(channel, analog_frequency, bits) == 0){ + log_e("analogWrite resolution cant be set due to selected frequency! Try to adjust frequency first"); + return; + } } } analog_resolution = bits; diff --git a/docs/source/api/ledc.rst b/docs/source/api/ledc.rst index b6c728213..a23092e38 100644 --- a/docs/source/api/ledc.rst +++ b/docs/source/api/ledc.rst @@ -169,6 +169,28 @@ It is compatible with Arduinos analogWrite function. * ``value`` select the duty cycle of pwm. * range is from 0 (always off) to 255 (always on). +analogWriteResolution +********************* + +This function is used to set resolution for all analogWrite channels. + +.. code-block:: arduino + + void analogWriteResolution(uint8_t bits); + +* ``bits`` select resolution for analog channels. + +analogWriteFrequency +******************** + +This function is used to set frequency for all analogWrite channels. + +.. code-block:: arduino + + void analogWriteFrequency(uint32_t freq); + +* ``freq`` select frequency of pwm. + Example Applications ********************