From 938b3d717fb4716ad87bdb6a90891b146f9e8fae Mon Sep 17 00:00:00 2001 From: morris Date: Sat, 28 May 2022 17:03:57 +0800 Subject: [PATCH] example: update bdc speed control example with new driver API --- examples/peripherals/.build-test-rules.yml | 16 + .../mcpwm/mcpwm_bdc_speed_control/README.md | 107 +++---- .../bdc_speed_dashboard.png | Bin 0 -> 124458 bytes .../components/bdc_motor/CMakeLists.txt | 9 + .../components/bdc_motor/README.md | 7 + .../components/bdc_motor/include/bdc_motor.h | 145 +++++++++ .../bdc_motor/interface/bdc_motor_interface.h | 116 +++++++ .../components/bdc_motor/src/bdc_motor.c | 62 ++++ .../bdc_motor/src/bdc_motor_mcpwm_impl.c | 185 ++++++++++++ .../main/Kconfig.projbuild | 12 + .../main/mcpwm_bdc_control_example_main.c | 282 ++++++------------ .../pytest_bdc_speed_control.py | 17 ++ .../serial-studio-dashboard.json | 28 ++ .../serial-studio-proto-map.json | 22 -- tools/ci/check_copyright_ignore.txt | 3 - 15 files changed, 736 insertions(+), 275 deletions(-) create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/bdc_speed_dashboard.png create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/CMakeLists.txt create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/README.md create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/include/bdc_motor.h create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/interface/bdc_motor_interface.h create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor.c create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor_mcpwm_impl.c create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/Kconfig.projbuild create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/pytest_bdc_speed_control.py create mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-dashboard.json delete mode 100644 examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-proto-map.json diff --git a/examples/peripherals/.build-test-rules.yml b/examples/peripherals/.build-test-rules.yml index 9845fe85fb..391a727b4f 100644 --- a/examples/peripherals/.build-test-rules.yml +++ b/examples/peripherals/.build-test-rules.yml @@ -70,6 +70,22 @@ examples/peripherals/mcpwm: disable: - if: SOC_MCPWM_SUPPORTED != 1 +examples/peripherals/mcpwm/mcpwm_bdc_speed_control: + disable: + - if: SOC_MCPWM_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET != "esp32s3" + temporary: true + reason: lack of runners + +examples/peripherals/mcpwm/mcpwm_bldc_hall_control: + disable: + - if: SOC_MCPWM_SUPPORTED != 1 + disable_test: + - if: IDF_TARGET != "esp32s3" + temporary: true + reason: lack of runners + examples/peripherals/pcnt: disable: - if: SOC_PCNT_SUPPORTED != 1 diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/README.md b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/README.md index e2e90b2fb3..09ab448a55 100644 --- a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/README.md +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/README.md @@ -4,7 +4,11 @@ (See the README.md file in the upper level 'examples' directory for more information about examples.) -This example mainly illustrates how to drive a brushed DC motor by generating two specific PWM signals. However the PWM signals from ESP32 can't drive motors directly as the motor usually consumes high current. So an H-bridge like [DRV8848](https://www.ti.com/product/DRV8848) should be used to provide the needed voltage and current for brushed DC motor. To measure the speed of motor, a photoelectric encoder is used to generate the "speed feedback" signals (e.g. a pair of quadrature signal). The example uses a simple PID control approach to keep the motor speed in a constant speed. The example provides a console command line interface for user to update the PID parameters according to actual situation. +This example mainly illustrates how to drive a brushed DC motor by generating two specific PWM signals. However the PWM signals from ESP chip can't drive motors directly as the motor usually consumes high current. So an H-bridge like [DRV8848](https://www.ti.com/product/DRV8848) should be used to provide the needed voltage and current for brushed DC motor. To simplify the DC motor control of MCPWM peripheral driver, there's a component called [bdc_motor](components/bdc_motor/README.md) which abstracts the common operations into a generic interface. The most useful operations are: `forward`, `reverse`, `coast` and `brake`. + +To measure the speed of motor, a photoelectric encoder is used to generate the "speed feedback" signals (e.g. a pair of quadrature signal). In the example, we use the PCNT peripheral to decode that quadrature signals. For more information, please refer to [rotary encoder example](../../pcnt/rotary_encoder/README.md) as well. + +The example uses a simple PID algorithm to keep the motor spin in a stable speed. The PID component is fetched from the [IDF Component Registry](https://components.espressif.com/component/espressif/pid_ctrl). ## How to Use Example @@ -12,7 +16,7 @@ Before project configuration and build, be sure to set the correct chip target u ### Hardware Required -* A development board with any Espressif SoC which features MCPWM and PCNT peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, etc.) +* A development board with any Espressif SoC which features MCPWM and PCNT peripheral (e.g., ESP32-DevKitC, ESP32-S3-Motor-Devkit, etc.) * A USB cable for Power supply and programming * A separate 12V power supply for brushed DC motor and H-bridge (the voltage depends on the motor model used in the example) * A motor driving board to transfer pwm signal into driving signal @@ -23,28 +27,28 @@ Connection : ``` Power(12V) | - v -+----------------+ +--------------------+ -| | | H-Bridge | -| GND +<----------->| GND | +--------------+ -| | | | | | -| GENA_GPIO_NUM +----PWM0A--->| IN_A OUT_A +----->| Brushed | -| | | | | DC | -| GENB_GPIO_NUM +----PWM0B--->| IN_B OUT_B +----->| Motor | -| | | | | | -| ESP | +--------------------+ | | -| | +------+-------+ -| | | -| | +--------------------+ | -| VCC3.3 +------------>| VCC Encoder | | -| | | | | -| GND +<----------->| |<------------+ -| | | | -|PHASEA_GPIO_NUM |<---PhaseA---+ C1 | -| | | | -|PHASEB_GPIO_NUM |<---PhaseB---+ C2 | -| | | | -+----------------+ +--------------------+ + ESP v ++-------------------+ +--------------------+ +| | | H-Bridge | +| GND +<----------->| GND | +--------------+ +| | | | | | +| BDC_MCPWM_GPIO_A +----PWM0A--->| IN_A OUT_A +----->| Brushed | +| | | | | DC | +| BDC_MCPWM_GPIO_B +----PWM0B--->| IN_B OUT_B +----->| Motor | +| | | | | | +| | +--------------------+ | | +| | +------+-------+ +| | | +| | +--------------------+ | +| VCC3.3 +------------>| VCC Encoder | | +| | | | | +| GND +<----------->| |<------------+ +| | | | +|BDC_ENCODER_GPIO_A |<---PhaseA---+ C1 | +| | | | +|BDC_ENCODER_GPIO_B |<---PhaseB---+ C2 | +| | | | ++-------------------+ +--------------------+ ``` ### Build and Flash @@ -62,51 +66,30 @@ Run the example, you will see the following output log: ``` I (0) cpu_start: Starting scheduler on APP CPU. -configure mcpwm gpio -init mcpwm driver -init and start rotary encoder -init PID control block -init motor control timer -D (561) gptimer: new group (0) @0x3fce0a24 -D (561) gptimer: new gptimer (0,0) at 0x3fce0964, resolution=1000000Hz -create motor control task -start motor control timer -D (571) gptimer: install interrupt service for timer (0,0) -install console command line - -Type 'help' to get the list of commands. -Use UP/DOWN arrows to navigate through command history. -Press TAB when typing command name to auto-complete. -dc-motor> -dc-motor> help -help - Print the list of registered commands - -pid [-p ] [-i ] [-d ] - Set PID parameters - -p Set Kp value of PID - -i Set Ki value of PID - -d Set Kd value of PID +I (308) example: Create DC motor +I (308) gpio: GPIO[7]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (318) gpio: GPIO[15]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (328) example: Init pcnt driver to decode rotary signal +I (328) gpio: GPIO[36]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (338) gpio: GPIO[35]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (348) gpio: GPIO[35]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (358) gpio: GPIO[36]| InputEn: 1| OutputEn: 0| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0 +I (368) example: Create PID control block +I (378) example: Create a timer to do PID calculation periodically +I (378) example: Enable motor +I (388) example: Forward motor +I (388) example: Start motor speed loop ``` -### Set PID parameters +### View velocity curve in [Serial Studio](https://github.com/Serial-Studio/Serial-Studio) -* Command: `pid -p -i -d -t ` -* 'p' - proportion value -* 'i' - integral value -* 'd' - differential value -* 't' - PID calculation type (locational or incremental). +To help tune the PID parameters (i.e. `Kp`, `Ki` and `Kd` in the example), this example supports to log a short string frame of runtime motor speed. The string frame can be parsed by [Serial Studio](https://github.com/Serial-Studio/Serial-Studio). This example also provides the [communication description file](serial-studio-dashboard.json) out of the box, which can be loaded by Serial Studio and then plot the curves as follows: -```bash -mcpwm-motor> pid -p 0.8 -i 0.02 -d 0.1 -t inc -pid: kp = 0.800 -pid: ki = 0.020 -pid: kd = 0.100 -pid: type = increment -``` +![bdc_speed_dashboard](bdc_speed_dashboard.png) ## Troubleshooting * Make sure your ESP board and H-bridge module have been connected to the same GND panel. +* The PID parameter set in ths example might not work well in all kinds of motors, because it's not adaptive. You need to fine tune the parameters again by yourself. 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_bdc_speed_control/bdc_speed_dashboard.png b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/bdc_speed_dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..24318617d322456b051adcf97e150276966b97ff GIT binary patch literal 124458 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

$mqGpSCpe=FFQvqv!O#P1$Gj>*M`{Ip1b) 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 MPgg&ebxsLQ0Ft9sX#fBK literal 0 HcmV?d00001 diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/CMakeLists.txt b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/CMakeLists.txt new file mode 100644 index 0000000000..e8f680b259 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/CMakeLists.txt @@ -0,0 +1,9 @@ +set(srcs "src/bdc_motor.c") + +if(CONFIG_SOC_MCPWM_SUPPORTED) + list(APPEND srcs "src/bdc_motor_mcpwm_impl.c") +endif() + +idf_component_register(SRCS ${srcs} + INCLUDE_DIRS "include" "interface" + PRIV_REQUIRES "driver") diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/README.md b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/README.md new file mode 100644 index 0000000000..8918067552 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/README.md @@ -0,0 +1,7 @@ +# Brushed DC Motor Component + +This directory contains an implementation for Brushed DC Motor by different peripherals. Currently only MCPWM is supported as the BDC motor backend. + +To learn more about how to use this component, please check API Documentation from header file [bdc_motor.h](./include/bdc_motor.h). + +Please note that this component is not considered to be a part of ESP-IDF stable API. It may change and it may be removed in the future releases. diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/include/bdc_motor.h b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/include/bdc_motor.h new file mode 100644 index 0000000000..1b102d91f6 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/include/bdc_motor.h @@ -0,0 +1,145 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Brushed DC Motor handle + */ +typedef struct bdc_motor_t *bdc_motor_handle_t; + +/** + * @brief Enable BDC motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Enable motor successfully + * - ESP_ERR_INVALID_ARG: Enable motor failed because of invalid parameters + * - ESP_FAIL: Enable motor failed because other error occurred + */ +esp_err_t bdc_motor_enable(bdc_motor_handle_t motor); + +/** + * @brief Disable BDC motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Disable motor successfully + * - ESP_ERR_INVALID_ARG: Disable motor failed because of invalid parameters + * - ESP_FAIL: Disable motor failed because other error occurred + */ +esp_err_t bdc_motor_disable(bdc_motor_handle_t motor); + +/** + * @brief Set speed for bdc motor + * + * @param motor: BDC Motor handle + * @param speed: BDC speed + * + * @return + * - ESP_OK: Set motor speed successfully + * - ESP_ERR_INVALID_ARG: Set motor speed failed because of invalid parameters + * - ESP_FAIL: Set motor speed failed because other error occurred + */ +esp_err_t bdc_motor_set_speed(bdc_motor_handle_t motor, uint32_t speed); + +/** + * @brief Forward BDC motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Forward motor successfully + * - ESP_FAIL: Forward motor failed because some other error occurred + */ +esp_err_t bdc_motor_forward(bdc_motor_handle_t motor); + +/** + * @brief Reverse BDC Motor + * + * @param strip: BDC Motor handle + * + * @return + * - ESP_OK: Reverse motor successfully + * - ESP_FAIL: Reverse motor failed because some other error occurred + */ +esp_err_t bdc_motor_reverse(bdc_motor_handle_t motor); + +/** + * @brief Stop motor in a coast way (a.k.a Fast Decay) + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Stop motor successfully + * - ESP_FAIL: Stop motor failed because some other error occurred + */ +esp_err_t bdc_motor_coast(bdc_motor_handle_t motor); + +/** + * @brief Stop motor in a brake way (a.k.a Slow Decay) + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Stop motor successfully + * - ESP_FAIL: Stop motor failed because some other error occurred + */ +esp_err_t bdc_motor_brake(bdc_motor_handle_t motor); + +/** + * @brief Free BDC Motor resources + * + * @param strip: BDC Motor handle + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ +esp_err_t bdc_motor_del(bdc_motor_handle_t motor); + +/** + * @brief BDC Motor Configuration + */ +typedef struct { + uint32_t pwma_gpio_num; /*!< BDC Motor PWM A gpio number */ + uint32_t pwmb_gpio_num; /*!< BDC Motor PWM B gpio number */ + uint32_t pwm_freq_hz; /*!< PWM frequency, in Hz */ +} bdc_motor_config_t; + +/** + * @brief BDC Motor MCPWM specific configuration + */ +typedef struct { + int group_id; /*!< MCPWM group number */ + uint32_t resolution_hz; /*!< MCPWM timer resolution */ +} bdc_motor_mcpwm_config_t; + +/** + * @brief Create BDC Motor based on MCPWM peripheral + * + * @param motor_config: BDC Motor configuration + * @param mcpwm_config: MCPWM specific configuration + * @param ret_motor Returned BDC Motor handle + * @return + * - ESP_OK: Create BDC Motor handle successfully + * - ESP_ERR_INVALID_ARG: Create BDC Motor handle failed because of invalid argument + * - ESP_ERR_NO_MEM: Create BDC Motor handle failed because of out of memory + * - ESP_FAIL: Create BDC Motor handle failed because some other error + */ +esp_err_t bdc_motor_new_mcpwm_device(const bdc_motor_config_t *motor_config, const bdc_motor_mcpwm_config_t *mcpwm_config, bdc_motor_handle_t *ret_motor); + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/interface/bdc_motor_interface.h b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/interface/bdc_motor_interface.h new file mode 100644 index 0000000000..35e9697ac2 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/interface/bdc_motor_interface.h @@ -0,0 +1,116 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#pragma once + +#include +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct bdc_motor_t bdc_motor_t; /*!< Type of BDC motor */ + +/** + * @brief BDC motor interface definition + */ +struct bdc_motor_t { + /** + * @brief Enable BDC motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Enable motor successfully + * - ESP_ERR_INVALID_ARG: Enable motor failed because of invalid parameters + * - ESP_FAIL: Enable motor failed because other error occurred + */ + esp_err_t (*enable)(bdc_motor_t *motor); + + /** + * @brief Disable BDC motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Disable motor successfully + * - ESP_ERR_INVALID_ARG: Disable motor failed because of invalid parameters + * - ESP_FAIL: Disable motor failed because other error occurred + */ + esp_err_t (*disable)(bdc_motor_t *motor); + + /** + * @brief Set speed for bdc motor + * + * @param motor: BDC Motor handle + * @param speed: BDC speed + * + * @return + * - ESP_OK: Set motor speed successfully + * - ESP_ERR_INVALID_ARG: Set motor speed failed because of invalid parameters + * - ESP_FAIL: Set motor speed failed because other error occurred + */ + esp_err_t (*set_speed)(bdc_motor_t *motor, uint32_t speed); + + /** + * @brief Forward BDC motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Forward motor successfully + * - ESP_FAIL: Forward motor failed because some other error occurred + */ + esp_err_t (*forward)(bdc_motor_t *motor); + + /** + * @brief Reverse BDC Motor + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Reverse motor successfully + * - ESP_FAIL: Reverse motor failed because some other error occurred + */ + esp_err_t (*reverse)(bdc_motor_t *motor); + + /** + * @brief Stop motor in a coast way (a.k.a Fast Decay) + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Stop motor successfully + * - ESP_FAIL: Stop motor failed because some other error occurred + */ + esp_err_t (*coast)(bdc_motor_t *motor); + + /** + * @brief Stop motor in a brake way (a.k.a Slow Decay) + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Stop motor successfully + * - ESP_FAIL: Stop motor failed because some other error occurred + */ + esp_err_t (*brake)(bdc_motor_t *motor); + + /** + * @brief Free BDC Motor handle resources + * + * @param motor: BDC Motor handle + * + * @return + * - ESP_OK: Free resources successfully + * - ESP_FAIL: Free resources failed because error occurred + */ + esp_err_t (*del)(bdc_motor_t *motor); +}; + +#ifdef __cplusplus +} +#endif diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor.c b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor.c new file mode 100644 index 0000000000..fbbc440312 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor.c @@ -0,0 +1,62 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "bdc_motor.h" +#include "bdc_motor_interface.h" + +static const char *TAG = "bdc_motor"; + +esp_err_t bdc_motor_enable(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->enable(motor); +} + +esp_err_t bdc_motor_disable(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->disable(motor); +} + +esp_err_t bdc_motor_set_speed(bdc_motor_handle_t motor, uint32_t speed) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->set_speed(motor, speed); +} + +esp_err_t bdc_motor_forward(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->forward(motor); +} + +esp_err_t bdc_motor_reverse(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->reverse(motor); +} + +esp_err_t bdc_motor_coast(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->coast(motor); +} + +esp_err_t bdc_motor_brake(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->brake(motor); +} + +esp_err_t bdc_motor_del(bdc_motor_handle_t motor) +{ + ESP_RETURN_ON_FALSE(motor, ESP_ERR_INVALID_ARG, TAG, "invalid argument"); + return motor->del(motor); +} diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor_mcpwm_impl.c b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor_mcpwm_impl.c new file mode 100644 index 0000000000..2b502a6a44 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/components/bdc_motor/src/bdc_motor_mcpwm_impl.c @@ -0,0 +1,185 @@ +/* + * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include +#include "esp_log.h" +#include "esp_check.h" +#include "driver/mcpwm_prelude.h" +#include "bdc_motor.h" +#include "bdc_motor_interface.h" + +static const char *TAG = "bdc_motor_mcpwm"; + +typedef struct { + bdc_motor_t base; + mcpwm_timer_handle_t timer; + mcpwm_oper_handle_t operator; + mcpwm_cmpr_handle_t cmpa; + mcpwm_cmpr_handle_t cmpb; + mcpwm_gen_handle_t gena; + mcpwm_gen_handle_t genb; +} bdc_motor_mcpwm_obj; + +static esp_err_t bdc_motor_mcpwm_set_speed(bdc_motor_t *motor, uint32_t speed) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_comparator_set_compare_value(mcpwm_motor->cmpa, speed), TAG, "set compare value failed"); + ESP_RETURN_ON_ERROR(mcpwm_comparator_set_compare_value(mcpwm_motor->cmpb, speed), TAG, "set compare value failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_enable(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_timer_enable(mcpwm_motor->timer), TAG, "enable timer failed"); + ESP_RETURN_ON_ERROR(mcpwm_timer_start_stop(mcpwm_motor->timer, MCPWM_TIMER_START_NO_STOP), TAG, "start timer failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_disable(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_timer_start_stop(mcpwm_motor->timer, MCPWM_TIMER_STOP_EMPTY), TAG, "stop timer failed"); + ESP_RETURN_ON_ERROR(mcpwm_timer_disable(mcpwm_motor->timer), TAG, "disable timer failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_forward(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->gena, -1, true), TAG, "disable force level for gena failed"); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->genb, 0, true), TAG, "set force level for genb failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_reverse(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->genb, -1, true), TAG, "disable force level for genb failed"); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->gena, 0, true), TAG, "set force level for gena failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_coast(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->gena, 0, true), TAG, "set force level for gena failed"); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->genb, 0, true), TAG, "set force level for genb failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_brake(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->gena, 1, true), TAG, "set force level for gena failed"); + ESP_RETURN_ON_ERROR(mcpwm_generator_set_force_level(mcpwm_motor->genb, 1, true), TAG, "set force level for genb failed"); + return ESP_OK; +} + +static esp_err_t bdc_motor_mcpwm_del(bdc_motor_t *motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = __containerof(motor, bdc_motor_mcpwm_obj, base); + mcpwm_del_generator(mcpwm_motor->gena); + mcpwm_del_generator(mcpwm_motor->genb); + mcpwm_del_comparator(mcpwm_motor->cmpa); + mcpwm_del_comparator(mcpwm_motor->cmpb); + mcpwm_del_operator(mcpwm_motor->operator); + mcpwm_del_timer(mcpwm_motor->timer); + free(mcpwm_motor); + return ESP_OK; +} + +esp_err_t bdc_motor_new_mcpwm_device(const bdc_motor_config_t *motor_config, const bdc_motor_mcpwm_config_t *mcpwm_config, bdc_motor_handle_t *ret_motor) +{ + bdc_motor_mcpwm_obj *mcpwm_motor = NULL; + esp_err_t ret = ESP_OK; + ESP_GOTO_ON_FALSE(motor_config && mcpwm_config && ret_motor, ESP_ERR_INVALID_ARG, err, TAG, "invalid argument"); + mcpwm_motor = calloc(1, sizeof(bdc_motor_mcpwm_obj)); + ESP_GOTO_ON_FALSE(mcpwm_motor, ESP_ERR_NO_MEM, err, TAG, "no mem for rmt motor"); + + // mcpwm timer + mcpwm_timer_config_t timer_config = { + .group_id = mcpwm_config->group_id, + .clk_src = MCPWM_TIMER_CLK_SRC_DEFAULT, + .resolution_hz = mcpwm_config->resolution_hz, + .period_ticks = mcpwm_config->resolution_hz / motor_config->pwm_freq_hz, + .count_mode = MCPWM_TIMER_COUNT_MODE_UP, + }; + ESP_GOTO_ON_ERROR(mcpwm_new_timer(&timer_config, &mcpwm_motor->timer), err, TAG, "create MCPWM timer failed"); + + mcpwm_operator_config_t operator_config = { + .group_id = mcpwm_config->group_id, + }; + ESP_GOTO_ON_ERROR(mcpwm_new_operator(&operator_config, &mcpwm_motor->operator), err, TAG, "create MCPWM operator failed"); + + ESP_GOTO_ON_ERROR(mcpwm_operator_connect_timer(mcpwm_motor->operator, mcpwm_motor->timer), err, TAG, "connect timer and operator failed"); + + mcpwm_comparator_config_t comparator_config = { + .flags.update_cmp_on_tez = true, + }; + ESP_GOTO_ON_ERROR(mcpwm_new_comparator(mcpwm_motor->operator, &comparator_config, &mcpwm_motor->cmpa), err, TAG, "create comparator failed"); + ESP_GOTO_ON_ERROR(mcpwm_new_comparator(mcpwm_motor->operator, &comparator_config, &mcpwm_motor->cmpb), err, TAG, "create comparator failed"); + + // set the initial compare value for both comparators + mcpwm_comparator_set_compare_value(mcpwm_motor->cmpa, 0); + mcpwm_comparator_set_compare_value(mcpwm_motor->cmpb, 0); + + mcpwm_generator_config_t generator_config = { + .gen_gpio_num = motor_config->pwma_gpio_num, + }; + ESP_GOTO_ON_ERROR(mcpwm_new_generator(mcpwm_motor->operator, &generator_config, &mcpwm_motor->gena), err, TAG, "create generator failed"); + generator_config.gen_gpio_num = motor_config->pwmb_gpio_num; + ESP_GOTO_ON_ERROR(mcpwm_new_generator(mcpwm_motor->operator, &generator_config, &mcpwm_motor->genb), err, TAG, "create generator failed"); + + mcpwm_generator_set_actions_on_timer_event(mcpwm_motor->gena, + MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH), + MCPWM_GEN_TIMER_EVENT_ACTION_END()); + mcpwm_generator_set_actions_on_compare_event(mcpwm_motor->gena, + MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, mcpwm_motor->cmpa, MCPWM_GEN_ACTION_LOW), + MCPWM_GEN_COMPARE_EVENT_ACTION_END()); + mcpwm_generator_set_actions_on_timer_event(mcpwm_motor->genb, + MCPWM_GEN_TIMER_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, MCPWM_TIMER_EVENT_EMPTY, MCPWM_GEN_ACTION_HIGH), + MCPWM_GEN_TIMER_EVENT_ACTION_END()); + mcpwm_generator_set_actions_on_compare_event(mcpwm_motor->genb, + MCPWM_GEN_COMPARE_EVENT_ACTION(MCPWM_TIMER_DIRECTION_UP, mcpwm_motor->cmpb, MCPWM_GEN_ACTION_LOW), + MCPWM_GEN_COMPARE_EVENT_ACTION_END()); + + mcpwm_motor->base.enable = bdc_motor_mcpwm_enable; + mcpwm_motor->base.disable = bdc_motor_mcpwm_disable; + mcpwm_motor->base.forward = bdc_motor_mcpwm_forward; + mcpwm_motor->base.reverse = bdc_motor_mcpwm_reverse; + mcpwm_motor->base.coast = bdc_motor_mcpwm_coast; + mcpwm_motor->base.brake = bdc_motor_mcpwm_brake; + mcpwm_motor->base.set_speed = bdc_motor_mcpwm_set_speed; + mcpwm_motor->base.del = bdc_motor_mcpwm_del; + *ret_motor = &mcpwm_motor->base; + return ESP_OK; + +err: + if (mcpwm_motor) { + if (mcpwm_motor->gena) { + mcpwm_del_generator(mcpwm_motor->gena); + } + if (mcpwm_motor->genb) { + mcpwm_del_generator(mcpwm_motor->genb); + } + if (mcpwm_motor->cmpa) { + mcpwm_del_comparator(mcpwm_motor->cmpa); + } + if (mcpwm_motor->cmpb) { + mcpwm_del_comparator(mcpwm_motor->cmpb); + } + if (mcpwm_motor->operator) { + mcpwm_del_operator(mcpwm_motor->operator); + } + if (mcpwm_motor->timer) { + mcpwm_del_timer(mcpwm_motor->timer); + } + free(mcpwm_motor); + } + return ret; +} diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/Kconfig.projbuild b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/Kconfig.projbuild new file mode 100644 index 0000000000..67e1060d3d --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/Kconfig.projbuild @@ -0,0 +1,12 @@ +menu "Example Configuration" + + config SERIAL_STUDIO_DEBUG + bool "Enable log that can be parsed by Serial Studio" + default "n" + help + Enable this option, the example will print a string at runtime with a specific format, + which can be parsed by the Serial Studio tool. + With the "serial-studio-dashboard.json" template file provided in this example, + user can observe the speed in a curve window in the Serial Studio. + +endmenu diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/mcpwm_bdc_control_example_main.c b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/mcpwm_bdc_control_example_main.c index e0ae9205d5..f718225eca 100644 --- a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/mcpwm_bdc_control_example_main.c +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/main/mcpwm_bdc_control_example_main.c @@ -5,176 +5,97 @@ */ #include +#include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "freertos/queue.h" -#include "driver/gptimer.h" +#include "esp_log.h" +#include "esp_timer.h" #include "driver/pulse_cnt.h" -#include "driver/mcpwm.h" +#include "bdc_motor.h" #include "pid_ctrl.h" -#include "esp_console.h" -#include "argtable3/argtable3.h" + +static const char *TAG = "example"; // Enable this config, we will print debug formated string, which in return can be captured and parsed by Serial-Studio -#define SERIAL_STUDIO_DEBUG 0 +#define SERIAL_STUDIO_DEBUG CONFIG_SERIAL_STUDIO_DEBUG -#define BDC_MCPWM_UNIT 0 -#define BDC_MCPWM_TIMER 0 -#define BDC_MCPWM_GENA_GPIO_NUM 7 -#define BDC_MCPWM_GENB_GPIO_NUM 15 -#define BDC_MCPWM_FREQ_HZ 1500 +#define BDC_MCPWM_TIMER_RESOLUTION_HZ 10000000 // 10MHz, 1 tick = 0.1us +#define BDC_MCPWM_FREQ_HZ 25000 // 25KHz PWM +#define BDC_MCPWM_DUTY_TICK_MAX (BDC_MCPWM_TIMER_RESOLUTION_HZ / BDC_MCPWM_FREQ_HZ) // maximum value we can set for the duty cycle, in ticks +#define BDC_MCPWM_GPIO_A 7 +#define BDC_MCPWM_GPIO_B 15 -#define BDC_ENCODER_PCNT_HIGH_LIMIT 100 -#define BDC_ENCODER_PCNT_LOW_LIMIT -100 -#define BDC_ENCODER_PHASEA_GPIO_NUM 36 -#define BDC_ENCODER_PHASEB_GPIO_NUM 35 +#define BDC_ENCODER_GPIO_A 36 +#define BDC_ENCODER_GPIO_B 35 +#define BDC_ENCODER_PCNT_HIGH_LIMIT 1000 +#define BDC_ENCODER_PCNT_LOW_LIMIT -1000 -#define BDC_PID_CALCULATION_PERIOD_US 10000 -#define BDC_PID_FEEDBACK_QUEUE_LEN 10 - -static pid_ctrl_parameter_t pid_runtime_param = { - .kp = 0.6, - .ki = 0.3, - .kd = 0.12, - .cal_type = PID_CAL_TYPE_INCREMENTAL, - .max_output = 100, - .min_output = -100, - .max_integral = 1000, - .min_integral = -1000, -}; -static bool pid_need_update = false; -static int expect_pulses = 300; -static int real_pulses; +#define BDC_PID_LOOP_PERIOD_MS 10 // calculate the motor speed every 10ms +#define BDC_PID_EXPECT_SPEED 400 // expected motor speed, in the pulses counted by the rotary encoder typedef struct { - pcnt_unit_handle_t hall_pcnt_encoder; - int accumu_count; - QueueHandle_t pid_feedback_queue; -} motor_control_timer_context_t; - -typedef struct { - QueueHandle_t pid_feedback_queue; + bdc_motor_handle_t motor; + pcnt_unit_handle_t pcnt_encoder; pid_ctrl_block_handle_t pid_ctrl; -} motor_control_task_context_t; + int accumu_count; + int report_pulses; +} motor_control_context_t; static bool example_pcnt_on_reach(pcnt_unit_handle_t unit, const pcnt_watch_event_data_t *edata, void *user_ctx) { - motor_control_timer_context_t *ctx = (motor_control_timer_context_t *)user_ctx; - ctx->accumu_count += edata->watch_point_value; + int *accumu_count = (int *)user_ctx; + *accumu_count += edata->watch_point_value; return false; } -static void brushed_motor_set_duty(float duty_cycle) -{ - /* motor moves in forward direction, with duty cycle = duty % */ - if (duty_cycle > 0) { - mcpwm_set_signal_low(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, MCPWM_OPR_A); - mcpwm_set_duty(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, MCPWM_OPR_B, duty_cycle); - mcpwm_set_duty_type(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, MCPWM_OPR_B, MCPWM_DUTY_MODE_0); - } - /* motor moves in backward direction, with duty cycle = -duty % */ - else { - mcpwm_set_signal_low(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, MCPWM_OPR_B); - mcpwm_set_duty(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, MCPWM_OPR_A, -duty_cycle); - mcpwm_set_duty_type(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, MCPWM_OPR_A, MCPWM_DUTY_MODE_0); - } -} - -static bool motor_ctrl_timer_cb(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *arg) +static void pid_loop_cb(void *args) { static int last_pulse_count = 0; - BaseType_t high_task_awoken = pdFALSE; - motor_control_timer_context_t *user_ctx = (motor_control_timer_context_t *)arg; - pcnt_unit_handle_t pcnt_unit = user_ctx->hall_pcnt_encoder; + motor_control_context_t *ctx = (motor_control_context_t *)args; + pcnt_unit_handle_t pcnt_unit = ctx->pcnt_encoder; + pid_ctrl_block_handle_t pid_ctrl = ctx->pid_ctrl; + bdc_motor_handle_t motor = ctx->motor; + // get the result from rotary encoder int cur_pulse_count = 0; pcnt_unit_get_count(pcnt_unit, &cur_pulse_count); - cur_pulse_count += user_ctx->accumu_count; - - int delta = cur_pulse_count - last_pulse_count; + cur_pulse_count += ctx->accumu_count; + int real_pulses = cur_pulse_count - last_pulse_count; last_pulse_count = cur_pulse_count; - xQueueSendFromISR(user_ctx->pid_feedback_queue, &delta, &high_task_awoken); + ctx->report_pulses = real_pulses; - return high_task_awoken == pdTRUE; -} + // calculate the speed error + float error = BDC_PID_EXPECT_SPEED - real_pulses; + float new_speed = 0; -static void bdc_ctrl_task(void *arg) -{ - float duty_cycle = 0; - motor_control_task_context_t *user_ctx = (motor_control_task_context_t *)arg; - while (1) { - xQueueReceive(user_ctx->pid_feedback_queue, &real_pulses, portMAX_DELAY); - float error = expect_pulses - real_pulses; - pid_compute(user_ctx->pid_ctrl, error, &duty_cycle); - brushed_motor_set_duty(duty_cycle); - } -} - -static struct { - struct arg_dbl *kp; - struct arg_dbl *ki; - struct arg_dbl *kd; - struct arg_end *end; -} pid_ctrl_args; - -static int do_pid_ctrl_cmd(int argc, char **argv) -{ - int nerrors = arg_parse(argc, argv, (void **)&pid_ctrl_args); - if (nerrors != 0) { - arg_print_errors(stderr, pid_ctrl_args.end, argv[0]); - return 0; - } - if (pid_ctrl_args.kp->count) { - pid_runtime_param.kp = pid_ctrl_args.kp->dval[0]; - } - if (pid_ctrl_args.ki->count) { - pid_runtime_param.ki = pid_ctrl_args.ki->dval[0]; - } - if (pid_ctrl_args.kd->count) { - pid_runtime_param.kd = pid_ctrl_args.kd->dval[0]; - } - - pid_need_update = true; - return 0; -} - -static void register_pid_console_command(void) -{ - pid_ctrl_args.kp = arg_dbl0("p", NULL, "", "Set Kp value of PID"); - pid_ctrl_args.ki = arg_dbl0("i", NULL, "", "Set Ki value of PID"); - pid_ctrl_args.kd = arg_dbl0("d", NULL, "", "Set Kd value of PID"); - pid_ctrl_args.end = arg_end(2); - const esp_console_cmd_t pid_ctrl_cmd = { - .command = "pid", - .help = "Set PID parameters", - .hint = NULL, - .func = &do_pid_ctrl_cmd, - .argtable = &pid_ctrl_args - }; - ESP_ERROR_CHECK(esp_console_cmd_register(&pid_ctrl_cmd)); + // set the new speed + pid_compute(pid_ctrl, error, &new_speed); + bdc_motor_set_speed(motor, (uint32_t)new_speed); } void app_main(void) { - static motor_control_timer_context_t my_timer_ctx = {}; - - QueueHandle_t pid_fb_queue = xQueueCreate(BDC_PID_FEEDBACK_QUEUE_LEN, sizeof(int)); - assert(pid_fb_queue); - - printf("configure mcpwm gpio\r\n"); - ESP_ERROR_CHECK(mcpwm_gpio_init(BDC_MCPWM_UNIT, MCPWM0A, BDC_MCPWM_GENA_GPIO_NUM)); - ESP_ERROR_CHECK(mcpwm_gpio_init(BDC_MCPWM_UNIT, MCPWM0B, BDC_MCPWM_GENB_GPIO_NUM)); - printf("init mcpwm driver\n"); - mcpwm_config_t pwm_config = { - .frequency = BDC_MCPWM_FREQ_HZ, - .cmpr_a = 0, - .cmpr_b = 0, - .counter_mode = MCPWM_UP_COUNTER, - .duty_mode = MCPWM_DUTY_MODE_0, + static motor_control_context_t motor_ctrl_ctx = { + .accumu_count = 0, + .pcnt_encoder = NULL, }; - ESP_ERROR_CHECK(mcpwm_init(BDC_MCPWM_UNIT, BDC_MCPWM_TIMER, &pwm_config)); - printf("init and start rotary encoder\r\n"); + ESP_LOGI(TAG, "Create DC motor"); + bdc_motor_config_t motor_config = { + .pwm_freq_hz = BDC_MCPWM_FREQ_HZ, + .pwma_gpio_num = BDC_MCPWM_GPIO_A, + .pwmb_gpio_num = BDC_MCPWM_GPIO_B, + }; + bdc_motor_mcpwm_config_t mcpwm_config = { + .group_id = 0, + .resolution_hz = BDC_MCPWM_TIMER_RESOLUTION_HZ, + }; + bdc_motor_handle_t motor = NULL; + ESP_ERROR_CHECK(bdc_motor_new_mcpwm_device(&motor_config, &mcpwm_config, &motor)); + motor_ctrl_ctx.motor = motor; + + ESP_LOGI(TAG, "Init pcnt driver to decode rotary signal"); pcnt_unit_config_t unit_config = { .high_limit = BDC_ENCODER_PCNT_HIGH_LIMIT, .low_limit = BDC_ENCODER_PCNT_LOW_LIMIT, @@ -186,14 +107,14 @@ void app_main(void) }; ESP_ERROR_CHECK(pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config)); pcnt_chan_config_t chan_a_config = { - .edge_gpio_num = BDC_ENCODER_PHASEA_GPIO_NUM, - .level_gpio_num = BDC_ENCODER_PHASEB_GPIO_NUM, + .edge_gpio_num = BDC_ENCODER_GPIO_A, + .level_gpio_num = BDC_ENCODER_GPIO_B, }; pcnt_channel_handle_t pcnt_chan_a = NULL; ESP_ERROR_CHECK(pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a)); pcnt_chan_config_t chan_b_config = { - .edge_gpio_num = BDC_ENCODER_PHASEB_GPIO_NUM, - .level_gpio_num = BDC_ENCODER_PHASEA_GPIO_NUM, + .edge_gpio_num = BDC_ENCODER_GPIO_B, + .level_gpio_num = BDC_ENCODER_GPIO_A, }; pcnt_channel_handle_t pcnt_chan_b = NULL; ESP_ERROR_CHECK(pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b)); @@ -204,70 +125,55 @@ void app_main(void) ESP_ERROR_CHECK(pcnt_unit_add_watch_point(pcnt_unit, BDC_ENCODER_PCNT_HIGH_LIMIT)); ESP_ERROR_CHECK(pcnt_unit_add_watch_point(pcnt_unit, BDC_ENCODER_PCNT_LOW_LIMIT)); pcnt_event_callbacks_t pcnt_cbs = { - .on_reach = example_pcnt_on_reach, + .on_reach = example_pcnt_on_reach, // accumulate the overflow in the callback }; - ESP_ERROR_CHECK(pcnt_unit_register_event_callbacks(pcnt_unit, &pcnt_cbs, &my_timer_ctx)); + ESP_ERROR_CHECK(pcnt_unit_register_event_callbacks(pcnt_unit, &pcnt_cbs, &motor_ctrl_ctx.accumu_count)); ESP_ERROR_CHECK(pcnt_unit_enable(pcnt_unit)); ESP_ERROR_CHECK(pcnt_unit_clear_count(pcnt_unit)); ESP_ERROR_CHECK(pcnt_unit_start(pcnt_unit)); + motor_ctrl_ctx.pcnt_encoder = pcnt_unit; - printf("init PID control block\r\n"); - pid_ctrl_block_handle_t pid_ctrl; + ESP_LOGI(TAG, "Create PID control block"); + pid_ctrl_parameter_t pid_runtime_param = { + .kp = 0.6, + .ki = 0.4, + .kd = 0.2, + .cal_type = PID_CAL_TYPE_INCREMENTAL, + .max_output = BDC_MCPWM_DUTY_TICK_MAX - 1, + .min_output = 0, + .max_integral = 1000, + .min_integral = -1000, + }; + pid_ctrl_block_handle_t pid_ctrl = NULL; pid_ctrl_config_t pid_config = { .init_param = pid_runtime_param, }; ESP_ERROR_CHECK(pid_new_control_block(&pid_config, &pid_ctrl)); + motor_ctrl_ctx.pid_ctrl = pid_ctrl; - printf("init motor control timer\r\n"); - gptimer_handle_t gptimer; - gptimer_config_t timer_config = { - .clk_src = GPTIMER_CLK_SRC_DEFAULT, - .direction = GPTIMER_COUNT_UP, - .resolution_hz = 1000000, // 1MHz, 1 tick = 1us + ESP_LOGI(TAG, "Create a timer to do PID calculation periodically"); + const esp_timer_create_args_t periodic_timer_args = { + .callback = pid_loop_cb, + .arg = &motor_ctrl_ctx, + .name = "pid_loop" }; - ESP_ERROR_CHECK(gptimer_new_timer(&timer_config, &gptimer)); + esp_timer_handle_t pid_loop_timer = NULL; + ESP_ERROR_CHECK(esp_timer_create(&periodic_timer_args, &pid_loop_timer)); - printf("create motor control task\r\n"); - static motor_control_task_context_t my_ctrl_task_ctx = {}; - my_ctrl_task_ctx.pid_feedback_queue = pid_fb_queue; - my_ctrl_task_ctx.pid_ctrl = pid_ctrl; - xTaskCreate(bdc_ctrl_task, "bdc_ctrl_task", 4096, &my_ctrl_task_ctx, 5, NULL); + ESP_LOGI(TAG, "Enable motor"); + ESP_ERROR_CHECK(bdc_motor_enable(motor)); + ESP_LOGI(TAG, "Forward motor"); + ESP_ERROR_CHECK(bdc_motor_forward(motor)); - printf("start motor control timer\r\n"); - my_timer_ctx.pid_feedback_queue = pid_fb_queue; - my_timer_ctx.hall_pcnt_encoder = pcnt_unit; - gptimer_event_callbacks_t gptimer_cbs = { - .on_alarm = motor_ctrl_timer_cb, - }; - ESP_ERROR_CHECK(gptimer_register_event_callbacks(gptimer, &gptimer_cbs, &my_timer_ctx)); - gptimer_alarm_config_t alarm_config = { - .reload_count = 0, - .alarm_count = BDC_PID_CALCULATION_PERIOD_US, - .flags.auto_reload_on_alarm = true, - }; - ESP_ERROR_CHECK(gptimer_set_alarm_action(gptimer, &alarm_config)); - ESP_ERROR_CHECK(gptimer_enable(gptimer)); - ESP_ERROR_CHECK(gptimer_start(gptimer)); - - printf("install console command line\r\n"); - esp_console_repl_t *repl = NULL; - esp_console_repl_config_t repl_config = ESP_CONSOLE_REPL_CONFIG_DEFAULT(); - repl_config.prompt = "dc-motor>"; - esp_console_dev_uart_config_t uart_config = ESP_CONSOLE_DEV_UART_CONFIG_DEFAULT(); - ESP_ERROR_CHECK(esp_console_new_repl_uart(&uart_config, &repl_config, &repl)); - register_pid_console_command(); - ESP_ERROR_CHECK(esp_console_start_repl(repl)); + ESP_LOGI(TAG, "Start motor speed loop"); + ESP_ERROR_CHECK(esp_timer_start_periodic(pid_loop_timer, BDC_PID_LOOP_PERIOD_MS * 1000)); while (1) { vTaskDelay(pdMS_TO_TICKS(100)); - // the following logging format is according to the requirement of serial-studio - // also see the parser mapping file `serial-studio-proto-map.json` in the project folder + // the following logging format is according to the requirement of serial-studio frame format + // also see the dashboard config file `serial-studio-dashboard.json` for more information #if SERIAL_STUDIO_DEBUG - printf("/*%d*/\r\n", real_pulses); + printf("/*%d*/\r\n", motor_ctrl_ctx.report_pulses); #endif - if (pid_need_update) { - pid_update_parameters(pid_ctrl, &pid_runtime_param); - pid_need_update = false; - } } } diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/pytest_bdc_speed_control.py b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/pytest_bdc_speed_control.py new file mode 100644 index 0000000000..95579418bd --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/pytest_bdc_speed_control.py @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD +# SPDX-License-Identifier: CC0-1.0 + +import pytest +from pytest_embedded import Dut + + +@pytest.mark.esp32s3 +@pytest.mark.generic +def test_bdc_speed_control_example(dut: Dut) -> None: + dut.expect_exact('example: Create DC motor') + dut.expect_exact('example: Init pcnt driver to decode rotary signal') + dut.expect_exact('example: Create PID control block') + dut.expect_exact('example: Create a timer to do PID calculation periodically') + dut.expect_exact('example: Enable motor') + dut.expect_exact('example: Forward motor') + dut.expect_exact('example: Start motor speed loop') diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-dashboard.json b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-dashboard.json new file mode 100644 index 0000000000..efa33c1430 --- /dev/null +++ b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-dashboard.json @@ -0,0 +1,28 @@ +{ + "frameEnd": "*/", + "frameStart": "/*", + "groups": [ + { + "datasets": [ + { + "alarm": 1000, + "fft": false, + "fftSamples": 1024, + "graph": true, + "led": false, + "log": false, + "max": 500, + "min": 0, + "title": "current speed", + "units": "", + "value": "%1", + "widget": "gauge" + } + ], + "title": "speed", + "widget": "" + } + ], + "separator": ",", + "title": "Brushed DC Motor Speed" +} diff --git a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-proto-map.json b/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-proto-map.json deleted file mode 100644 index 29ac2d6695..0000000000 --- a/examples/peripherals/mcpwm/mcpwm_bdc_speed_control/serial-studio-proto-map.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "fe": "*/", - "fs": "/*", - "g": [ - { - "d": [ - { - "g": true, - "max": 100, - "min": 0, - "t": "pulses within 10ms", - "u": "", - "v": "%1", - "w": "" - } - ], - "t": "Encoder Feedback", - } - ], - "s": ",", - "t": "Brushed DC Motor Speed" -} diff --git a/tools/ci/check_copyright_ignore.txt b/tools/ci/check_copyright_ignore.txt index 11589d787c..e13723ab90 100644 --- a/tools/ci/check_copyright_ignore.txt +++ b/tools/ci/check_copyright_ignore.txt @@ -1773,9 +1773,6 @@ examples/peripherals/i2c/i2c_tools/main/cmd_i2ctools.h examples/peripherals/i2c/i2c_tools/main/i2ctools_example_main.c examples/peripherals/ledc/ledc_basic/main/ledc_basic_example_main.c examples/peripherals/ledc/ledc_fade/main/ledc_fade_example_main.c -examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/cmd_mcpwm_motor.c -examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.c -examples/peripherals/mcpwm/mcpwm_brushed_dc_control/main/mcpwm_brushed_dc_control_example.h examples/peripherals/mcpwm/mcpwm_servo_control/main/mcpwm_servo_control_example_main.c examples/peripherals/sdio/host/main/app_main.c examples/peripherals/sdio/sdio_test.py