From 3580632288f67df886465d5d2dc9898453841478 Mon Sep 17 00:00:00 2001 From: Jacob Dahl Date: Tue, 17 Mar 2026 16:53:37 -0800 Subject: [PATCH] fix(dshot): send motor stop for 3D mode deadzone instead of min throttle In DShot 3D mode, convert_output_to_3d_scaling() returns DSHOT_DISARM_VALUE (0) for deadzone inputs. But up_dshot_motor_data_set() adds the MIN_throttle offset (+48), causing motors to spin at minimum throttle instead of stopping. Check the result of calculate_output_value() for DSHOT_DISARM_VALUE and send an explicit motor stop command, bypassing the +48 offset. --- src/drivers/dshot/DShot.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/drivers/dshot/DShot.cpp b/src/drivers/dshot/DShot.cpp index 100f5cdb5d..8c96c3a3ab 100644 --- a/src/drivers/dshot/DShot.cpp +++ b/src/drivers/dshot/DShot.cpp @@ -368,7 +368,15 @@ void DShot::update_motor_outputs(uint16_t outputs[MAX_ACTUATORS], int num_output up_dshot_motor_command(i, DSHOT_CMD_MOTOR_STOP, set_telemetry_bit); } else { - up_dshot_motor_data_set(i, calculate_output_value(outputs[i], i), set_telemetry_bit); + uint16_t output = calculate_output_value(outputs[i], i); + + // 3D deadzone: send motor stop to avoid MIN_throttle offset in up_dshot_motor_data_set + if (output == DSHOT_DISARM_VALUE) { + up_dshot_motor_command(i, DSHOT_CMD_MOTOR_STOP, set_telemetry_bit); + + } else { + up_dshot_motor_data_set(i, output, set_telemetry_bit); + } } } }