kopia lustrzana https://github.com/espressif/esp-idf
247 wiersze
8.6 KiB
Markdown
247 wiersze
8.6 KiB
Markdown
| Supported Targets | ESP32 | ESP32-S3 |
|
|
| ----------------- | ----- | -------- |
|
|
# MCPWM Brushed DC Motor Example
|
|
|
|
(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. This example assumes an [L298N](https://www.st.com/content/st_com/en/products/motor-drivers/brushed-dc-motor-drivers/l298.html) H-bridge driver is used to provide the needed voltage and current for brushed DC motor. This example also implements a motor control command console such that users can configure and control the motors at run time using console commands.
|
|
|
|
## How to Use Example
|
|
|
|
Before project configuration and build, be sure to set the correct chip target using `idf.py set-target <chip_name>`.
|
|
|
|
### Hardware Required
|
|
|
|
* A development board with any Espressif SoC which features MCPWM and PCNT peripheral (e.g., ESP32-DevKitC, ESP-WROVER-KIT, 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
|
|
* A brushed DC motor, e.g. [25GA370](http://www.tronsunmotor.com/data/upload/file/201807/e03b98802b5c5390d6570939def525ba.pdf)
|
|
* A quadrature encoder to detect speed
|
|
|
|
Connection :
|
|
```
|
|
Power(12V)
|
|
|
|
|
v
|
|
+----------------+ +--------------------+
|
|
| | | H-Bridge |
|
|
| GND +------------>| | +--------------+
|
|
| | | | | |
|
|
| GPIO15 +----PWM0A--->| IN_A OUT_A +----->| Brushed |
|
|
| | | | | DC |
|
|
| GPIO16 +----PWM0B--->| IN_A OUT_B +----->| Motor |
|
|
| | | | | |
|
|
| ESP | +--------------------+ | |
|
|
| | +------+-------+
|
|
| | |
|
|
| | +--------------------+ |
|
|
| VCC3.3 +------------>| Encoder | |
|
|
| | | | |
|
|
| GND +------------>| |<------------+
|
|
| | | |
|
|
| GPIO18 |<---PhaseA---+ C1 |
|
|
| | | |
|
|
| GPIO19 |<---PhaseB---+ C2 |
|
|
| | | |
|
|
+----------------+ +--------------------+
|
|
```
|
|
NOTE: If some other GPIO pins (e.g., 13/14) are chosen as the PCNT encoder pins, flashing might fail while the wires are connected. If this occurs, please try disconnecting the power supply of the encoder while flashing.
|
|
|
|
### 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://idf.espressif.com/) for full steps to configure and use ESP-IDF to build projects.
|
|
|
|
|
|
## Example Output
|
|
|
|
Run the example, you will see the following output log:
|
|
|
|
```bash
|
|
...
|
|
Testing brushed motor with PID...
|
|
initializing mcpwm gpio...
|
|
Configuring Initial Parameters of mcpwm...
|
|
|
|
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.
|
|
=================================================================
|
|
| Example of Motor Control |
|
|
| |
|
|
| 1. Try 'help', check all supported commands |
|
|
| 2. Try 'config' to set control period or pwm frequency |
|
|
| 3. Try 'pid' to configure pid paremeters |
|
|
| 4. Try 'expt' to set expectation value and mode |
|
|
| 5. Try 'motor' to start motor in several seconds or stop it |
|
|
| |
|
|
=================================================================
|
|
|
|
Default configuration are shown as follows.
|
|
You can input 'config -s' to check current status.
|
|
-----------------------------------------------------------------
|
|
Current Configuration Status
|
|
|
|
Configuration
|
|
Period = 10 ms PID = enabled
|
|
|
|
PID - Increment
|
|
Kp = 0.800 Ki = 0.000 Kd = 0.100
|
|
|
|
Expectation - Triangle
|
|
init = 30.000 max = 50.000 min = -50.000 pace = 1.000
|
|
|
|
MCPWM
|
|
Frequency = 1000 Hz
|
|
|
|
Motor
|
|
Running seconds = 10
|
|
-----------------------------------------------------------------
|
|
|
|
mcpwm-motor>
|
|
```
|
|
|
|
### Check all supported commands and their usages
|
|
* Command: `help`
|
|
|
|
```bash
|
|
mcpwm-motor> help
|
|
help
|
|
Print the list of registered commands
|
|
|
|
config config -s
|
|
Enable or disable PID and set motor control period
|
|
--pid=<y|n> Enable or disable PID algorithm
|
|
-T, --period=<ms> Set motor control period
|
|
-s, --show Show current configurations
|
|
|
|
expt expt -i <duty> -m <fixed/tri/rect> -p <double> --max <duty> --min -50<duty>
|
|
Set initial value, limitation and wave mode of expectation. Both dynamic and
|
|
static mode are available
|
|
--max=<duty> Max limitation for dynamic expectation
|
|
--min=<duty> Min limitation for dynamic expectation
|
|
-p, --pace=<double> The increasing pace of expectation every 50ms
|
|
-i, --init=<duty> Initial expectation. Usually between -100~100
|
|
-m, --mode=<fixed/tri/rect> Select static or dynamic expectation wave mode. 'fixed' for static, 'tri' for triangle, 'rect' for rectangle
|
|
|
|
pid pid -p <double> -i <double> -d <double> -t <loc/inc>
|
|
Set parameters and type for PID algorithm
|
|
-p, --kp=<double> Set Kp value for PID
|
|
-i, --ki=<double> Set Ki value for PID
|
|
-d, --kd=<double> Set Kd value for PID
|
|
-t, --type=<loc/inc> Select locational PID or incremental PID
|
|
|
|
motor motor -u 10
|
|
Start or stop the motor
|
|
-u, --start=<seconds> Set running seconds for motor, set '0' to keep motor running
|
|
-d, --stop Stop the motor
|
|
```
|
|
|
|
### Check status
|
|
|
|
* Command: `config -s`
|
|
|
|
```bash
|
|
mcpwm-motor> config -s
|
|
|
|
-----------------------------------------------------------------
|
|
Current Configuration Status
|
|
|
|
Configuration
|
|
Period = 10 ms PID = enabled
|
|
|
|
PID - Increment
|
|
Kp = 0.800 Ki = 0.000 Kd = 0.100
|
|
|
|
Expectation - Triangle
|
|
init = 30.000 max = 50.000 min = -50.000 pace = -1.000
|
|
|
|
MCPWM
|
|
Frequency = 1000 Hz
|
|
|
|
Motor
|
|
Running seconds = 10
|
|
-----------------------------------------------------------------
|
|
```
|
|
|
|
### Enable or disable PID
|
|
|
|
* Command: `config --pid <y/n>`
|
|
* 'y' - enable PID
|
|
* 'n' - disable PID
|
|
|
|
```bash
|
|
mcpwm-motor> config --pid n
|
|
config: pid disabled
|
|
mcpwm-motor> config --pid y
|
|
config: pid enabled
|
|
```
|
|
|
|
### Set PID parameters
|
|
|
|
* Command: `pid -p <double> -i <double> -d <double> -t <loc/inc>`
|
|
* 'p' - proportion value
|
|
* 'i' - integral value
|
|
* 'd' - differential value
|
|
* 't' - PID calculation type (locational or incremental).
|
|
|
|
```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
|
|
```
|
|
|
|
### Set expectation parameters
|
|
|
|
* Command: `expt -i <duty> -m <fixed/tri/rect> -p <double> --max <duty> --min <duty>`
|
|
* 'i' - initial duty if you set mode 'fixed'
|
|
* 'm' - expectation mode. 'fixed' means the expectation will never change, 'tri' means the expectation will changes with trigonometric wave, 'rect' means the expectation will changes with rectangular wave
|
|
* 'p' - the setp size of expectation changed in every 50ms, it can adjust the expectation changing speed
|
|
* 'max' - the maximum limitation of expectation
|
|
* 'min' - the minimum limitation of expectation
|
|
|
|
```bash
|
|
mcpwm-motor> expt -i 40 -m rect -p 1.5 --max 80 --min -60
|
|
expt: init = 40.000
|
|
expt: max = 80.000
|
|
expt: min = -60.000
|
|
expt: pace = 1.500
|
|
expt: mode = rectangle
|
|
```
|
|
|
|
### Start or stop motor
|
|
|
|
* Command: `motor -u <sec>`
|
|
* Command: `motor -d`
|
|
* 'u' - start the motor in <sec> seconds, if <sec> is 0, the motor won't stop until 'motor -d' is inputed
|
|
* 'd' - stop the motor right now
|
|
|
|
```bash
|
|
mcpwm-motor> motor -u 10
|
|
motor: motor starts to run in 10 seconds
|
|
mcpwm-motor> 1
|
|
2
|
|
3
|
|
4
|
|
5
|
|
6
|
|
7
|
|
8
|
|
9
|
|
10
|
|
|
|
Time up: motor stoped
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
* Make sure your ESP board and H-bridge module have been connected to the same GND panel.
|
|
|
|
For any technical queries, please open an [issue](https://github.com/espressif/esp-idf/issues) on GitHub. We will get back to you soon.
|