From fb81668aabd169e43467675824b81b1a3691fc26 Mon Sep 17 00:00:00 2001 From: IhorNehrutsa Date: Wed, 5 Jul 2023 16:11:48 +0300 Subject: [PATCH] fix(ledc): fix frequency calculation ledc.c: Fix frequency calculation. Round int instead of truncate. Merges https://github.com/espressif/esp-idf/pull/11810 --- components/driver/ledc.c | 2 +- components/driver/test/test_ledc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/driver/ledc.c b/components/driver/ledc.c index 7f33fd184b..c2dc41ad0d 100644 --- a/components/driver/ledc.c +++ b/components/driver/ledc.c @@ -840,7 +840,7 @@ uint32_t ledc_get_freq(ledc_mode_t speed_mode, ledc_timer_t timer_num) ESP_LOGW(LEDC_TAG, "LEDC timer not configured, call ledc_timer_config to set timer frequency"); return 0; } - return ((uint64_t) src_clk_freq << 8) / precision / clock_divider; + return (((uint64_t) src_clk_freq << LEDC_LL_FRACTIONAL_BITS) + (uint64_t) precision * clock_divider / 2) / precision / clock_divider; } static inline void ledc_calc_fade_end_channel(uint32_t *fade_end_status, uint32_t *channel) diff --git a/components/driver/test/test_ledc.c b/components/driver/test/test_ledc.c index 94b58667e5..4387423f6e 100644 --- a/components/driver/test/test_ledc.c +++ b/components/driver/test/test_ledc.c @@ -478,7 +478,7 @@ static void timer_frequency_test(ledc_channel_t channel, ledc_timer_bit_t timer_ TEST_ESP_OK(ledc_timer_config(&ledc_time_config)); frequency_set_get(ledc_ch_config.speed_mode, ledc_ch_config.timer_sel, 100, 100, 20); frequency_set_get(ledc_ch_config.speed_mode, ledc_ch_config.timer_sel, 5000, 5000, 50); - frequency_set_get(ledc_ch_config.speed_mode, ledc_ch_config.timer_sel, 9000, 8992, 50); + frequency_set_get(ledc_ch_config.speed_mode, ledc_ch_config.timer_sel, 9000, 8993, 50); } TEST_CASE("LEDC set and get frequency", "[ledc][timeout=60][ignore]")