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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%0D)XKzzUcaBs&cCoR*}bB&^5I$Y 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 diff --git a/examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/sync_phase.png b/examples/peripherals/mcpwm/mcpwm_sync_example/readme_res/sync_phase.png deleted file mode 100644 index 47e8aedf7599dded297468acbb170776a1468dd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10151 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

fEq%dE1vS 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 kI3hP{6axbT(jv9L@_(nMXzopr01~;oasU7T