From 2be4a379e2f737e93b61e896d5fc6fb05dae210f Mon Sep 17 00:00:00 2001 From: ImplFerris Date: Thu, 26 Dec 2024 00:13:46 +0530 Subject: [PATCH] ledc explained --- src/core-concepts/images/led-pwm-channels.png | Bin 0 -> 37790 bytes src/core-concepts/pwm/led-pwm-controller.md | 98 +++++++++++++++++- 2 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 src/core-concepts/images/led-pwm-channels.png diff --git a/src/core-concepts/images/led-pwm-channels.png b/src/core-concepts/images/led-pwm-channels.png new file mode 100644 index 0000000000000000000000000000000000000000..95ecc28bc112974478b03f2232cc82f3eb07c982 GIT binary patch literal 37790 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 Nk_Gzn?`T`>|383x8)X0h literal 0 HcmV?d00001 diff --git a/src/core-concepts/pwm/led-pwm-controller.md b/src/core-concepts/pwm/led-pwm-controller.md index 4258d13..aeb24c5 100644 --- a/src/core-concepts/pwm/led-pwm-controller.md +++ b/src/core-concepts/pwm/led-pwm-controller.md @@ -1,6 +1,6 @@ # LED PWM Controller(LEDC) -The ESP32 has LED PWM Controller(LEDC) that generates PWM signals for controlling LEDs(example, dimming effect). However, its functionality isn't limited to LEDs;you can use it for other applications as well. If you are not familiar with PWM(Pulse Width Modulation), i recommend you to check the PWM section [here](../core-concepts/pwm.md). +The ESP32 has LED PWM Controller(LEDC) that generates PWM signals for controlling LEDs(example, dimming effect). However, its functionality isn't limited to LEDs;you can use it for other applications as well. If you are not familiar with PWM(Pulse Width Modulation), i recommend you to check intro to the PWM [here](./index.md). The LEDC includes 16 independent PWM generators and supports a maximum PWM duty cycle resolution of 20 bits. The 16 PWM channels further classified into two types: 8 high speed channel and 8 low speed channels. @@ -12,5 +12,99 @@ The LEDC includes 16 independent PWM generators and supports a maximum PWM duty -The PWM controller can automatically increase or decrease the duty cycle gradually, allowing for smooth fades without using the processor. For more details, refer to page 390 of the [ESP32 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf#ledpwm). +The PWM controller can automatically increase or decrease the duty cycle gradually, allowing for smooth fades without using the processor. + +## Clock Source +A clock source in a microcontroller is like the heartbeat of the system. It gives the microcontroller a regular "tick", which helps it keep track of time and coordinate all its tasks. In the ESP32, you can use different clock sources to manage the timers. + +PWM +Image is taken from the ESP32 technical reference manual + +There are four high-speed clock modules available, which can be assigned to the high-speed channels. The high-speed timer modules in the ESP32 can be clocked by sources such as REF_TICK or APB_CLK. In the esp-hal Rust library, these timers are represented by the timer::Number enum, which includes `Timer0`, `Timer1`, `Timer2`, and `Timer3`. + +There are also four low-speed clock modules available, which can be assigned to the low-speed channels. These low-speed timers can be clocked from either REF_TICK or SLOW_CLOCK. The SLOW_CLOCK source can be either the APB_CLK (80 MHz) or the 8 MHz internal oscillator, with the selection between these sources managed by the LEDC_APB_CLK_SEL setting. + +The esp-hal also defines two enums: one for the high-speed clock source (`HSClockSource`) and another for the low-speed clock source (`LSClockSource`). Currently, both enums have a single entry, `APBClk`. + +For more details, refer to page 390 of the [ESP32 Technical Reference Manual](https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf#ledpwm). + +## Calculating PWM Duty Resolution + +When working with PWM signals in embedded systems, one important aspect to understand is how to calculate the **duty resolution** based on the clock frequency and division factor. The duty resolution determines how finely you can control the duty cycle of a PWM signal. + +These are the formulas taken from the ESP32 technical reference manual but the variable names are simplified. + +### Formula for PWM Signal Frequency + +The frequency of the PWM signal \\( f_{\text{pwm}} \\) can be calculated using the following formula: + +\\[ +f_{\text{pwm}} = \frac{f_{\text{LEDC\_CLK}}}{\text{clock_divider} \cdot 2^{\text{res_bits}}} +\\] + +Where: +- \\( f_{\text{LEDC\_CLK}} \\) is the frequency of the clock source for the PWM timer (e.g., APB_CLK, RC_FAST_CLK, REF_TICK). +- \\( \text{clock_divider} \\) is the division factor for the clock source. +- \\( \text{res_bits} \\) is the duty resolution in bits. + + +### PWM Duty Resolution Formula +This is the formula derived from the previous formula to calculate the desired duty resolution. +\\[ +\text{res_bits} = \log_2 \left( \frac{f_{\text{LEDC\_CLK}}}{f_{\text{pwm}} \cdot \text{clock_divider}} \right) +\\] + +This formula gives the duty resolution in bits, which represents the number of discrete levels available for the duty cycle of the PWM signal. + +### Calculating the Highest Resolution + +The **highest resolution** is achieved when the clock divisor (\\( \text{clock_divider} \\)) is set to 1, meaning no division is applied to the clock. It is calculated as: + +\\[ +\text{Highest Resolution} = \log_2 \left( \frac{f_{\text{LEDC\_CLK}}}{f_{\text{pwm}} \cdot 1} \right) +\\] + +This calculation gives the maximum number of bits that can be used for the duty cycle at a given clock frequency and PWM signal frequency. + +#### Example: + +For a 1 kHz PWM signal with an APB_CLK of 80 MHz: + +\\[ +\text{Highest Resolution} = \log_2 \left( \frac{80,000,000}{1,000 \cdot 1} \right) = \log_2(80,000) \approx 16 +\\] + +Thus, the highest resolution for a 1 kHz PWM signal using an 80 MHz clock is **16 bits**. + +### Calculating the Lowest Resolution +The division factor ranges from 1 ∼ 1023, as per the datasheet. The **lowest resolution** is calculated when the clock divisor is at its maximum value. In this case, the clock divisor is \\( 1023 + \frac{255}{256} \\). The lowest resolution is calculated as: + +\\[ +\text{Lowest Resolution} = \log_2 \left( \frac{f_{\text{LEDC\_CLK}}}{f_{\text{pwm}} \cdot \left( 1023 + \frac{255}{256} \right)} \right) +\\] + +This calculation gives the minimum number of bits required for the duty cycle control at the specified PWM signal frequency. + +#### Example: + +For the same 1 kHz PWM signal with the APB_CLK at 80 MHz: + +\\[ +\text{Lowest Resolution} = \log_2 \left( \frac{80,000,000}{1,000 \cdot 1023.996} \right) = \log_2 \left( \frac{80,000,000}{1,023,996} \right) \approx 6.28 +\\] + +Thus, the lowest resolution for a 1 kHz PWM signal using an 80 MHz clock is **7 bits**. + +### Commonly-used PWM Frequencies and Resolutions + +This table is from the datasheet, summarizes the highest and lowest resolutions for common PWM frequencies with different clock sources: + +| **Clock Source** | **PWM Frequency** | **Highest Resolution (bits)** | **Lowest Resolution (bits)** | +|------------------|-------------------|-------------------------------|------------------------------| +| **APB_CLK (80 MHz)** | 1 kHz | 16 | 7 | +| **APB_CLK (80 MHz)** | 5 kHz | 13 | 4 | +| **APB_CLK (80 MHz)** | 10 kHz | 12 | 3 | +| **RC_FAST_CLK (8 MHz)** | 1 kHz | 12 | 3 | +| **RC_FAST_CLK (8 MHz)** | 2 kHz | 11 | 2 | +| **REF_TICK (1 MHz)** | 1 kHz | 9 | 1 |