From 65bda4fbff1c6170c38d8c84f51b05d141076ec5 Mon Sep 17 00:00:00 2001 From: Hamish Willee Date: Fri, 12 Nov 2021 09:09:24 +1100 Subject: [PATCH] OneShot docs (#1648) --- assets/peripherals/esc_pwm_duty_cycle.png | Bin 0 -> 7270 bytes en/SUMMARY.md | 1 + en/advanced_config/esc_calibration.md | 2 +- en/peripherals/dshot.md | 4 +- en/peripherals/esc_motors.md | 74 +++++++++++++++++++++- en/peripherals/oneshot.md | 38 +++++++++++ en/peripherals/pwm_escs_and_servo.md | 11 +++- 7 files changed, 123 insertions(+), 7 deletions(-) create mode 100644 assets/peripherals/esc_pwm_duty_cycle.png create mode 100644 en/peripherals/oneshot.md diff --git a/assets/peripherals/esc_pwm_duty_cycle.png b/assets/peripherals/esc_pwm_duty_cycle.png new file mode 100644 index 0000000000000000000000000000000000000000..3a61f18bd242b34d2d414534e9e89da57b043de3 GIT binary patch literal 7270 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 Lb)Q!%zkL56BMcEm literal 0 HcmV?d00001 diff --git a/en/SUMMARY.md b/en/SUMMARY.md index dbff37e88a18..ca846a01e987 100644 --- a/en/SUMMARY.md +++ b/en/SUMMARY.md @@ -260,6 +260,7 @@ * [PMW3901](sensor/pmw3901.md) * [ESCs & Motors](peripherals/esc_motors.md) * [PWM ESCs and Servos](peripherals/pwm_escs_and_servo.md) + * [OneShot ESCs and Servos](peripherals/oneshot.md) * [UAVCAN ESCs](uavcan/escs.md) * [DShot ESCs](peripherals/dshot.md) * [Camera](peripherals/camera.md) diff --git a/en/advanced_config/esc_calibration.md b/en/advanced_config/esc_calibration.md index 1b96654f883b..b236aa32ef05 100644 --- a/en/advanced_config/esc_calibration.md +++ b/en/advanced_config/esc_calibration.md @@ -1,7 +1,7 @@ # ESC Calibration :::note -These instructions are only relevant to [PWM ESCs](../peripherals/pwm_escs_and_servo.md). +These instructions are only relevant to [PWM ESCs](../peripherals/pwm_escs_and_servo.md) and [OneShot ESCs](../peripherals/oneshot.md) ([DShot](../peripherals/dshot.md) and [UAVCAN](../uavcan/escs.md) ESCs do not require calibration). ::: Electronic Speed Controllers (ESCs) regulate motor speed (and direction) based on the PWM input value from the flight controller (FC). diff --git a/en/peripherals/dshot.md b/en/peripherals/dshot.md index 8f08b9e0fb80..665870eb0992 100644 --- a/en/peripherals/dshot.md +++ b/en/peripherals/dshot.md @@ -1,6 +1,6 @@ # DShot ESCs -DShot is an alternative ESC protocol that has several advantages over PWM or OneShot: +DShot is an alternative ESC protocol that has several advantages over [PWM](../peripherals/pwm_escs_and_servo.md) or [OneShot](../peripherals/oneshot.md): - Reduced latency. - Increased robustness via a checksum. - No need for ESC calibration as the protocol uses digital encoding. @@ -40,7 +40,7 @@ FMUv5x-based boards support DShot only on the first six FMU pins. You can't mix DShot ESCs/servos and PWM ESCs/servos on the FMU (DShot is enabled/disabled for *all* FMU pins on the port). ::: - + ## Configuration :::warning diff --git a/en/peripherals/esc_motors.md b/en/peripherals/esc_motors.md index 1837d1fa7354..8cb222463450 100644 --- a/en/peripherals/esc_motors.md +++ b/en/peripherals/esc_motors.md @@ -1,12 +1,82 @@ # ESCs & Motors -Many PX4 drones use brushless motors that are driven by the flight controller via an Electronic Speed Controller (ESC) (the ESC converts a signal from the flight controller to an appropriate level of power delivered to the motor). +Many PX4 drones use brushless motors that are driven by the flight controller via an Electronic Speed Controller (ESC). +The ESC takes a signal from the flight controller and uses it to set control the level of power delivered to the motor. -PX4 supports [ESCs that take a PWM input](../peripherals/pwm_escs_and_servo.md), ESCs that use the ESC *OneShot* standard, [DShot](../peripherals/dshot.md), [UAVCAN ESCs](../peripherals/uavcan_escs.md), PCA9685 ESC (via I2C), and some UART ESCs (from Yuneec). +PX4 supports a number of common protocols for sending the signals to ESCs: [PWM ESCs](../peripherals/pwm_escs_and_servo.md), [OneShot ESCs](../peripherals/oneshot.md), [DShot ESCs](../peripherals/dshot.md), [UAVCAN ESCs](../peripherals/uavcan_escs.md), PCA9685 ESC (via I2C), and some UART ESCs (from Yuneec). For more information see: * [PWM ESCs and Servos](../peripherals/pwm_escs_and_servo.md) +* [OneShot ESCs and Servos](../peripherals/oneshot.md) * [DShot](../peripherals/dshot.md) * [UAVCAN ESCs](../peripherals/uavcan_escs.md) * [ESC Calibration](../advanced_config/esc_calibration.md) * [ESC Firmware and Protocols Overview](https://oscarliang.com/esc-firmware-protocols/) (oscarliang.com) + +A high level overview of the main ESC/Servo protocols supported by PX4 is given below. + +## ESC Protocols + +### PWM + +[PWM ESCs](../peripherals/pwm_escs_and_servo.md) are commonly used for fixed wing vehicles and ground vehicles (vehicles that require a lower latency like multicopters typically use oneshot or dshot ESCs). + +PWM ESCs communicate using a periodic pulse, where the _width_ of the pulse indicates the desired power level. +The pulse wdith typically ranges between 1000uS for zero power and 2000uS for full power. +The periodic frame rate of the signal depends on the capability of the ESC, and commonly ranges between 50Hz and 490 Hz (the theoretical maximum being 500Hz for a very small "off" cycle). +A higher rate is better for ESCs, in particular where a rapid response to setpoint changes is needed. +For PWM servos 50Hz is usually sufficient, and many don't support higher rates. + +![duty cycle for PWM](../../assets/peripherals/esc_pwm_duty_cycle.png) + +In addition to being a relatively slow protocol PWM ESCs require [calibration](../advanced_config/esc_calibration.md) because the range values representing low and high values can vary signficantly. +Unlike [dshot](#dshot) and [UAVCAN ESC](#UAVCAN) they do not have the ability to provide telemetry and feedback on ESC (or servo) state. + +Setup: +- [ESC Wiring](../peripherals/pwm_escs_and_servo.md) +- [PX4 Configuration](../peripherals/pwm_escs_and_servo.md#px4-configuration) +- [ESC Calibration](../advanced_config/esc_calibration.md) + + + +### Oneshot 125 + +[OneShot 125 ESCs](../peripherals/oneshot.md) are usually much faster than PWM ESCs, and hence more responsive and easier to tune. +They are preferred over PWM for multicopters (but not as much as [DShot ESCs](#dshot), which do not require calibration, and may provide telemetry feedback). +There are a number of variants of the OneShot protocol, which support different rates. +PX4 only supports OneShot 125. + +OneShot 125 is the same as PWM but uses pulse widths that are 8 times shorter (from 125us to 250us for zero to full power). +This allows OneShot 125 ESCs to have a much shorter duty cycle/higher rate. +For PWM the theoretical maximum is close to 500 Hz while for OneShot it approaches 4 kHz. +The actual supported rate depends on the ESC used. + +Setup: +- [ESC Wiring](../peripherals/pwm_escs_and_servo.md) (same as for PWM ESCs) +- [PX4 Configuration](../peripherals/oneshot.md#px4-configuration) +- [ESC Calibration](../advanced_config/esc_calibration.md) + +### DShot + +[DShot](../peripherals/dshot.md) is a digital ESC protocol that is highly recommended for vehicles that can benefit from reduce latency, in particular racing multicopters, VTOL vehicles, and so on. + +It has reduced latency annd is more robust than both [PWM](#pwm) and [OneShot](#oneshot). +In addition it does not require ESC calibration, telemetry is available from some ESCs, and you can revers motor spin directions + +PX4 configuration is done by setting the desired rate using [DSHOT_CONFIG](../advanced_config/parameter_reference.md#DSHOT_CONFIG). +The parameter value indicates the data rate in kbaud - e.g. DShot150 has a rate of 150kbaud. +Higher rates result in lower latency, but lower rates are more robust (and hence more suitable for large aircraft with longer leads); some ESCs only support lower rates (see datasheets for information). + +Setup: +- [ESC Wiring](../peripherals/pwm_escs_and_servo.md) (same as for PWM ESCs) +- [PX4 Configuration](../peripherals/dshot.md#configuration) (using [DSHOT_CONFIG](../advanced_config/parameter_reference.md#DSHOT_CONFIG)) +- [DShot](../peripherals/dshot.md) also contains information about how to send commands etc. + +### UAVCAN + +[UAVCAN ESCs](../peripherals/uavcan_escs.md) are recommended when UAVCAN is the primary bus used for your vehicle. +The PX4 implementation is currently limited to update rates of 200Hz. + +UAVCAN shares many similar benefits to [Dshot](#dshot) including high data rates, robust connection over long leads, telemetry feedback, no need for calibration of the ESC itself. + +[UAVCAN ESCs](../peripherals/uavcan_escs.md) are connected via the UAVCAN bus (setup and configuration are covered at that link). \ No newline at end of file diff --git a/en/peripherals/oneshot.md b/en/peripherals/oneshot.md new file mode 100644 index 000000000000..805be204ed7a --- /dev/null +++ b/en/peripherals/oneshot.md @@ -0,0 +1,38 @@ +# OneShot Servos and ESCs (Motor Controllers) + +PX4 support OneShot 125 ESCs (only). +These are typically faster and more responsive than [PWM ESCs](../peripherals/pwm_escs_and_servo.md) but share the same wiring setup (all you need to do is set some different parameters) + +:::note +[DShot](../peripherals/dshot.md) should always be used instead of OneShot where possible, as it is more responsive, more robust, does not required calibration, and may support telemetry. +The only reason not to use DShot would be hardware limitations (insufficient DShot pins available or using an ESC that does not support DShot). +::: + + +## Overview + +OneShot is essentially a version of [PWM](../peripherals/pwm_escs_and_servo.md) that can be, in theory, up to 8 times faster. + +Both PWM and OneShot communicate using a periodic pulse, where the width of the pulse indicates the desired power level. +For PWM the pulse length typically ranges between 1000uS (zero) and 2000uS (full power), while for OneShot 125 the pulse widths are 8 times shorter, ranging from 125us (zero power) to 250us (full power). + +The theoretical maximum rate at which pulses can be sent, and hence the responsiveness, depends on the width of the largest pulse. +For PWM this rate is close to 500 Hz while for OneShot it approaches 4 kHz. +In practice the actual maximum rate for OneShot ESCs is typically between 1 kHz and 2 kHz, depending on the ESC used. + + +## Setup + +### Wiring + +Wiring is exactly the same as for [PWM ESCs](../peripherals/pwm_escs_and_servo.md) (and dshot). + +### PX4 Configuration + +To enable OneShot set the following parameters: +- [DSHOT_CONFIG](../advanced_config/parameter_reference.md#DSHOT_CONFIG): Set to `0` in order to _disable_ DShot (so you can use OneShot) +- [PWM_MAIN_RATE](../advanced_config/parameter_reference.md#PWM_MAIN_RATE)/[PWM_AUX_RATE](../advanced_config/parameter_reference.md#PWM_AUX_RATE): Set to `0` to enable OneShot 125 for all MAIN (IO) and AUX (FMU) ESC outputs, respectively. +- [PWM_MAIN_MIN](../advanced_config/parameter_reference.md#PWM_MAIN_MIN)/[PWM_AUX_MIN](../advanced_config/parameter_reference.md#PWM_AUX_MIN) and [PWM_MAIN_MAX](../advanced_config/parameter_reference.md#PWM_MAIN_MAX)/[PWM_AUX_MAX](../advanced_config/parameter_reference.md#PWM_AUX_MAX): set to the normal PWM range, nominally `1000` to `2000`. + These are scaled internally to output appropriate pulse-widths for Oneshot. + +Then perform [ESC Calibration](../advanced_config/esc_calibration.md). diff --git a/en/peripherals/pwm_escs_and_servo.md b/en/peripherals/pwm_escs_and_servo.md index 58ced63491c9..cea2a4351130 100644 --- a/en/peripherals/pwm_escs_and_servo.md +++ b/en/peripherals/pwm_escs_and_servo.md @@ -58,9 +58,16 @@ On an opto-isolated ESC **without** BEC, the +5V line might need to be connected In this case the wire will normally be connected to the flight controller servo rail, and the servo rail must be powered from an additional BEC. -## PWM Configuration +## PX4 Configuration -The PX4 PWM configuration parameters can be found here: [PWM Outputs](../advanced_config/parameter_reference.md#pwm-outputs). +Configure the outputs using the following paramters: +- [PWM_MAIN_RATE](../advanced_config/parameter_reference.md#PWM_MAIN_RATE) (IO) and/or [PWM_AUX_RATE](../advanced_config/parameter_reference.md#PWM_AUX_RATE) (FMU): Set to the highest frame rate supported by the connected ESC, in Hz. +- [PWM_MAIN_MIN](../advanced_config/parameter_reference.md#PWM_MAIN_MIN)/[PWM_AUX_MIN](../advanced_config/parameter_reference.md#PWM_AUX_MIN) and [PWM_MAIN_MAX](../advanced_config/parameter_reference.md#PWM_MAIN_MAX)/[PWM_AUX_MAX](../advanced_config/parameter_reference.md#PWM_AUX_MAX): Set to the normal PWM range, nominally `1000` to `2000`. +- [DSHOT_CONFIG](../advanced_config/parameter_reference.md#DSHOT_CONFIG): Set to `0` in order to disable DShot. + +Then perform [ESC Calibration](../advanced_config/esc_calibration.md). + +Additional PX4 PWM configuration parameters can be found here: [PWM Outputs](../advanced_config/parameter_reference.md#pwm-outputs). ## Troubleshooting