From 61827e6fd07d358d43fe67e9a7e2559f7cf3e991 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 7 Jan 2017 09:08:33 +1100 Subject: [PATCH 1/3] Adding DSHOT1200 and 900 --- src/main/drivers/pwm_output.c | 2 ++ src/main/drivers/pwm_output.h | 16 ++++++++++++++++ src/main/drivers/pwm_output_stm32f3xx.c | 16 ++++++---------- src/main/drivers/pwm_output_stm32f4xx.c | 16 ++++++---------- src/main/drivers/pwm_output_stm32f7xx.c | 10 ---------- src/main/fc/serial_cli.c | 2 +- src/main/flight/mixer.c | 14 +++++++++++--- 7 files changed, 42 insertions(+), 34 deletions(-) diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index 2a123b8c9..a98d510c0 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -223,6 +223,8 @@ void motorInit(const motorConfig_t *motorConfig, uint16_t idlePulse, uint8_t mot idlePulse = 0; break; #ifdef USE_DSHOT + case PWM_TYPE_DSHOT1200: + case PWM_TYPE_DSHOT900: case PWM_TYPE_DSHOT600: case PWM_TYPE_DSHOT300: case PWM_TYPE_DSHOT150: diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index 4966f38ab..64c31292c 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -30,11 +30,27 @@ typedef enum { PWM_TYPE_DSHOT600, PWM_TYPE_DSHOT300, PWM_TYPE_DSHOT150, + PWM_TYPE_DSHOT900, + PWM_TYPE_DSHOT1200, PWM_TYPE_MAX } motorPwmProtocolTypes_e; #define PWM_TIMER_MHZ 1 +#ifdef USE_DSHOT +#define MAX_DMA_TIMERS 8 + +#define MOTOR_DSHOT1200_MHZ 24 +#define MOTOR_DSHOT900_MHZ 18 +#define MOTOR_DSHOT600_MHZ 12 +#define MOTOR_DSHOT300_MHZ 6 +#define MOTOR_DSHOT150_MHZ 3 + +#define MOTOR_BIT_0 7 +#define MOTOR_BIT_1 14 +#define MOTOR_BITLENGTH 19 +#endif + #if defined(STM32F40_41xxx) // must be multiples of timer clock #define ONESHOT125_TIMER_MHZ 12 #define ONESHOT42_TIMER_MHZ 21 diff --git a/src/main/drivers/pwm_output_stm32f3xx.c b/src/main/drivers/pwm_output_stm32f3xx.c index cad425954..efb99c8ed 100644 --- a/src/main/drivers/pwm_output_stm32f3xx.c +++ b/src/main/drivers/pwm_output_stm32f3xx.c @@ -32,16 +32,6 @@ #ifdef USE_DSHOT -#define MAX_DMA_TIMERS 8 - -#define MOTOR_DSHOT600_MHZ 24 -#define MOTOR_DSHOT300_MHZ 12 -#define MOTOR_DSHOT150_MHZ 6 - -#define MOTOR_BIT_0 14 -#define MOTOR_BIT_1 29 -#define MOTOR_BITLENGTH 39 - static uint8_t dmaMotorTimerCount = 0; static motorDmaTimer_t dmaMotorTimers[MAX_DMA_TIMERS]; static motorDmaOutput_t dmaMotors[MAX_SUPPORTED_MOTORS]; @@ -148,6 +138,12 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t uint32_t hz; switch (pwmProtocolType) { + case(PWM_TYPE_DSHOT1200): + hz = MOTOR_DSHOT1200_MHZ * 1000000; + break; + case(PWM_TYPE_DSHOT900): + hz = MOTOR_DSHOT900_MHZ * 1000000; + break; case(PWM_TYPE_DSHOT600): hz = MOTOR_DSHOT600_MHZ * 1000000; break; diff --git a/src/main/drivers/pwm_output_stm32f4xx.c b/src/main/drivers/pwm_output_stm32f4xx.c index d10d133ce..b883c4c89 100644 --- a/src/main/drivers/pwm_output_stm32f4xx.c +++ b/src/main/drivers/pwm_output_stm32f4xx.c @@ -31,16 +31,6 @@ #ifdef USE_DSHOT -#define MAX_DMA_TIMERS 8 - -#define MOTOR_DSHOT600_MHZ 12 -#define MOTOR_DSHOT300_MHZ 6 -#define MOTOR_DSHOT150_MHZ 3 - -#define MOTOR_BIT_0 7 -#define MOTOR_BIT_1 14 -#define MOTOR_BITLENGTH 19 - static uint8_t dmaMotorTimerCount = 0; static motorDmaTimer_t dmaMotorTimers[MAX_DMA_TIMERS]; static motorDmaOutput_t dmaMotors[MAX_SUPPORTED_MOTORS]; @@ -146,6 +136,12 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t uint32_t hz; switch (pwmProtocolType) { + case(PWM_TYPE_DSHOT1200): + hz = MOTOR_DSHOT1200_MHZ * 1000000; + break; + case(PWM_TYPE_DSHOT900): + hz = MOTOR_DSHOT900_MHZ * 1000000; + break; case(PWM_TYPE_DSHOT600): hz = MOTOR_DSHOT600_MHZ * 1000000; break; diff --git a/src/main/drivers/pwm_output_stm32f7xx.c b/src/main/drivers/pwm_output_stm32f7xx.c index 2a52652d1..adabb4877 100644 --- a/src/main/drivers/pwm_output_stm32f7xx.c +++ b/src/main/drivers/pwm_output_stm32f7xx.c @@ -30,16 +30,6 @@ #ifdef USE_DSHOT -#define MAX_DMA_TIMERS 8 - -#define MOTOR_DSHOT600_MHZ 12 -#define MOTOR_DSHOT300_MHZ 6 -#define MOTOR_DSHOT150_MHZ 3 - -#define MOTOR_BIT_0 7 -#define MOTOR_BIT_1 14 -#define MOTOR_BITLENGTH 19 - static uint8_t dmaMotorTimerCount = 0; static motorDmaTimer_t dmaMotorTimers[MAX_DMA_TIMERS]; static motorDmaOutput_t dmaMotors[MAX_SUPPORTED_MOTORS]; diff --git a/src/main/fc/serial_cli.c b/src/main/fc/serial_cli.c index 2cf8aae67..0df34424d 100755 --- a/src/main/fc/serial_cli.c +++ b/src/main/fc/serial_cli.c @@ -334,7 +334,7 @@ static const char * const lookupTableSuperExpoYaw[] = { static const char * const lookupTablePwmProtocol[] = { "OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED", #ifdef USE_DSHOT - "DSHOT600", "DSHOT300", "DSHOT150" + "DSHOT600", "DSHOT300", "DSHOT150", "DSHOT900", "DSHOT1200", #endif }; diff --git a/src/main/flight/mixer.c b/src/main/flight/mixer.c index 59e505fb5..5be4a6abd 100755 --- a/src/main/flight/mixer.c +++ b/src/main/flight/mixer.c @@ -247,11 +247,19 @@ uint8_t getMotorCount() bool isMotorProtocolDshot(void) { #ifdef USE_DSHOT - if (motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT150 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT300 || motorConfig->motorPwmProtocol == PWM_TYPE_DSHOT600) + switch(motorConfig->motorPwmProtocol) { + case PWM_TYPE_DSHOT1200: + case PWM_TYPE_DSHOT900: + case PWM_TYPE_DSHOT600: + case PWM_TYPE_DSHOT300: + case PWM_TYPE_DSHOT150: return true; - else + default: + return false; + } +#else + return false; #endif - return false; } // Add here scaled ESC outputs for digital protol From 81da3040a254ac824306855e827ceda325bd0c98 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 7 Jan 2017 09:56:40 +1100 Subject: [PATCH 2/3] re-ordered based on review - requires co-ordination with configurator --- src/main/config/config_eeprom.h | 2 +- src/main/drivers/pwm_output.h | 4 ++-- src/main/fc/serial_cli.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/config/config_eeprom.h b/src/main/config/config_eeprom.h index 179eed363..a012ae9db 100644 --- a/src/main/config/config_eeprom.h +++ b/src/main/config/config_eeprom.h @@ -17,7 +17,7 @@ #pragma once -#define EEPROM_CONF_VERSION 148 +#define EEPROM_CONF_VERSION 149 void initEEPROM(void); void writeEEPROM(); diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index 64c31292c..0a61d9155 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -27,11 +27,11 @@ typedef enum { PWM_TYPE_ONESHOT42, PWM_TYPE_MULTISHOT, PWM_TYPE_BRUSHED, + PWM_TYPE_DSHOT1200, + PWM_TYPE_DSHOT900, PWM_TYPE_DSHOT600, PWM_TYPE_DSHOT300, PWM_TYPE_DSHOT150, - PWM_TYPE_DSHOT900, - PWM_TYPE_DSHOT1200, PWM_TYPE_MAX } motorPwmProtocolTypes_e; diff --git a/src/main/fc/serial_cli.c b/src/main/fc/serial_cli.c index 0df34424d..2df3d2a4d 100755 --- a/src/main/fc/serial_cli.c +++ b/src/main/fc/serial_cli.c @@ -334,7 +334,7 @@ static const char * const lookupTableSuperExpoYaw[] = { static const char * const lookupTablePwmProtocol[] = { "OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED", #ifdef USE_DSHOT - "DSHOT600", "DSHOT300", "DSHOT150", "DSHOT900", "DSHOT1200", + "DSHOT1200", "DSHOT900", "DSHOT600", "DSHOT300", "DSHOT150", #endif }; From 9c9a3fe9098f5ba4aefcc7bd0ee639c1deb2c7fb Mon Sep 17 00:00:00 2001 From: blckmn Date: Sat, 7 Jan 2017 20:28:22 +1100 Subject: [PATCH 3/3] Improvements and order by ascending as requested --- src/main/drivers/pwm_output.c | 19 +++++++++++++++ src/main/drivers/pwm_output.h | 9 +++---- src/main/drivers/pwm_output_stm32f3xx.c | 21 +---------------- src/main/drivers/pwm_output_stm32f4xx.c | 21 +---------------- src/main/drivers/pwm_output_stm32f7xx.c | 31 ++----------------------- src/main/fc/serial_cli.c | 2 +- 6 files changed, 29 insertions(+), 74 deletions(-) diff --git a/src/main/drivers/pwm_output.c b/src/main/drivers/pwm_output.c index a98d510c0..08736418d 100644 --- a/src/main/drivers/pwm_output.c +++ b/src/main/drivers/pwm_output.c @@ -286,6 +286,25 @@ pwmOutputPort_t *pwmGetMotors(void) return motors; } +#ifdef USE_DSHOT +uint32_t getDshotHz(motorPwmProtocolTypes_e pwmProtocolType) +{ + switch (pwmProtocolType) { + case(PWM_TYPE_DSHOT1200): + return MOTOR_DSHOT1200_MHZ * 1000000; + case(PWM_TYPE_DSHOT900): + return MOTOR_DSHOT900_MHZ * 1000000; + case(PWM_TYPE_DSHOT600): + return MOTOR_DSHOT600_MHZ * 1000000; + case(PWM_TYPE_DSHOT300): + return MOTOR_DSHOT300_MHZ * 1000000; + default: + case(PWM_TYPE_DSHOT150): + return MOTOR_DSHOT150_MHZ * 1000000; + } +} +#endif + #ifdef USE_SERVOS void pwmWriteServo(uint8_t index, uint16_t value) { diff --git a/src/main/drivers/pwm_output.h b/src/main/drivers/pwm_output.h index 0a61d9155..ea231f5a0 100644 --- a/src/main/drivers/pwm_output.h +++ b/src/main/drivers/pwm_output.h @@ -27,11 +27,11 @@ typedef enum { PWM_TYPE_ONESHOT42, PWM_TYPE_MULTISHOT, PWM_TYPE_BRUSHED, - PWM_TYPE_DSHOT1200, - PWM_TYPE_DSHOT900, - PWM_TYPE_DSHOT600, - PWM_TYPE_DSHOT300, PWM_TYPE_DSHOT150, + PWM_TYPE_DSHOT300, + PWM_TYPE_DSHOT600, + PWM_TYPE_DSHOT900, + PWM_TYPE_DSHOT1200, PWM_TYPE_MAX } motorPwmProtocolTypes_e; @@ -114,6 +114,7 @@ void servoInit(const servoConfig_t *servoConfig); void pwmServoConfig(const struct timerHardware_s *timerHardware, uint8_t servoIndex, uint16_t servoPwmRate, uint16_t servoCenterPulse); #ifdef USE_DSHOT +uint32_t getDshotHz(motorPwmProtocolTypes_e pwmProtocolType); void pwmWriteDigital(uint8_t index, uint16_t value); void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t motorIndex, motorPwmProtocolTypes_e pwmProtocolType); void pwmCompleteDigitalMotorUpdate(uint8_t motorCount); diff --git a/src/main/drivers/pwm_output_stm32f3xx.c b/src/main/drivers/pwm_output_stm32f3xx.c index efb99c8ed..ffaa5f80d 100644 --- a/src/main/drivers/pwm_output_stm32f3xx.c +++ b/src/main/drivers/pwm_output_stm32f3xx.c @@ -136,26 +136,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t RCC_ClockCmd(timerRCC(timer), ENABLE); TIM_Cmd(timer, DISABLE); - uint32_t hz; - switch (pwmProtocolType) { - case(PWM_TYPE_DSHOT1200): - hz = MOTOR_DSHOT1200_MHZ * 1000000; - break; - case(PWM_TYPE_DSHOT900): - hz = MOTOR_DSHOT900_MHZ * 1000000; - break; - 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) / getDshotHz(pwmProtocolType)) - 1); TIM_TimeBaseStructure.TIM_Period = MOTOR_BITLENGTH; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; diff --git a/src/main/drivers/pwm_output_stm32f4xx.c b/src/main/drivers/pwm_output_stm32f4xx.c index b883c4c89..92926adde 100644 --- a/src/main/drivers/pwm_output_stm32f4xx.c +++ b/src/main/drivers/pwm_output_stm32f4xx.c @@ -134,26 +134,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t RCC_ClockCmd(timerRCC(timer), ENABLE); TIM_Cmd(timer, DISABLE); - uint32_t hz; - switch (pwmProtocolType) { - case(PWM_TYPE_DSHOT1200): - hz = MOTOR_DSHOT1200_MHZ * 1000000; - break; - case(PWM_TYPE_DSHOT900): - hz = MOTOR_DSHOT900_MHZ * 1000000; - break; - 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) / getDshotHz(pwmProtocolType)) - 1; TIM_TimeBaseStructure.TIM_Period = MOTOR_BITLENGTH; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; diff --git a/src/main/drivers/pwm_output_stm32f7xx.c b/src/main/drivers/pwm_output_stm32f7xx.c index adabb4877..b5cc04328 100644 --- a/src/main/drivers/pwm_output_stm32f7xx.c +++ b/src/main/drivers/pwm_output_stm32f7xx.c @@ -139,21 +139,8 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t if (configureTimer) { RCC_ClockCmd(timerRCC(timer), ENABLE); - 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.Init.Prescaler = (SystemCoreClock / timerClockDivisor(timer) / hz) - 1;; + motor->TimHandle.Init.Prescaler = (SystemCoreClock / timerClockDivisor(timer) / getDshotHz(pwmProtocolType)) - 1;; motor->TimHandle.Init.Period = MOTOR_BITLENGTH; motor->TimHandle.Init.RepetitionCounter = 0; motor->TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; @@ -170,21 +157,7 @@ void pwmDigitalMotorHardwareConfig(const timerHardware_t *timerHardware, uint8_t motor->TimHandle = dmaMotors[timerIndex].TimHandle; } - switch (timerHardware->channel) { - case TIM_CHANNEL_1: - motor->timerDmaSource = TIM_DMA_ID_CC1; - break; - case TIM_CHANNEL_2: - motor->timerDmaSource = TIM_DMA_ID_CC2; - break; - case TIM_CHANNEL_3: - motor->timerDmaSource = TIM_DMA_ID_CC3; - break; - case TIM_CHANNEL_4: - motor->timerDmaSource = TIM_DMA_ID_CC4; - break; - } - + motor->timerDmaSource = timerDmaSource(timerHardware->channel); dmaMotorTimers[timerIndex].timerDmaSources |= motor->timerDmaSource; /* Set the parameters to be configured */ diff --git a/src/main/fc/serial_cli.c b/src/main/fc/serial_cli.c index 2df3d2a4d..c372c23a1 100755 --- a/src/main/fc/serial_cli.c +++ b/src/main/fc/serial_cli.c @@ -334,7 +334,7 @@ static const char * const lookupTableSuperExpoYaw[] = { static const char * const lookupTablePwmProtocol[] = { "OFF", "ONESHOT125", "ONESHOT42", "MULTISHOT", "BRUSHED", #ifdef USE_DSHOT - "DSHOT1200", "DSHOT900", "DSHOT600", "DSHOT300", "DSHOT150", + "DSHOT150", "DSHOT300", "DSHOT600", "DSHOT900", "DSHOT1200", #endif };