From 169a43b8ebc3ee0d7f15036d2d8e46db360308fd Mon Sep 17 00:00:00 2001 From: morris Date: Sat, 28 May 2022 17:06:06 +0800 Subject: [PATCH] example: update MCPWM sync example with new driver API --- .../CMakeLists.txt | 2 +- .../peripherals/mcpwm/mcpwm_sync/README.md | 88 ++++++++ .../mcpwm/mcpwm_sync/main/CMakeLists.txt | 2 + .../mcpwm/mcpwm_sync/main/Kconfig.projbuild | 20 ++ .../mcpwm_sync/main/mcpwm_sync_example_main.c | 211 ++++++++++++++++++ .../mcpwm/mcpwm_sync/pytest_mcpwm_sync.py | 24 ++ .../mcpwm/mcpwm_sync/sdkconfig.ci.gpio | 1 + .../mcpwm/mcpwm_sync/sdkconfig.ci.soft | 1 + .../mcpwm/mcpwm_sync/sdkconfig.ci.tez | 1 + .../mcpwm/mcpwm_sync_example/README.md | 74 ------ .../mcpwm_sync_example/main/CMakeLists.txt | 2 - .../main/mcpwm_sync_example.c | 146 ------------ .../mcpwm_sync_example/readme_res/overall.png | Bin 35797 -> 0 bytes .../readme_res/sync_phase.png | Bin 10151 -> 0 bytes .../mcpwm_sync_example/readme_res/synced.png | Bin 16120 -> 0 bytes 15 files changed, 349 insertions(+), 223 deletions(-) rename examples/peripherals/mcpwm/{mcpwm_sync_example => mcpwm_sync}/CMakeLists.txt (88%) create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/README.md create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/main/CMakeLists.txt create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/main/Kconfig.projbuild create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/main/mcpwm_sync_example_main.c create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.gpio create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.soft create mode 100644 examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.tez delete mode 100644 examples/peripherals/mcpwm/mcpwm_sync_example/README.md delete mode 100644 examples/peripherals/mcpwm/mcpwm_sync_example/main/CMakeLists.txt delete mode 100644 examples/peripherals/mcpwm/mcpwm_sync_example/main/mcpwm_sync_example.c delete mode 100644 examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/overall.png delete mode 100644 examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/sync_phase.png delete mode 100644 examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/synced.png diff --git a/examples/peripherals/mcpwm/mcpwm_sync_example/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_sync/CMakeLists.txt similarity index 88% rename from examples/peripherals/mcpwm/mcpwm_sync_example/CMakeLists.txt rename to examples/peripherals/mcpwm/mcpwm_sync/CMakeLists.txt index ba6c087f5d..7bfcd825e0 100644 --- a/examples/peripherals/mcpwm/mcpwm_sync_example/CMakeLists.txt +++ b/examples/peripherals/mcpwm/mcpwm_sync/CMakeLists.txt @@ -3,4 +3,4 @@ cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) -project(mcpwm_sync_example) +project(mcpwm_sync) diff --git a/examples/peripherals/mcpwm/mcpwm_sync/README.md b/examples/peripherals/mcpwm/mcpwm_sync/README.md new file mode 100644 index 0000000000..983731e2d0 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/README.md @@ -0,0 +1,88 @@ +| Supported Targets | ESP32 | ESP32-S3 | +| ----------------- | ----- | -------- | + +# MCPWM Sync Example + +(See the README.md file in the upper level 'examples' directory for more information about examples.) + +MCPWM timers can't be started together because you have to call **mcpwm_timer_start_stop** function timer by timer, so the generators driven by them are not in sync with each other. But there're several ways to force these timers jump to the same point by setting sync phase for timers and then wait for a proper sync event to happen. + +This example illustrates how to generate three PWMs that are in perfect synchronization. + +## How to Use Example + +### Hardware Required + +* A development board with any Espressif SoC which features MCPWM peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A USB cable for Power supply and programming + +It is recommended to have an oscilloscope or logic analyzer to view the generated PWM waveforms. + +Connection : + +``` + ESP Board oscilloscope / logic analyzer ++--------------------------+ +----------------------------+ +| | | | +| EXAMPLE_GEN_GPIO0 +-----------------+ channelA | +| | | | +| EXAMPLE_GEN_GPIO1 +-----------------+ channelB | +| | | | +| EXAMPLE_GEN_GPIO2 +-----------------+ channelC | +| | | | +| GND +-----------------+ GND | +| | | | ++--------------------------+ +----------------------------+ +``` + +Above used GPIO numbers (e.g. `EXAMPLE_GEN_GPIO0`) can be changed in [the source file](main/mcpwm_sync_example_main.c). + +### Configure the project + +``` +idf.py menuconfig +``` + +You can select the way to synchronize the MCPWM timers in the menu: `Example Configuration` -> `Where the sync event is generated from`. + +* GPIO + * This approach will consume a GPIO, where a configurable pulse on the GPIO is treated as the sync event. And the sync event is routed to each MCPWM timers. +* Timer TEZ + * This approach won't consume any GPIO, the sync even is generated by a main timer, and then routed to other MCPWM timers. The drawback of this approach is, the main timer will have a tiny phase shift to other two timers. +* Software (optional) + * This approach won't consume any GPIO as well and also doesn't have the drawback in the `Timer TEZ` approach. The main timer is sync by software, and it will propagate the sync event to other timers. + +### Build and Flash + +Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. + +(To exit the serial monitor, type ``Ctrl-]``.) + +See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. + +## Example Output + +``` +I (0) cpu_start: Starting scheduler on APP CPU. +I (305) example: Create timers +I (305) example: Create operators +I (305) example: Connect timers and operators with each other +I (315) example: Create comparators +I (315) example: Create generators +I (325) gpio: GPIO[0]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (335) gpio: GPIO[2]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (345) gpio: GPIO[4]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (355) example: Set generator actions on timer and compare event +I (355) example: Start timers one by one, so they are not synced +I (495) example: Force the output level to low, timer still running +I (495) example: Setup sync strategy +I (495) example: Create GPIO sync source +I (495) gpio: GPIO[5]| InputEn: 1| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 1| Intr:0 +I (505) example: Set timers to sync on the GPIO +I (505) example: Trigger a pulse on the GPIO as a sync event +I (515) example: Now the output PWMs should in sync +``` + +## Troubleshooting + +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/mcpwm/mcpwm_sync/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_sync/main/CMakeLists.txt new file mode 100644 index 0000000000..cdf25dbaf1 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/main/CMakeLists.txt @@ -0,0 +1,2 @@ +idf_component_register(SRCS "mcpwm_sync_example_main.c" + INCLUDE_DIRS ".") diff --git a/examples/peripherals/mcpwm/mcpwm_sync/main/Kconfig.projbuild b/examples/peripherals/mcpwm/mcpwm_sync/main/Kconfig.projbuild new file mode 100644 index 0000000000..3bb0fe9fee --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/main/Kconfig.projbuild @@ -0,0 +1,20 @@ +menu "Example Configuration" + + choice EXAMPLE_SYNC_FROM + prompt "Where the sync event is generated from" + default EXAMPLE_SYNC_FROM_GPIO + help + Select MCPWM sync source. + + config EXAMPLE_SYNC_FROM_GPIO + bool "GPIO" + + config EXAMPLE_SYNC_FROM_TEZ + bool "Timer TEZ" + + config EXAMPLE_SYNC_FROM_SOFT + bool "Software" + depends on SOC_MCPWM_SWSYNC_CAN_PROPAGATE + endchoice + +endmenu diff --git a/examples/peripherals/mcpwm/mcpwm_sync/main/mcpwm_sync_example_main.c b/examples/peripherals/mcpwm/mcpwm_sync/main/mcpwm_sync_example_main.c new file mode 100644 index 0000000000..e68bb3c96b --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/main/mcpwm_sync_example_main.c @@ -0,0 +1,211 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Unlicense OR CC0-1.0 + */ + +#include "sdkconfig.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_log.h" +#include "driver/mcpwm_prelude.h" +#include "driver/gpio.h" + +const static char *TAG = "example"; + +#define EXAMPLE_TIMER_RESOLUTION_HZ 1000000 // 1MHz, 1us per tick +#define EXAMPLE_TIMER_PERIOD 1000 // 1000 ticks, 1ms +#define EXAMPLE_GEN_GPIO0 0 +#define EXAMPLE_GEN_GPIO1 2 +#define EXAMPLE_GEN_GPIO2 4 +#define EXAMPLE_SYNC_GPIO 5 + +#if CONFIG_EXAMPLE_SYNC_FROM_GPIO +static void example_setup_sync_strategy(mcpwm_timer_handle_t timers[]) +{ + // +----GPIO----+ + // | | | + // | | | + // v v v + // timer0 timer1 timer2 + ESP_LOGI(TAG, "Create GPIO sync source"); + mcpwm_sync_handle_t gpio_sync_source = NULL; + mcpwm_gpio_sync_src_config_t gpio_sync_config = { + .group_id = 0, // GPIO fault should be in the same group of the above timers + .gpio_num = EXAMPLE_SYNC_GPIO, + .flags.pull_down = true, + .flags.active_neg = false, // by default, a posedge pulse can trigger a sync event + .flags.io_loop_back = true, // then we can trigger a sync event using `gpio_set_level` on the same GPIO + }; + ESP_ERROR_CHECK(mcpwm_new_gpio_sync_src(&gpio_sync_config, &gpio_sync_source)); + + ESP_LOGI(TAG, "Set timers to sync on the GPIO"); + mcpwm_timer_sync_phase_config_t sync_phase_config = { + .count_value = 0, + .direction = MCPWM_TIMER_DIRECTION_UP, + .sync_src = gpio_sync_source, + }; + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_timer_set_phase_on_sync(timers[i], &sync_phase_config)); + } + + ESP_LOGI(TAG, "Trigger a pulse on the GPIO as a sync event"); + gpio_set_level(EXAMPLE_SYNC_GPIO, 0); + gpio_set_level(EXAMPLE_SYNC_GPIO, 1); +} +#endif // CONFIG_EXAMPLE_SYNC_FROM_GPIO + +#if CONFIG_EXAMPLE_SYNC_FROM_TEZ +static void example_setup_sync_strategy(mcpwm_timer_handle_t timers[]) +{ + // +->timer1 + // (TEZ) | + // timer0---+ + // | + // +->timer2 + ESP_LOGI(TAG, "Create TEZ sync source from timer0"); + mcpwm_sync_handle_t timer_sync_source = NULL; + mcpwm_timer_sync_src_config_t timer_sync_config = { + .timer_event = MCPWM_TIMER_EVENT_EMPTY, // generate sync event on timer empty + }; + ESP_ERROR_CHECK(mcpwm_new_timer_sync_src(timers[0], &timer_sync_config, &timer_sync_source)); + + ESP_LOGI(TAG, "Set other timers sync to the first timer"); + mcpwm_timer_sync_phase_config_t sync_phase_config = { + .count_value = 0, + .direction = MCPWM_TIMER_DIRECTION_UP, + .sync_src = timer_sync_source, + }; + for (int i = 1; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_timer_set_phase_on_sync(timers[i], &sync_phase_config)); + } + + ESP_LOGI(TAG, "Wait some time for the timer TEZ event"); + vTaskDelay(pdMS_TO_TICKS(10)); +} +#endif // CONFIG_EXAMPLE_SYNC_FROM_TEZ + +#if CONFIG_EXAMPLE_SYNC_FROM_SOFT +static void example_setup_sync_strategy(mcpwm_timer_handle_t timers[]) +{ + // soft + // | + // v + // +-timer0--+ + // | | + // v v + // timer1 timer2 + ESP_LOGI(TAG, "Create software sync source"); + mcpwm_sync_handle_t soft_sync_source = NULL; + mcpwm_soft_sync_config_t soft_sync_config = {}; + ESP_ERROR_CHECK(mcpwm_new_soft_sync_src(&soft_sync_config, &soft_sync_source)); + + ESP_LOGI(TAG, "Create timer sync source to propagate the sync event"); + mcpwm_sync_handle_t timer_sync_source; + mcpwm_timer_sync_src_config_t timer_sync_config = { + .flags.propagate_input_sync = true, + }; + ESP_ERROR_CHECK(mcpwm_new_timer_sync_src(timers[0], &timer_sync_config, &timer_sync_source)); + + ESP_LOGI(TAG, "Set sync phase for timers"); + mcpwm_timer_sync_phase_config_t sync_phase_config = { + .count_value = 0, + .direction = MCPWM_TIMER_DIRECTION_UP, + .sync_src = soft_sync_source, + }; + ESP_ERROR_CHECK(mcpwm_timer_set_phase_on_sync(timers[0], &sync_phase_config)); + sync_phase_config.sync_src = timer_sync_source; + for (int i = 1; i < 3; ++i) { + ESP_ERROR_CHECK(mcpwm_timer_set_phase_on_sync(timers[i], &sync_phase_config)); + } + + ESP_LOGI(TAG, "Trigger the software sync event"); + ESP_ERROR_CHECK(mcpwm_soft_sync_activate(soft_sync_source)); +} +#endif // CONFIG_EXAMPLE_SYNC_FROM_SOFT + +void app_main(void) +{ + ESP_LOGI(TAG, "Create timers"); + mcpwm_timer_handle_t timers[3]; + mcpwm_timer_config_t timer_config = { + .clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT, + .group_id = 0, + .resolution_hz = EXAMPLE_TIMER_RESOLUTION_HZ, + .period_ticks = EXAMPLE_TIMER_PERIOD, + .count_mode = MCPWM_TIMER_COUNT_MODE_UP, + }; + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_new_timer(&timer_config, &timers[i])); + } + + ESP_LOGI(TAG, "Create operators"); + mcpwm_oper_handle_t operators[3]; + mcpwm_operator_config_t operator_config = { + .group_id = 0, // operator should be in the same group of the above timers + }; + for (int i = 0; i < 3; ++i) { + ESP_ERROR_CHECK(mcpwm_new_operator(&operator_config, &operators[i])); + } + + ESP_LOGI(TAG, "Connect timers and operators with each other"); + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_operator_connect_timer(operators[i], timers[i])); + } + + ESP_LOGI(TAG, "Create comparators"); + mcpwm_cmpr_handle_t comparators[3]; + mcpwm_comparator_config_t compare_config = { + .flags.update_cmp_on_tez = true, + }; + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_new_comparator(operators[i], &compare_config, &comparators[i])); + // init compare for each comparator + ESP_ERROR_CHECK(mcpwm_comparator_set_compare_value(comparators[i], 200)); + } + + ESP_LOGI(TAG, "Create generators"); + mcpwm_gen_handle_t generators[3]; + const int gen_gpios[3] = {EXAMPLE_GEN_GPIO0, EXAMPLE_GEN_GPIO1, EXAMPLE_GEN_GPIO2}; + mcpwm_generator_config_t gen_config = {}; + for (int i = 0; i < 3; i++) { + gen_config.gen_gpio_num = gen_gpios[i]; + ESP_ERROR_CHECK(mcpwm_new_generator(operators[i], &gen_config, &generators[i])); + } + + ESP_LOGI(TAG, "Set generator actions on timer and compare event"); + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_generator_set_actions_on_timer_event(generators[i], + // when the timer value is zero, and is counting up, set output to high + MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH), + MCPWM_GEN_TIMER_EVENT_ACTION_END())); + ESP_ERROR_CHECK(mcpwm_generator_set_actions_on_compare_event(generators[i], + // when compare event happens, and timer is counting up, set output to low + MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, comparators[i], MCPWM_GEN_ACTION_LOW), + MCPWM_GEN_COMPARE_EVENT_ACTION_END())); + } + + ESP_LOGI(TAG, "Start timers one by one, so they are not synced"); + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_timer_enable(timers[i])); + ESP_ERROR_CHECK(mcpwm_timer_start_stop(timers[i], MCPWM_TIMER_START_NO_STOP)); + vTaskDelay(pdMS_TO_TICKS(10)); + } + vTaskDelay(pdMS_TO_TICKS(100)); + + // Manually added this "IDLE" phase, which can help us distinguish the wave forms before and after sync + ESP_LOGI(TAG, "Force the output level to low, timer still running"); + for (int i = 0; i < 3; i++) { + ESP_ERROR_CHECK(mcpwm_generator_set_force_level(generators[i], 0, true)); + } + + ESP_LOGI(TAG, "Setup sync strategy"); + example_setup_sync_strategy(timers); + + ESP_LOGI(TAG, "Now the output PWMs should in sync"); + for (int i = 0; i < 3; ++i) { + // remove the force level on the generator, so that we can see the PWM again + ESP_ERROR_CHECK(mcpwm_generator_set_force_level(generators[i], -1, true)); + } + vTaskDelay(pdMS_TO_TICKS(100)); +} diff --git a/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py b/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py new file mode 100644 index 0000000000..3e130c6646 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/pytest_mcpwm_sync.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32 +@pytest.mark.esp32s3 +@pytest.mark.generic +@pytest.mark.parametrize('config', [ + pytest.param('gpio', marks=[pytest.mark.esp32, pytest.mark.esp32s3]), + pytest.param('tez', marks=[pytest.mark.esp32, pytest.mark.esp32s3]), + pytest.param('soft', marks=[pytest.mark.esp32s3]), +], indirect=True) +def test_mcpwm_sync_example(dut: Dut) -> None: + dut.expect_exact('example: Create timers') + dut.expect_exact('example: Create operators') + dut.expect_exact('example: Create comparators') + dut.expect_exact('example: Create generators') + dut.expect_exact('example: Set generator actions on timer and compare event') + dut.expect_exact('example: Start timers one by one, so they are not synced') + dut.expect_exact('example: Setup sync strategy') + dut.expect_exact('example: Now the output PWMs should in sync') diff --git a/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.gpio b/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.gpio new file mode 100644 index 0000000000..3e98959154 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.gpio @@ -0,0 +1 @@ +CONFIG_EXAMPLE_SYNC_FROM_GPIO=y diff --git a/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.soft b/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.soft new file mode 100644 index 0000000000..6e2b3b5e1a --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.soft @@ -0,0 +1 @@ +CONFIG_EXAMPLE_SYNC_FROM_SOFT=y diff --git a/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.tez b/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.tez new file mode 100644 index 0000000000..4e6ee21440 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_sync/sdkconfig.ci.tez @@ -0,0 +1 @@ +CONFIG_EXAMPLE_SYNC_FROM_TEZ=y diff --git a/examples/peripherals/mcpwm/mcpwm_sync_example/README.md b/examples/peripherals/mcpwm/mcpwm_sync_example/README.md deleted file mode 100644 index 761aaf9927..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_sync_example/README.md +++ /dev/null @@ -1,74 +0,0 @@ -| Supported Targets | ESP32 | ESP32-S3 | -| ----------------- | ----- | -------- | - -# MCPWM sync Example - -(See the README.md file in the upper level 'examples' directory for more information about examples.) - -This example aims to show howto sync those timers within the same MCPWM unit to produce fully synchronized output. - -The example will: - -- init MCPWM -- sync all three timers with the help of one extra GPIO -- mess the synchronized timers by stopping and restarting -- sync all three timers with software sync event, no GPIO required. (Only targets with `SOC_MCPWM_SWSYNC_CAN_PROPAGATE` ability can support). -- sync all three timers, but adding 10% delay between pulses from different channels - -## How to Use Example - -### Hardware Required - -* An ESP32/ESP32S3 development board - -It is recommended to have an oscilloscope or logic analyzer to verify the output pulse - -Connection : - -| Pin | Func | Mode | -| :---------: | :----------------: | :----: | -| GPIO_NUM_16 | MCPWM0.Timer0.GenA | Output | -| GPIO_NUM_17 | MCPWM0.Timer1.GenA | Output | -| GPIO_NUM_18 | MCPWM0.Timer2.GenA | Output | -| GPIO_NUM_21 | GPIO_SYNC0 | INPUT | -| GPIO_NUM_19 | simulate input | OUTPUT | - -GPIO_NUM_21 and GPIO_NUM_19 **SHOULD** be wired together to provide simulated input. - -Above pin selection can be changed within file `mcpwm_sync_example.c`. - -### Build and Flash - -Run `idf.py -p PORT flash monitor` to build, flash and monitor the project. - -(To exit the serial monitor, type ``Ctrl-]``.) - -See the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects. - -## Example Output - -``` -I (306) sync_example: MCPWM sync example -I (306) sync_example: PWM started, not synchronized -I (3316) sync_example: Sync timers with GPIO approach -I (3326) sync_example: Output should already be synchronized -I (6326) sync_example: force synchronous lost -I (9326) sync_example: Output should already be synchronized on esp32s3 -I (12336) sync_example: Each output pulse should be placed with 10 percents of period -``` - -Overall pulse graph: - -![](readme_res/overall.png) - -Sync: - -![](readme_res/synced.png) - -Sync with phase: - -![](readme_res/sync_phase.png) - -## Troubleshooting - -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/mcpwm/mcpwm_sync_example/main/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_sync_example/main/CMakeLists.txt deleted file mode 100644 index d4f23669d5..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_sync_example/main/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -idf_component_register(SRCS "mcpwm_sync_example.c" - INCLUDE_DIRS ".") diff --git a/examples/peripherals/mcpwm/mcpwm_sync_example/main/mcpwm_sync_example.c b/examples/peripherals/mcpwm/mcpwm_sync_example/main/mcpwm_sync_example.c deleted file mode 100644 index bc7b6c30a1..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_sync_example/main/mcpwm_sync_example.c +++ /dev/null @@ -1,146 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD - * - * SPDX-License-Identifier: Unlicense OR CC0-1.0 - */ - -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_log.h" -#include "driver/mcpwm.h" -#include "driver/gpio.h" - -const static char *TAG = "example"; - -#define TARGET_MCPWM_UNIT MCPWM_UNIT_0 -#define TIMER0_OUTPUT_GPIO GPIO_NUM_16 -#define TIMER1_OUTPUT_GPIO GPIO_NUM_17 -#define TIMER2_OUTPUT_GPIO GPIO_NUM_18 -#define SIMU_GPIO_SYNC_SOURCE_GPIO GPIO_NUM_21 -#define SIMU_GPIO_SYNC_SIMULATE_GPIO GPIO_NUM_19 - -void app_main(void) { - ESP_LOGI(TAG, "MCPWM sync example"); - - // init MCPWM: 10% duty cycle on all three timers in MCPWM unit 0 (currently not synchronous) - mcpwm_config_t pwm_config = { - .frequency = 1000, - .cmpr_a = 10, - .cmpr_b = 0, - .counter_mode = MCPWM_UP_COUNTER, - .duty_mode = MCPWM_DUTY_MODE_0, - }; - ESP_ERROR_CHECK(mcpwm_init(TARGET_MCPWM_UNIT, MCPWM_TIMER_0, &pwm_config)); - ESP_ERROR_CHECK(mcpwm_init(TARGET_MCPWM_UNIT, MCPWM_TIMER_1, &pwm_config)); - ESP_ERROR_CHECK(mcpwm_init(TARGET_MCPWM_UNIT, MCPWM_TIMER_2, &pwm_config)); - - // bind output to GPIO - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0A, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1A, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2A, TIMER2_OUTPUT_GPIO)); - ESP_LOGI(TAG, "PWM started, not synchronized"); - - vTaskDelay(pdMS_TO_TICKS(1000)); - // temporarily disable GPIO output, by binding to GenBs which have 0 output - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0B, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1B, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2B, TIMER2_OUTPUT_GPIO)); - vTaskDelay(pdMS_TO_TICKS(2000)); - - ESP_LOGI(TAG, "Sync timers with GPIO approach"); - // first configure sync source - mcpwm_sync_config_t sync_conf = { - .sync_sig = MCPWM_SELECT_GPIO_SYNC0, - .timer_val = 0, - .count_direction = MCPWM_TIMER_DIRECTION_UP, - }; - ESP_ERROR_CHECK(mcpwm_sync_configure(TARGET_MCPWM_UNIT, MCPWM_TIMER_0, &sync_conf)); - ESP_ERROR_CHECK(mcpwm_sync_configure(TARGET_MCPWM_UNIT, MCPWM_TIMER_1, &sync_conf)); - ESP_ERROR_CHECK(mcpwm_sync_configure(TARGET_MCPWM_UNIT, MCPWM_TIMER_2, &sync_conf)); - // then configure GPIO - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM_SYNC_0, SIMU_GPIO_SYNC_SOURCE_GPIO)); - gpio_config_t io_conf = {}; - io_conf.intr_type = GPIO_INTR_DISABLE; - io_conf.mode = GPIO_MODE_OUTPUT; - io_conf.pin_bit_mask = BIT64(SIMU_GPIO_SYNC_SIMULATE_GPIO); - io_conf.pull_down_en = 0; - io_conf.pull_up_en = 0; - ESP_ERROR_CHECK(gpio_config(&io_conf)); - ESP_ERROR_CHECK(gpio_set_level(SIMU_GPIO_SYNC_SIMULATE_GPIO, 0)); - ESP_ERROR_CHECK(gpio_set_level(SIMU_GPIO_SYNC_SIMULATE_GPIO, 1)); - // wait for at least one TEP - vTaskDelay(pdMS_TO_TICKS(10)); - // re-enable GPIO output, to see the result - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0A, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1A, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2A, TIMER2_OUTPUT_GPIO)); - ESP_LOGI(TAG, "Output should already be synchronized"); - - vTaskDelay(pdMS_TO_TICKS(1000)); - - // stop and restart timers to mess them - ESP_ERROR_CHECK(mcpwm_stop(TARGET_MCPWM_UNIT, MCPWM_TIMER_2)); - ESP_ERROR_CHECK(mcpwm_stop(TARGET_MCPWM_UNIT, MCPWM_TIMER_1)); - ESP_ERROR_CHECK(mcpwm_stop(TARGET_MCPWM_UNIT, MCPWM_TIMER_0)); - vTaskDelay(pdMS_TO_TICKS(2000)); - ESP_ERROR_CHECK(mcpwm_start(TARGET_MCPWM_UNIT, MCPWM_TIMER_0)); - ESP_ERROR_CHECK(mcpwm_start(TARGET_MCPWM_UNIT, MCPWM_TIMER_1)); - ESP_ERROR_CHECK(mcpwm_start(TARGET_MCPWM_UNIT, MCPWM_TIMER_2)); - ESP_LOGI(TAG, "force synchronous lost"); - - vTaskDelay(pdMS_TO_TICKS(1000)); - // temporarily disable GPIO output, by binding to GenBs which have 0 output - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0B, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1B, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2B, TIMER2_OUTPUT_GPIO)); - vTaskDelay(pdMS_TO_TICKS(2000)); - -#ifdef SOC_MCPWM_SWSYNC_CAN_PROPAGATE - // use the trick that only available on esp32s3 - mcpwm_set_timer_sync_output(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_SWSYNC_SOURCE_SYNCIN); - sync_conf.sync_sig = MCPWM_SELECT_TIMER0_SYNC; - mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_0, &sync_conf); - mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_1, &sync_conf); - mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_2, &sync_conf); - // then send soft sync event to timer0 - mcpwm_timer_trigger_soft_sync(MCPWM_UNIT_0, MCPWM_TIMER_0); - // re-enable GPIO output - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0A, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1A, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2A, TIMER2_OUTPUT_GPIO)); - ESP_LOGI(TAG, "Output should already be synchronized on esp32s3"); - - vTaskDelay(pdMS_TO_TICKS(1000)); -#endif - - // temporarily disable GPIO output, by binding to GenBs which have 0 output - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0B, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1B, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2B, TIMER2_OUTPUT_GPIO)); - vTaskDelay(pdMS_TO_TICKS(2000)); - // create phase between each timer. - // for this case all timers has 10% of period phase between each other - sync_conf.sync_sig = MCPWM_SELECT_GPIO_SYNC0; - sync_conf.timer_val = 0; // no phase applied - mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_0, &sync_conf); - sync_conf.timer_val = 900; // fill the counter with 90.0% of period will cause next pulse being delayed 10% period - mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_1, &sync_conf); - sync_conf.timer_val = 800; // fill the counter with 80.0% of period will cause next pulse being delayed 20% period - mcpwm_sync_configure(MCPWM_UNIT_0, MCPWM_TIMER_2, &sync_conf); - // trigger positive edge - ESP_ERROR_CHECK(gpio_set_level(SIMU_GPIO_SYNC_SIMULATE_GPIO, 0)); - ESP_ERROR_CHECK(gpio_set_level(SIMU_GPIO_SYNC_SIMULATE_GPIO, 1)); - // wait for at least one TEP - vTaskDelay(pdMS_TO_TICKS(10)); - // re-enable GPIO output, to see the result - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM0A, TIMER0_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM1A, TIMER1_OUTPUT_GPIO)); - ESP_ERROR_CHECK(mcpwm_gpio_init(TARGET_MCPWM_UNIT, MCPWM2A, TIMER2_OUTPUT_GPIO)); - ESP_LOGI(TAG, "Each output pulse should be placed with 10 percents of period"); - - vTaskDelay(pdMS_TO_TICKS(1000)); - - ESP_ERROR_CHECK(mcpwm_stop(TARGET_MCPWM_UNIT, MCPWM_TIMER_2)); - ESP_ERROR_CHECK(mcpwm_stop(TARGET_MCPWM_UNIT, MCPWM_TIMER_1)); - ESP_ERROR_CHECK(mcpwm_stop(TARGET_MCPWM_UNIT, MCPWM_TIMER_0)); -} diff --git a/examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/overall.png b/examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/overall.png deleted file mode 100644 index 092cebd55edeb34b73c437927c3a6b226744059c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35797 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 Zw>4YS=z4cN14Lt+iIMrG62spf{Tp4Y7+?SZ diff --git a/examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/synced.png b/examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/synced.png deleted file mode 100644 index 26a6cd68c22a48f731ae63d7b397ba29b5398166..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16120 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