SRV_Channel: support reversible DShot motors

force the PWM MIN/MAX to 1000/2000
This commit is contained in:
Andrew Tridgell 2018-11-09 21:26:38 +11:00
parent 8dd58b4181
commit fbcbbb72b1
3 changed files with 42 additions and 2 deletions

View File

@ -446,6 +446,16 @@ public:
// disable output to a set of channels given by a mask. This is used by the AP_BLHeli code // disable output to a set of channels given by a mask. This is used by the AP_BLHeli code
static void set_disabled_channel_mask(uint16_t mask) { disabled_mask = mask; } static void set_disabled_channel_mask(uint16_t mask) { disabled_mask = mask; }
// add to mask of outputs which can do reverse thrust using digital controls
static void set_reversible_mask(uint16_t mask) {
reversible_mask |= mask;
}
// add to mask of outputs which use digital (non-PWM) output, such as DShot
static void set_digital_mask(uint16_t mask) {
digital_mask |= mask;
}
private: private:
struct { struct {
bool k_throttle_reversible:1; bool k_throttle_reversible:1;
@ -477,6 +487,13 @@ private:
#endif #endif
static uint16_t disabled_mask; static uint16_t disabled_mask;
// mask of outputs which use a digital output protocol, not
// PWM (eg. DShot)
static uint16_t digital_mask;
// mask of outputs which are digitally reversible (eg. DShot-3D)
static uint16_t reversible_mask;
SRV_Channel obj_channels[NUM_SERVO_CHANNELS]; SRV_Channel obj_channels[NUM_SERVO_CHANNELS];
static struct srv_function { static struct srv_function {

View File

@ -161,9 +161,30 @@ void SRV_Channels::enable_aux_servos()
// includes k_none servos, which allows those to get their initial // includes k_none servos, which allows those to get their initial
// trim value on startup // trim value on startup
for (uint8_t i = 0; i < NUM_SERVO_CHANNELS; i++) { for (uint8_t i = 0; i < NUM_SERVO_CHANNELS; i++) {
SRV_Channel &c = channels[i];
// see if it is a valid function // see if it is a valid function
if ((uint8_t)channels[i].function.get() < SRV_Channel::k_nr_aux_servo_functions) { if ((uint8_t)c.function.get() < SRV_Channel::k_nr_aux_servo_functions) {
hal.rcout->enable_ch(channels[i].ch_num); hal.rcout->enable_ch(c.ch_num);
}
/*
for channels which have been marked as digital output then the
MIN/MAX/TRIM values have no meaning for controlling output, as
the HAL handles the scaling. We still need to cope with places
in the code that may try to set a PWM value however, so to
ensure consistency we force the MIN/MAX/TRIM to be consistent
across all digital channels. We use a MIN/MAX of 1000/2000, and
set TRIM to either 1000 or 1500 depending on whether the channel
is reversible
*/
if (digital_mask & (1U<<i)) {
c.servo_min.set(1000);
c.servo_max.set(2000);
if (reversible_mask & (1U<<i)) {
c.servo_trim.set(1500);
} else {
c.servo_trim.set(1000);
}
} }
} }

View File

@ -39,6 +39,8 @@ AP_BLHeli *SRV_Channels::blheli_ptr;
#endif #endif
uint16_t SRV_Channels::disabled_mask; uint16_t SRV_Channels::disabled_mask;
uint16_t SRV_Channels::digital_mask;
uint16_t SRV_Channels::reversible_mask;
bool SRV_Channels::disabled_passthrough; bool SRV_Channels::disabled_passthrough;
bool SRV_Channels::initialised; bool SRV_Channels::initialised;