Add DSHOT300
Bool check for dshot protocol Add dshot300 to init ident
This commit is contained in:
parent
726a8d29e2
commit
f79896b1bd
|
@ -189,6 +189,7 @@ void motorInit(const motorConfig_t *motorConfig, uint16_t idlePulse, uint8_t mot
|
||||||
break;
|
break;
|
||||||
#ifdef USE_DSHOT
|
#ifdef USE_DSHOT
|
||||||
case PWM_TYPE_DSHOT600:
|
case PWM_TYPE_DSHOT600:
|
||||||
|
case PWM_TYPE_DSHOT300:
|
||||||
case PWM_TYPE_DSHOT150:
|
case PWM_TYPE_DSHOT150:
|
||||||
pwmCompleteWritePtr = pwmCompleteDigitalMotorUpdate;
|
pwmCompleteWritePtr = pwmCompleteDigitalMotorUpdate;
|
||||||
isDigital = true;
|
isDigital = true;
|
||||||
|
|
|
@ -28,6 +28,7 @@ typedef enum {
|
||||||
PWM_TYPE_MULTISHOT,
|
PWM_TYPE_MULTISHOT,
|
||||||
PWM_TYPE_BRUSHED,
|
PWM_TYPE_BRUSHED,
|
||||||
PWM_TYPE_DSHOT600,
|
PWM_TYPE_DSHOT600,
|
||||||
|
PWM_TYPE_DSHOT300,
|
||||||
PWM_TYPE_DSHOT150,
|
PWM_TYPE_DSHOT150,
|
||||||
PWM_TYPE_MAX
|
PWM_TYPE_MAX
|
||||||
} motorPwmProtocolTypes_e;
|
} motorPwmProtocolTypes_e;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#define MAX_DMA_TIMERS 8
|
#define MAX_DMA_TIMERS 8
|
||||||
|
|
||||||
#define MOTOR_DSHOT600_MHZ 24
|
#define MOTOR_DSHOT600_MHZ 24
|
||||||
|
#define MOTOR_DSHOT300_MHZ 12
|
||||||
#define MOTOR_DSHOT150_MHZ 6
|
#define MOTOR_DSHOT150_MHZ 6
|
||||||
|
|
||||||
#define MOTOR_BIT_0 14
|
#define MOTOR_BIT_0 14
|
||||||
|
@ -122,7 +123,19 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t
|
||||||
RCC_ClockCmd(timerRCC(timer), ENABLE);
|
RCC_ClockCmd(timerRCC(timer), ENABLE);
|
||||||
TIM_Cmd(timer, DISABLE);
|
TIM_Cmd(timer, DISABLE);
|
||||||
|
|
||||||
uint32_t hz = (pwmProtocolType == PWM_TYPE_DSHOT600 ? MOTOR_DSHOT600_MHZ : MOTOR_DSHOT150_MHZ) * 1000000;
|
uint32_t hz;
|
||||||
|
switch (pwmProtocolType) {
|
||||||
|
case(PWM_TYPE_DSHOT600):
|
||||||
|
hz = MOTOR_DSHOT600_MHZ * 1000000;
|
||||||
|
break;
|
||||||
|
case(PWM_TYPE_DSHOT300):
|
||||||
|
hz = MOTOR_DSHOT300_MHZ * 1000000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case(PWM_TYPE_DSHOT150):
|
||||||
|
hz = MOTOR_DSHOT150_MHZ * 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((SystemCoreClock / timerClockDivisor(timer) / hz) - 1);
|
TIM_TimeBaseStructure.TIM_Prescaler = (uint16_t)((SystemCoreClock / timerClockDivisor(timer) / hz) - 1);
|
||||||
TIM_TimeBaseStructure.TIM_Period = MOTOR_BITLENGTH;
|
TIM_TimeBaseStructure.TIM_Period = MOTOR_BITLENGTH;
|
||||||
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#define MAX_DMA_TIMERS 8
|
#define MAX_DMA_TIMERS 8
|
||||||
|
|
||||||
#define MOTOR_DSHOT600_MHZ 12
|
#define MOTOR_DSHOT600_MHZ 12
|
||||||
|
#define MOTOR_DSHOT300_MHZ 6
|
||||||
#define MOTOR_DSHOT150_MHZ 3
|
#define MOTOR_DSHOT150_MHZ 3
|
||||||
|
|
||||||
#define MOTOR_BIT_0 7
|
#define MOTOR_BIT_0 7
|
||||||
|
@ -123,7 +124,19 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t
|
||||||
RCC_ClockCmd(timerRCC(timer), ENABLE);
|
RCC_ClockCmd(timerRCC(timer), ENABLE);
|
||||||
TIM_Cmd(timer, DISABLE);
|
TIM_Cmd(timer, DISABLE);
|
||||||
|
|
||||||
uint32_t hz = (pwmProtocolType == PWM_TYPE_DSHOT600 ? MOTOR_DSHOT600_MHZ : MOTOR_DSHOT150_MHZ) * 1000000;
|
uint32_t hz;
|
||||||
|
switch (pwmProtocolType) {
|
||||||
|
case(PWM_TYPE_DSHOT600):
|
||||||
|
hz = MOTOR_DSHOT600_MHZ * 1000000;
|
||||||
|
break;
|
||||||
|
case(PWM_TYPE_DSHOT300):
|
||||||
|
hz = MOTOR_DSHOT300_MHZ * 1000000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case(PWM_TYPE_DSHOT150):
|
||||||
|
hz = MOTOR_DSHOT150_MHZ * 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / timerClockDivisor(timer) / hz) - 1;
|
TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock / timerClockDivisor(timer) / hz) - 1;
|
||||||
TIM_TimeBaseStructure.TIM_Period = MOTOR_BITLENGTH;
|
TIM_TimeBaseStructure.TIM_Period = MOTOR_BITLENGTH;
|
||||||
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#define MAX_DMA_TIMERS 8
|
#define MAX_DMA_TIMERS 8
|
||||||
|
|
||||||
#define MOTOR_DSHOT600_MHZ 12
|
#define MOTOR_DSHOT600_MHZ 12
|
||||||
|
#define MOTOR_DSHOT300_MHZ 6
|
||||||
#define MOTOR_DSHOT150_MHZ 3
|
#define MOTOR_DSHOT150_MHZ 3
|
||||||
|
|
||||||
#define MOTOR_BIT_0 7
|
#define MOTOR_BIT_0 7
|
||||||
|
@ -128,7 +129,19 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t
|
||||||
if (configureTimer) {
|
if (configureTimer) {
|
||||||
RCC_ClockCmd(timerRCC(timer), ENABLE);
|
RCC_ClockCmd(timerRCC(timer), ENABLE);
|
||||||
|
|
||||||
uint32_t hz = (pwmProtocolType == PWM_TYPE_DSHOT600 ? MOTOR_DSHOT600_MHZ : MOTOR_DSHOT150_MHZ) * 1000000;
|
uint32_t hz;
|
||||||
|
switch (pwmProtocolType) {
|
||||||
|
case(PWM_TYPE_DSHOT600):
|
||||||
|
hz = MOTOR_DSHOT600_MHZ * 1000000;
|
||||||
|
break;
|
||||||
|
case(PWM_TYPE_DSHOT300):
|
||||||
|
hz = MOTOR_DSHOT300_MHZ * 1000000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case(PWM_TYPE_DSHOT150):
|
||||||
|
hz = MOTOR_DSHOT150_MHZ * 1000000;
|
||||||
|
}
|
||||||
|
|
||||||
motor->TimHandle.Instance = timerHardware->tim;
|
motor->TimHandle.Instance = timerHardware->tim;
|
||||||
motor->TimHandle.Init.Prescaler = (SystemCoreClock / timerClockDivisor(timer) / hz) - 1;;
|
motor->TimHandle.Init.Prescaler = (SystemCoreClock / timerClockDivisor(timer) / hz) - 1;;
|
||||||
motor->TimHandle.Init.Period = MOTOR_BITLENGTH;
|
motor->TimHandle.Init.Period = MOTOR_BITLENGTH;
|
||||||
|
|
|
@ -259,7 +259,7 @@ void resetMotorConfig(motorConfig_t *motorConfig)
|
||||||
#endif
|
#endif
|
||||||
motorConfig->maxthrottle = 2000;
|
motorConfig->maxthrottle = 2000;
|
||||||
motorConfig->mincommand = 1000;
|
motorConfig->mincommand = 1000;
|
||||||
motorConfig->digitalIdleOffset = 0;
|
motorConfig->digitalIdleOffset = 40;
|
||||||
|
|
||||||
uint8_t motorIndex = 0;
|
uint8_t motorIndex = 0;
|
||||||
for (int i = 0; i < USABLE_TIMER_CHANNEL_COUNT && i < MAX_SUPPORTED_MOTORS; i++) {
|
for (int i = 0; i < USABLE_TIMER_CHANNEL_COUNT && i < MAX_SUPPORTED_MOTORS; i++) {
|
||||||
|
|
|
@ -653,7 +653,7 @@ static bool mspFcProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProcessFn
|
||||||
sbufWriteU16(dst, 0);
|
sbufWriteU16(dst, 0);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (masterConfig.motorConfig.motorPwmProtocol == PWM_TYPE_DSHOT150 || masterConfig.motorConfig.motorPwmProtocol == PWM_TYPE_DSHOT600)
|
if (isMotorProtocolDshot())
|
||||||
sbufWriteU16(dst, constrain((motor[i] / 2) + 1000, 1000, 2000)); // This is to get it working in the configurator
|
sbufWriteU16(dst, constrain((motor[i] / 2) + 1000, 1000, 2000)); // This is to get it working in the configurator
|
||||||
else
|
else
|
||||||
sbufWriteU16(dst, motor[i]);
|
sbufWriteU16(dst, motor[i]);
|
||||||
|
|
|
@ -336,9 +336,16 @@ static motorMixer_t *customMixers;
|
||||||
static uint16_t disarmMotorOutput, minMotorOutputNormal, maxMotorOutputNormal, deadbandMotor3dHigh, deadbandMotor3dLow;
|
static uint16_t disarmMotorOutput, minMotorOutputNormal, maxMotorOutputNormal, deadbandMotor3dHigh, deadbandMotor3dLow;
|
||||||
static float rcCommandThrottleRange;
|
static float rcCommandThrottleRange;
|
||||||
|
|
||||||
|
bool isMotorProtocolDshot(void) {
|
||||||
|
if (motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT150 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT300 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT600)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Add here scaled ESC outputs for digital protol
|
// Add here scaled ESC outputs for digital protol
|
||||||
void initEscEndpoints(void) {
|
void initEscEndpoints(void) {
|
||||||
if (motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT150 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT600) {
|
if (isMotorProtocolDshot()) {
|
||||||
disarmMotorOutput = DSHOT_DISARM_COMMAND;
|
disarmMotorOutput = DSHOT_DISARM_COMMAND;
|
||||||
minMotorOutputNormal = DSHOT_MIN_THROTTLE + motorConfig->digitalIdleOffset;
|
minMotorOutputNormal = DSHOT_MIN_THROTTLE + motorConfig->digitalIdleOffset;
|
||||||
maxMotorOutputNormal = DSHOT_MAX_THROTTLE;
|
maxMotorOutputNormal = DSHOT_MAX_THROTTLE;
|
||||||
|
@ -843,7 +850,7 @@ void mixTable(void *pidProfilePtr)
|
||||||
motor[i] = lrintf( motorOutputMin + (motorOutputRange * (motorMix[i] + (throttle * currentMixer[i].throttle))) );
|
motor[i] = lrintf( motorOutputMin + (motorOutputRange * (motorMix[i] + (throttle * currentMixer[i].throttle))) );
|
||||||
|
|
||||||
if (failsafeIsActive()) {
|
if (failsafeIsActive()) {
|
||||||
if (motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT150 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT600)
|
if (isMotorProtocolDshot())
|
||||||
motor[i] = (motor[i] < motorOutputMin) ? disarmMotorOutput : motor[i]; // Prevent getting into special reserved range
|
motor[i] = (motor[i] < motorOutputMin) ? disarmMotorOutput : motor[i]; // Prevent getting into special reserved range
|
||||||
|
|
||||||
motor[i] = constrain(motor[i], disarmMotorOutput, motorOutputMax);
|
motor[i] = constrain(motor[i], disarmMotorOutput, motorOutputMax);
|
||||||
|
@ -875,7 +882,7 @@ void mixTable(void *pidProfilePtr)
|
||||||
// Disarmed mode
|
// Disarmed mode
|
||||||
if (!ARMING_FLAG(ARMED)) {
|
if (!ARMING_FLAG(ARMED)) {
|
||||||
for (i = 0; i < motorCount; i++) {
|
for (i = 0; i < motorCount; i++) {
|
||||||
if (motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT150 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT600) {
|
if (isMotorProtocolDshot()) {
|
||||||
motor[i] = (motor_disarmed[i] < motorOutputMin) ? disarmMotorOutput : motor_disarmed[i]; // Prevent getting into special reserved range
|
motor[i] = (motor_disarmed[i] < motorOutputMin) ? disarmMotorOutput : motor_disarmed[i]; // Prevent getting into special reserved range
|
||||||
|
|
||||||
if (motor_disarmed[i] != disarmMotorOutput)
|
if (motor_disarmed[i] != disarmMotorOutput)
|
||||||
|
|
|
@ -230,3 +230,4 @@ void syncMotors(bool enabled);
|
||||||
void writeMotors(void);
|
void writeMotors(void);
|
||||||
void stopMotors(void);
|
void stopMotors(void);
|
||||||
void stopPwmAllMotors(void);
|
void stopPwmAllMotors(void);
|
||||||
|
bool isMotorProtocolDshot(void);
|
||||||
|
|
|
@ -525,7 +525,7 @@ static const char * const lookupTableSuperExpoYaw[] = {
|
||||||
static const char * const lookupTablePwmProtocol[] = {
|
static const char * const lookupTablePwmProtocol[] = {
|
||||||
"OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED",
|
"OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED",
|
||||||
#ifdef USE_DSHOT
|
#ifdef USE_DSHOT
|
||||||
"DSHOT600", "DSHOT150"
|
"DSHOT600", "DSHOT300", "DSHOT150"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue