Fixed problems with bitbanged Dshot and lazily allocated timers. (#8861)

Fixed problems with bitbanged Dshot and lazily allocated timers.
This commit is contained in:
Michael Keller 2019-09-11 01:21:59 +12:00 committed by GitHub
commit 2a18209492
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 32 additions and 2 deletions

View File

@ -477,6 +477,10 @@ static const char* const lookupTableInterpolatedSetpoint[] = {
"OFF", "ON", "AVERAGED"
};
static const char* const lookupTableDshotBitbangedTimer[] = {
"AUTO", "TIM1", "TIM8"
};
#define LOOKUP_TABLE_ENTRY(name) { name, ARRAYLEN(name) }
@ -594,6 +598,7 @@ const lookupTableEntry_t lookupTables[] = {
LOOKUP_TABLE_ENTRY(lookupTablePositionAltSource),
LOOKUP_TABLE_ENTRY(lookupTableOffOnAuto),
LOOKUP_TABLE_ENTRY(lookupTableInterpolatedSetpoint),
LOOKUP_TABLE_ENTRY(lookupTableDshotBitbangedTimer),
};
#undef LOOKUP_TABLE_ENTRY
@ -767,7 +772,8 @@ const clivalue_t valueTable[] = {
{ "dshot_bidir", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotTelemetry) },
#endif
#ifdef USE_DSHOT_BITBANG
{ "dshot_bitbang", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON_AUTO }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotBitbang) },
{ "dshot_bitbang", VAR_UINT8 | HARDWARE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON_AUTO }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotBitbang) },
{ "dshot_bitbang_timer", VAR_UINT8 | HARDWARE_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_DSHOT_BITBANGED_TIMER }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useDshotBitbangedTimer) },
#endif
#endif
{ "use_unsynced_pwm", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_MOTOR_CONFIG, offsetof(motorConfig_t, dev.useUnsyncedPwm) },

View File

@ -137,6 +137,7 @@ typedef enum {
TABLE_POSITION_ALT_SOURCE,
TABLE_OFF_ON_AUTO,
TABLE_INTERPOLATED_SP,
TABLE_DSHOT_BITBANGED_TIMER,
LOOKUP_TABLE_COUNT
} lookupTableIndex_e;

View File

@ -311,6 +311,10 @@ static void bbFindPacerTimer(void)
for (unsigned timerIndex = 0; timerIndex < ARRAYLEN(bbTimerHardware); timerIndex++) {
timer = &bbTimerHardware[timerIndex];
int timNumber = timerGetTIMNumber(timer->tim);
if ((motorConfig()->dev.useDshotBitbangedTimer == DSHOT_BITBANGED_TIMER_TIM1 && timNumber != 1)
|| (motorConfig()->dev.useDshotBitbangedTimer == DSHOT_BITBANGED_TIMER_TIM8 && timNumber != 8)) {
continue;
}
bool timerConflict = false;
for (int channel = 0; channel < CC_CHANNELS_PER_TIMER; channel++) {
const resourceOwner_e timerOwner = timerGetOwner(timNumber, CC_CHANNEL_FROM_INDEX(channel))->owner;
@ -334,6 +338,7 @@ static void bbFindPacerTimer(void)
if (dmaGetOwner(dmaIdentifier)->owner == OWNER_FREE &&
!usedTimerChannels[timNumber][timer->channel]) {
usedTimerChannels[timNumber][timer->channel] = true;
break;
}
}

View File

@ -75,7 +75,8 @@ void pgResetFn_motorConfig(motorConfig_t *motorConfig)
motorConfig->motorPoleCount = 14; // Most brushes motors that we use are 14 poles
#ifdef USE_DSHOT_BITBANG
motorConfig->dev.useDshotBitbang = DSHOT_BITBANG_AUTO;
motorConfig->dev.useDshotBitbang = DSHOT_BITBANG_DEFAULT;
motorConfig->dev.useDshotBitbangedTimer = DSHOT_BITBANGED_TIMER_DEFAULT;
#endif
}

View File

@ -25,6 +25,12 @@
#include "drivers/io.h"
#include "drivers/dshot_bitbang.h"
typedef enum {
DSHOT_BITBANGED_TIMER_AUTO = 0,
DSHOT_BITBANGED_TIMER_TIM1,
DSHOT_BITBANGED_TIMER_TIM8,
} dshotBitbangedTimer_e;
typedef struct motorDevConfig_s {
uint16_t motorPwmRate; // The update rate of motor outputs (50-498Hz)
uint8_t motorPwmProtocol; // Pwm Protocol
@ -35,6 +41,7 @@ typedef struct motorDevConfig_s {
ioTag_t ioTags[MAX_SUPPORTED_MOTORS];
uint8_t motorTransportProtocol;
uint8_t useDshotBitbang;
uint8_t useDshotBitbangedTimer;
} motorDevConfig_t;
typedef struct motorConfig_s {

View File

@ -661,3 +661,13 @@
#endif
#define MAX_SUPPORTED_SERVOS 8
#endif
#if defined(USE_DSHOT_BITBANG)
#if !defined(DSHOT_BITBANG_DEFAULT)
#define DSHOT_BITBANG_DEFAULT DSHOT_BITBANG_AUTO
#endif
#if !defined(DSHOT_BITBANGED_TIMER_DEFAULT)
#define DSHOT_BITBANGED_TIMER_DEFAULT DSHOT_BITBANGED_TIMER_AUTO
#endif
#endif // USE_DSHOT_BITBANG