From a6798eac98722f866d722ad2c987c99e6a8238bb Mon Sep 17 00:00:00 2001 From: "pedro.minatel" Date: Mon, 12 Apr 2021 15:06:27 +0100 Subject: [PATCH] Added LEDC basic PWM example Changes on the ledc_init function Review on the README, docs and example functions Added how to set freq and duty on README Fix on the ledc.rst docs in the App Example Added new example reference in the Chinese docs --- docs/en/api-reference/peripherals/ledc.rst | 3 +- docs/zh_CN/api-reference/peripherals/ledc.rst | 4 +- .../ledc/{ => ledc_basic}/CMakeLists.txt | 0 examples/peripherals/ledc/ledc_basic/Makefile | 8 ++ .../peripherals/ledc/ledc_basic/README.md | 79 ++++++++++++++++++ .../ledc/ledc_basic/image/ledc_pwm_signal.png | Bin 0 -> 38587 bytes .../ledc/ledc_basic/main/CMakeLists.txt | 2 + .../ledc/{ => ledc_basic}/main/component.mk | 0 .../ledc_basic/main/ledc_basic_example_main.c | 54 ++++++++++++ .../peripherals/ledc/ledc_fade/CMakeLists.txt | 6 ++ .../peripherals/ledc/{ => ledc_fade}/Makefile | 2 +- .../ledc/{ => ledc_fade}/README.md | 8 +- .../ledc/ledc_fade/main/CMakeLists.txt | 2 + .../ledc/ledc_fade/main/component.mk | 3 + .../main/ledc_fade_example_main.c} | 0 examples/peripherals/ledc/main/CMakeLists.txt | 2 - 16 files changed, 166 insertions(+), 7 deletions(-) rename examples/peripherals/ledc/{ => ledc_basic}/CMakeLists.txt (100%) create mode 100644 examples/peripherals/ledc/ledc_basic/Makefile create mode 100644 examples/peripherals/ledc/ledc_basic/README.md create mode 100644 examples/peripherals/ledc/ledc_basic/image/ledc_pwm_signal.png create mode 100644 examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt rename examples/peripherals/ledc/{ => ledc_basic}/main/component.mk (100%) create mode 100644 examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c create mode 100644 examples/peripherals/ledc/ledc_fade/CMakeLists.txt rename examples/peripherals/ledc/{ => ledc_fade}/Makefile (85%) rename examples/peripherals/ledc/{ => ledc_fade}/README.md (74%) create mode 100644 examples/peripherals/ledc/ledc_fade/main/CMakeLists.txt create mode 100644 examples/peripherals/ledc/ledc_fade/main/component.mk rename examples/peripherals/ledc/{main/ledc_example_main.c => ledc_fade/main/ledc_fade_example_main.c} (100%) delete mode 100644 examples/peripherals/ledc/main/CMakeLists.txt diff --git a/docs/en/api-reference/peripherals/ledc.rst b/docs/en/api-reference/peripherals/ledc.rst index f85d4f1ccf..dcda4b7719 100644 --- a/docs/en/api-reference/peripherals/ledc.rst +++ b/docs/en/api-reference/peripherals/ledc.rst @@ -192,8 +192,9 @@ The duty resolution is normally set using :cpp:type:`ledc_timer_bit_t`. This enu Application Example ------------------- -The LEDC change duty cycle and fading control example: :example:`peripherals/ledc`. +The LEDC change duty cycle and fading control example: :example:`peripherals/ledc/ledc_fade`. +The LEDC basic example: :example:`peripherals/ledc/ledc_basic`. API Reference ------------- diff --git a/docs/zh_CN/api-reference/peripherals/ledc.rst b/docs/zh_CN/api-reference/peripherals/ledc.rst index 7695c59eca..fcf197218a 100644 --- a/docs/zh_CN/api-reference/peripherals/ledc.rst +++ b/docs/zh_CN/api-reference/peripherals/ledc.rst @@ -192,7 +192,9 @@ LED PWM 控制器 API 会在设定的频率和占空比分辨率超过 LED PWM 应用实例 ------------------- -LED PWM 改变占空比和渐变控制的实例请参照 :example:`peripherals/ledc`。 +使用 LEDC 改变占空比和渐变控制的实例请参照 :example:`peripherals/ledc/ledc_fade`。 + +使用 LEDC 基本实例请参照 :example:`peripherals/ledc/ledc_basic`。 API 参考 diff --git a/examples/peripherals/ledc/CMakeLists.txt b/examples/peripherals/ledc/ledc_basic/CMakeLists.txt similarity index 100% rename from examples/peripherals/ledc/CMakeLists.txt rename to examples/peripherals/ledc/ledc_basic/CMakeLists.txt diff --git a/examples/peripherals/ledc/ledc_basic/Makefile b/examples/peripherals/ledc/ledc_basic/Makefile new file mode 100644 index 0000000000..63e461d010 --- /dev/null +++ b/examples/peripherals/ledc/ledc_basic/Makefile @@ -0,0 +1,8 @@ +# +# This is a project Makefile. It is assumed the directory this Makefile resides in is a +# project subdirectory. +# + +PROJECT_NAME := ledc_basic + +include $(IDF_PATH)/make/project.mk diff --git a/examples/peripherals/ledc/ledc_basic/README.md b/examples/peripherals/ledc/ledc_basic/README.md new file mode 100644 index 0000000000..6412eda2e1 --- /dev/null +++ b/examples/peripherals/ledc/ledc_basic/README.md @@ -0,0 +1,79 @@ +# _LEDC Basic Example_ + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +This example shows how to use the LEDC to generate a PWM signal using the `LOW SPEED` mode. +To use `HIGH SPEED` mode check if the selected SoC supports this mode. + +## How to use example + +### Hardware Required + +* A development board with ESP32, ESP32-S2, ESP32-C3 or ESP32-S3 SoC (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A USB cable for power supply and programming + +Connect the GPIO to an oscilloscope to see the generated signal: + +|ledc channel| GPIO | +|:----------:|:-----:| +| Channel 0 | GPIO5 | + +### Configure the project + +The example uses fixed PWM frequency of 5 kHz, duty cycle in 50%, and output GPIO pin. To change them, adjust `LEDC_FREQUENCY`, `LEDC_DUTY`, `LEDC_OUTPUT_IO` macros at the top of ledc_basic_example_main.c. + +Depending on the selected `LEDC_FREQUENCY`, you will need to change the `LEDC_DUTY_RES`. + +To dinamicaly set the duty and frequency, you can use the following functions: + +To set the frequency to 2.5 kHZ i.e: + +```c +ledc_set_freq(LEDC_MODE, LEDC_TIMER, 2500); +``` + +Now the duty to 100% i.e: + +```c +ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, 8191); +ledc_update_duty(LEDC_MODE, LEDC_CHANNEL); +``` + +To change the duty cycle you need to calculate the duty range according to the duty resolution. + +If duty resolution is 13 bits: + +Duty range: `0 to (2 ** 13) - 1 = 8191` where 0 is 0% and 8191 is 100%. + +### Build and Flash + +* [ESP-IDF Getting Started Guide](https://idf.espressif.com/) + +Build the project and flash it to the board, then run monitor tool to view serial output: + +```bash +idf.py -p PORT flash monitor +``` + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the Getting Started Guide for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +Running this example, you will see the PWM signal with a duty cycle of 50%. + +![PWM](image/ledc_pwm_signal.png) + +## Troubleshooting + +* Duty Resolution + + * If you get the following error log `ledc: requested frequency and duty resolution can not be achieved, try reducing freq_hz or duty_resolution.` you need to change the `LEDC_DUTY_RES` to a lower resolution and change the range of the duty. + +* Programming fail + + * Hardware connection is not correct: run `idf.py -p PORT monitor`, and reboot your board to see if there are any output logs. + * The baud rate for downloading is too high: lower your baud rate in the `menuconfig` menu, and try again. + +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/ledc/ledc_basic/image/ledc_pwm_signal.png b/examples/peripherals/ledc/ledc_basic/image/ledc_pwm_signal.png new file mode 100644 index 0000000000000000000000000000000000000000..31a77974fadb6e43382cb97f254542ade94a85af GIT binary patch literal 38587 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
  • A-8T$8m^ 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 literal 0 HcmV?d00001 diff --git a/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt b/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt new file mode 100644 index 0000000000..04207465b2 --- /dev/null +++ b/examples/peripherals/ledc/ledc_basic/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "ledc_basic_example_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/ledc/main/component.mk b/examples/peripherals/ledc/ledc_basic/main/component.mk similarity index 100% rename from examples/peripherals/ledc/main/component.mk rename to examples/peripherals/ledc/ledc_basic/main/component.mk diff --git a/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c new file mode 100644 index 0000000000..f4f97b7200 --- /dev/null +++ b/examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c @@ -0,0 +1,54 @@ +/* LEDC (LED Controller) basic example + + This example code is in the Public Domain (or CC0 licensed, at your option.) + + Unless required by applicable law or agreed to in writing, this + software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + CONDITIONS OF ANY KIND, either express or implied. +*/ +#include +#include "driver/ledc.h" +#include "esp_err.h" + +#define LEDC_TIMER LEDC_TIMER_0 +#define LEDC_MODE LEDC_LOW_SPEED_MODE +#define LEDC_OUTPUT_IO (5) // Define the output GPIO +#define LEDC_CHANNEL LEDC_CHANNEL_0 +#define LEDC_DUTY_RES LEDC_TIMER_13_BIT // Set duty resolution to 13 bits +#define LEDC_DUTY (4095) // Set duty to 50%. ((2 ** 13) - 1) * 50% = 4095 +#define LEDC_FREQUENCY (5000) // Frequency in Hertz. Set frequency at 5 kHz + +static void example_ledc_init(void) +{ + // Prepare and then apply the LEDC PWM timer configuration + ledc_timer_config_t ledc_timer = { + .speed_mode = LEDC_MODE, + .timer_num = LEDC_TIMER, + .duty_resolution = LEDC_DUTY_RES, + .freq_hz = LEDC_FREQUENCY, // Set output frequency at 5 kHz + .clk_cfg = LEDC_AUTO_CLK + }; + ESP_ERROR_CHECK(ledc_timer_config(&ledc_timer)); + + // Prepare and then apply the LEDC PWM channel configuration + ledc_channel_config_t ledc_channel = { + .speed_mode = LEDC_MODE, + .channel = LEDC_CHANNEL, + .timer_sel = LEDC_TIMER, + .intr_type = LEDC_INTR_DISABLE, + .gpio_num = LEDC_OUTPUT_IO, + .duty = 0, // Set duty to 0% + .hpoint = 0 + }; + ESP_ERROR_CHECK(ledc_channel_config(&ledc_channel)); +} + +void app_main(void) +{ + // Set the LEDC peripheral configuration + example_ledc_init(); + // Set duty to 50% + ESP_ERROR_CHECK(ledc_set_duty(LEDC_MODE, LEDC_CHANNEL, LEDC_DUTY)); + // Update duty to apply the new value + ESP_ERROR_CHECK(ledc_update_duty(LEDC_MODE, LEDC_CHANNEL)); +} diff --git a/examples/peripherals/ledc/ledc_fade/CMakeLists.txt b/examples/peripherals/ledc/ledc_fade/CMakeLists.txt new file mode 100644 index 0000000000..be4cb22e48 --- /dev/null +++ b/examples/peripherals/ledc/ledc_fade/CMakeLists.txt @@ -0,0 +1,6 @@ +# The following lines of boilerplate have to be in your project's CMakeLists +# in this exact order for cmake to work correctly +cmake_minimum_required(VERSION 3.5) + +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(ledc_fade) diff --git a/examples/peripherals/ledc/Makefile b/examples/peripherals/ledc/ledc_fade/Makefile similarity index 85% rename from examples/peripherals/ledc/Makefile rename to examples/peripherals/ledc/ledc_fade/Makefile index b198310347..b4c762786d 100644 --- a/examples/peripherals/ledc/Makefile +++ b/examples/peripherals/ledc/ledc_fade/Makefile @@ -3,6 +3,6 @@ # project subdirectory. # -PROJECT_NAME := ledc +PROJECT_NAME := ledc_fade include $(IDF_PATH)/make/project.mk diff --git a/examples/peripherals/ledc/README.md b/examples/peripherals/ledc/ledc_fade/README.md similarity index 74% rename from examples/peripherals/ledc/README.md rename to examples/peripherals/ledc/ledc_fade/README.md index 980361cc79..ccc010e0ad 100644 --- a/examples/peripherals/ledc/README.md +++ b/examples/peripherals/ledc/ledc_fade/README.md @@ -1,4 +1,4 @@ -# _LEDC Example_ +# _LEDC Fade Example_ (See the README.md file in the upper level 'examples' directory for more information about examples.) @@ -28,6 +28,10 @@ idf.py menuconfig ### Build and Flash +* [ESP-IDF Getting Started Guide on ESP32](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html) +* [ESP-IDF Getting Started Guide on ESP32-S2](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/get-started/index.html) +* [ESP-IDF Getting Started Guide on ESP32-C3](https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/get-started/index.html) + Build the project and flash it to the board, then run monitor tool to view serial output: ``` @@ -64,4 +68,4 @@ you can also see the following output log on the serial monitor: * Hardware connection is not correct: run `idf.py -p PORT monitor`, and reboot your board to see if there are any output logs. * The baud rate for downloading is too high: lower your baud rate in the `menuconfig` menu, and try again. -For any technical queries, please open an [issue] (https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. +For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon. diff --git a/examples/peripherals/ledc/ledc_fade/main/CMakeLists.txt b/examples/peripherals/ledc/ledc_fade/main/CMakeLists.txt new file mode 100644 index 0000000000..7602af34bd --- /dev/null +++ b/examples/peripherals/ledc/ledc_fade/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "ledc_fade_example_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/ledc/ledc_fade/main/component.mk b/examples/peripherals/ledc/ledc_fade/main/component.mk new file mode 100644 index 0000000000..44bd2b5273 --- /dev/null +++ b/examples/peripherals/ledc/ledc_fade/main/component.mk @@ -0,0 +1,3 @@ +# +# Main Makefile. This is basically the same as a component makefile. +# diff --git a/examples/peripherals/ledc/main/ledc_example_main.c b/examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c similarity index 100% rename from examples/peripherals/ledc/main/ledc_example_main.c rename to examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c diff --git a/examples/peripherals/ledc/main/CMakeLists.txt b/examples/peripherals/ledc/main/CMakeLists.txt deleted file mode 100644 index b3933e0d20..0000000000 --- a/examples/peripherals/ledc/main/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -idf_component_register(SRCS "ledc_example_main.c" - INCLUDE_DIRS ".")