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 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^&A#K6FCDRtf=1_lP664!_l$I_CF{33=R zPj`PGsJI|VJUG9!C^?nEB{)ig?g?@8j?8=^6}CH}!+3 zi(^Oymnq3VX9bj~a zt7(aYU#$_d%+34MoGn5~=S@b}GWe=gnMt8I?R ze3_8kyLkO!-y&lP=7-PI@3YzR|Np|UX}w)t=}p<>10E;JRX63gnLeN8;i958J6l=# zL23WZoyRYE_Ar`!S|;J6%(+bdm>PehwbW_@`#rnQe-G`+DQ-S--fsV`%CRuzy0p+^WE3wKdyPxvwgq*@;NNFt+hW+^ZmB3yR%SJWszyg z_ebHLZx;Uel=uDX^xgCSU0Hgg?}5JjO>_taDp0m;Ueq%~@-8H2HNiP;o3^{23NZ>=jDGs3%S4C|O#>W#z43rg4 z)cxBhliV5L@sq7JBuDJr{{K6L)9-XKH;82C|6u!d)yk}=#aUMC_q)2{<9Dt~MbyW+ z+_KpF=;4XIm)~q_@65S;{P4@}EoT!9Ii;&O*zUd+$zf4g{$|3*V5ZkK*~<36JLVqy zl3Fi%UFlr;WVUGmPa=}vO+37oSt>?_Ayqx!{?B^5`+NUyU%ct(?eDwg_gTJ~U>f&P z;nKF>*R5~t6Vu%w_KNHL>KPqufvvJ^bMNo-R)2K7VcP#6sneN4kBdlLiTKGNaQ@bo zm&=V(&Ytd%+xGpg{_aP8I-jGf}5mE7mD&> zB5no0Buu7Ota&lF=eu8D;tR!ycCY=L0zYtumG7CiPjAmA%b4>8pEvifMsa=$iu1*r z1^$??@3&&(Z~wz~)v1&D?qhQs!z9stw>IbG= zgz5Sx3Tt=#WV~?G;Dffk&7JK0okdnJR!#S3%AOz3lfC^-wxLj;uzSa+(|P}O4xO;| ziP_vZ@ws-t*75#3)@Spob*>-ZurcxhMD!|jXq9elr3qJMtSQ)zjxO5bB55^+wEyZ$=~_+Q^4%6{P1ogM$5 z$oYS3+U=jX4{l; z`GfC8&ciwHH+tOX$f@VBskvz^v|z=n2f+zvZ#2#-V)?YWUwgh=@=f(ur@GetY(BXx zC8mp^&*e!(a)r$u(b})Pv%1bOWod3wUBsoiQ~i>k(B&6*x1ZOsdTFSful`*{)AQoF zMu9(V2M!%pSvCKdu+F!?;opCMc~oAOA@KGAx8uKpf8BPz&yF`744BC)7V-Ui`NOvg z3uE?tuej}0)bH)?$euUGz7M8GzDrEHyIC@E3KWoC;L~f z#G7>%tF~P>KX>iS%SjB{u z^DkHL={>R};)}{#b=SvYP48L7>SSBfJ+?V3Rvv88|MVy9ig`%#(eyyOx!eAK4SgHW z^y_|p;+Acq><7|{nKwN}7o|BW6n!(D_SZ4N za>`EjsmAl>{rmMe_w}LbjLR>=u3Y}wd(3r?F%zemsLizuUHd!ijZgcEmRydRC9+u{ z%{oiBRqj`Jr>VNMCR;>qP-uzKvFlZ{8FLSBaP`|VS3Dw4vC{gdspv1gSJLwz)qAxb z_xrI-|Ng`OjPc+8Ki#0dpW!i2ZTywWdnZq{HEs{v!;#N^Fr@Q*cCo+e*5YIp8TCGa zr4sA-j?QH?m=R(8M(DA=Nyiu0TP8IQ7c&`GeA>E|@xc6!6K+qWR{c@@up;%m-vJXb zyY&1>-YTYvuj`U;&Yts$_nF+4a}}R{ad&TD%l&?#FSFs6%$N(EhCdQ-coZ%7&3&Za z=kz3E@$^3hvk!c7-&t-TptS9{vgG-gsw(M|%oC#T)I8?d@F1#upJu-C-du_80)Mt0 zI3%oQXYwgl>?`k5As+n=A3V;4Uu>(lZ2bD{?B{q}{ KvJO_}zFYb9(En#=0~0E5 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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 ".")