From 76008fb3ac320427d6e7e6de04642a80e722a0ce Mon Sep 17 00:00:00 2001 From: Iampete1 Date: Sun, 5 Jan 2025 16:18:16 +0000 Subject: [PATCH] Plane: pass throttle slew rate into output motor mask for tiltrotors and tailsitters --- ArduPlane/Plane.h | 1 + ArduPlane/servos.cpp | 20 ++++++++++++-------- ArduPlane/tailsitter.cpp | 2 +- ArduPlane/tiltrotor.cpp | 4 ++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/ArduPlane/Plane.h b/ArduPlane/Plane.h index b272a13b11ff1..a22d9fdb2c803 100644 --- a/ArduPlane/Plane.h +++ b/ArduPlane/Plane.h @@ -1180,6 +1180,7 @@ class Plane : public AP_Vehicle { void servos_twin_engine_mix(); void force_flare(); void throttle_watt_limiter(int8_t &min_throttle, int8_t &max_throttle); + float get_throttle_slewrate() const; void throttle_slew_limit(); bool suppress_throttle(void); void update_throttle_hover(); diff --git a/ArduPlane/servos.cpp b/ArduPlane/servos.cpp index 2ded238cf2f5b..1c1f27f5add17 100644 --- a/ArduPlane/servos.cpp +++ b/ArduPlane/servos.cpp @@ -19,10 +19,10 @@ #include "Plane.h" #include -/***************************************** -* Throttle slew limit -*****************************************/ -void Plane::throttle_slew_limit() +// Get slew rate for throttle as a percentage per second. +// 100% would allow the throttle to move from 0 to 100 in 1 second. +// 0 is disabled +float Plane::get_throttle_slewrate() const { #if HAL_QUADPLANE_ENABLED const bool do_throttle_slew = (control_mode->does_auto_throttle() || quadplane.in_assisted_flight() || quadplane.in_vtol_mode()); @@ -32,10 +32,7 @@ void Plane::throttle_slew_limit() if (!do_throttle_slew) { // only do throttle slew limiting in modes where throttle control is automatic - SRV_Channels::set_slew_rate(SRV_Channel::k_throttle, 0.0, 100, G_Dt); - SRV_Channels::set_slew_rate(SRV_Channel::k_throttleLeft, 0.0, 100, G_Dt); - SRV_Channels::set_slew_rate(SRV_Channel::k_throttleRight, 0.0, 100, G_Dt); - return; + return 0.0; } uint8_t slewrate = aparm.throttle_slewrate; @@ -57,6 +54,13 @@ void Plane::throttle_slew_limit() slewrate = g.takeoff_throttle_slewrate; } #endif + return slewrate; +} + +// Apply throttle slew limit +void Plane::throttle_slew_limit() +{ + const float slewrate = get_throttle_slewrate(); SRV_Channels::set_slew_rate(SRV_Channel::k_throttle, slewrate, 100, G_Dt); SRV_Channels::set_slew_rate(SRV_Channel::k_throttleLeft, slewrate, 100, G_Dt); SRV_Channels::set_slew_rate(SRV_Channel::k_throttleRight, slewrate, 100, G_Dt); diff --git a/ArduPlane/tailsitter.cpp b/ArduPlane/tailsitter.cpp index 759fa3d1a4468..58ca7e389f991 100644 --- a/ArduPlane/tailsitter.cpp +++ b/ArduPlane/tailsitter.cpp @@ -336,7 +336,7 @@ void Tailsitter::output(void) if (!quadplane.assisted_flight) { // set AP_MotorsMatrix throttles for forward flight - motors->output_motor_mask(throttle, motor_mask, plane.rudder_dt); + motors->output_motor_mask(throttle, motor_mask, plane.rudder_dt, plane.get_throttle_slewrate()); // No tilt output unless forward gain is set float tilt_left = 0.0; diff --git a/ArduPlane/tiltrotor.cpp b/ArduPlane/tiltrotor.cpp index fe893b01cd730..e373e4584e767 100644 --- a/ArduPlane/tiltrotor.cpp +++ b/ArduPlane/tiltrotor.cpp @@ -246,7 +246,7 @@ void Tiltrotor::continuous_update(void) if (!quadplane.motor_test.running) { // the motors are all the way forward, start using them for fwd thrust const uint16_t mask = is_zero(current_throttle)?0U:tilt_mask.get(); - motors->output_motor_mask(current_throttle, mask, plane.rudder_dt); + motors->output_motor_mask(current_throttle, mask, plane.rudder_dt, plane.get_throttle_slewrate()); } return; } @@ -367,7 +367,7 @@ void Tiltrotor::binary_update(void) if (current_tilt >= 1) { const uint16_t mask = is_zero(new_throttle)?0U:tilt_mask.get(); // the motors are all the way forward, start using them for fwd thrust - motors->output_motor_mask(new_throttle, mask, plane.rudder_dt); + motors->output_motor_mask(new_throttle, mask, plane.rudder_dt, plane.get_throttle_slewrate()); } } else { binary_slew(false);