From 817936f5c96a92ec977176db2ce2a49b56c83374 Mon Sep 17 00:00:00 2001 From: "Jeffrey M. Friesen" Date: Wed, 11 Aug 2021 10:58:48 -0700 Subject: [PATCH] Updates to stormcore configs --- hwconf/hw_stormcore_100s.c | 121 +++++++++++++++++++++++++++++++++++++ hwconf/hw_stormcore_100s.h | 52 ++++++++++++++++ hwconf/hw_stormcore_60d.c | 6 +- hwconf/hw_stormcore_60d.h | 25 ++++++-- 4 files changed, 195 insertions(+), 9 deletions(-) diff --git a/hwconf/hw_stormcore_100s.c b/hwconf/hw_stormcore_100s.c index 15664c6d..0143e3a6 100644 --- a/hwconf/hw_stormcore_100s.c +++ b/hwconf/hw_stormcore_100s.c @@ -21,9 +21,15 @@ #include "hal.h" #include "stm32f4xx_conf.h" #include "utils.h" +#include "ledpwm.h" #include "drv8323s.h" +#if defined (HW_VER_IS_100S_V2) +static THD_WORKING_AREA(switch_color_thread_wa, 128); +static THD_FUNCTION(switch_color_thread, arg); +static volatile float switch_bright = 1.0; +#endif // I2C configuration static const I2CConfig i2cfg = { @@ -40,6 +46,17 @@ void hw_init_gpio(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); +#if defined (HW_VER_IS_100S_V2) + palSetPadMode(PHASE_FILTER_GPIO, PHASE_FILTER_PIN, + PAL_MODE_OUTPUT_PUSHPULL | + PAL_STM32_OSPEED_HIGHEST); + PHASE_FILTER_OFF(); + palSetPadMode(SWITCH_LED_1_GPIO,SWITCH_LED_1_PIN, PAL_MODE_OUTPUT_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(SWITCH_LED_2_GPIO,SWITCH_LED_2_PIN, PAL_MODE_OUTPUT_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(SWITCH_LED_3_GPIO,SWITCH_LED_3_PIN, PAL_MODE_OUTPUT_OPENDRAIN | PAL_STM32_OSPEED_HIGHEST); + chThdCreateStatic(switch_color_thread_wa, sizeof(switch_color_thread_wa), LOWPRIO, switch_color_thread, NULL); +#endif + // LEDs palSetPadMode(GPIOB, 0, PAL_MODE_OUTPUT_PUSHPULL | @@ -244,4 +261,108 @@ void hw_try_restore_i2c(void) { } } +#if defined (HW_VER_IS_100S_V2) +static THD_FUNCTION(switch_color_thread, arg) { + (void)arg; + chRegSetThreadName("switch_color_thread"); + float switch_red = 0.0; + float switch_green = 0.0; + float switch_blue = 0.0; + + for(int i = 0; i < 400; i++) { + float angle = i*3.14/400.0; + float s,c; + utils_fast_sincos_better(angle, &s, &c); + switch_blue = 0.75* c*c; + ledpwm_set_intensity(LED_HW1,switch_bright*switch_blue); + utils_fast_sincos_better(angle + 3.14/3.0, &s, &c); + switch_green = 0.75* c*c; + ledpwm_set_intensity(LED_HW2,switch_bright*switch_green); + utils_fast_sincos_better(angle + 6.28/3.0, &s, &c); + switch_red = 0.75* c*c; + ledpwm_set_intensity(LED_HW3,switch_bright*switch_red); + chThdSleepMilliseconds(4); + } + float switch_red_old = switch_red_old; + float switch_green_old = switch_green; + float switch_blue_old = switch_blue; + float wh_left; + float left = mc_interface_get_battery_level(&wh_left); + if(left < 0.5){ + float intense = utils_map(left,0.0, 0.5, 0.0, 1.0); + utils_truncate_number(&intense,0,1); + switch_blue = intense; + switch_red = 1.0-intense; + }else{ + float intense = utils_map(left , 0.5, 1.0, 0.0, 1.0); + utils_truncate_number(&intense,0,1); + switch_green = intense; + switch_blue = 1.0-intense; + } + for(int i = 0; i < 100; i++) { + float red_now = utils_map((float) i,0.0, 100.0, switch_red_old, switch_red); + float blue_now = utils_map((float) i,0.0, 100.0, switch_blue_old, switch_blue); + float green_now = utils_map((float) i,0.0, 100.0, switch_green_old, switch_green); + ledpwm_set_intensity(LED_HW1, switch_bright*blue_now); + ledpwm_set_intensity(LED_HW2, switch_bright*green_now); + ledpwm_set_intensity(LED_HW3, switch_bright*red_now); + chThdSleepMilliseconds(2); + } + + for (;;) { + mc_fault_code fault = mc_interface_get_fault(); + mc_interface_select_motor_thread(2); + mc_fault_code fault2 = mc_interface_get_fault(); + mc_interface_select_motor_thread(1); + if (fault != FAULT_CODE_NONE || fault2 != FAULT_CODE_NONE) { + ledpwm_set_intensity(LED_HW2, 0); + ledpwm_set_intensity(LED_HW1, 0); + for (int i = 0;i < (int)fault;i++) { + + ledpwm_set_intensity(LED_HW3, 1.0); + chThdSleepMilliseconds(250); + ledpwm_set_intensity(LED_HW3, 0.0); + chThdSleepMilliseconds(250); + } + + chThdSleepMilliseconds(500); + + for (int i = 0;i < (int)fault2;i++) { + ledpwm_set_intensity(LED_HW3, 1.0); + chThdSleepMilliseconds(250); + ledpwm_set_intensity(LED_HW3, 0.0); + chThdSleepMilliseconds(250); + } + + chThdSleepMilliseconds(500); + } else { + left = mc_interface_get_battery_level(&wh_left); + if(HW_SAMPLE_SHUTDOWN()){ + switch_bright = 0.5; + }else{ + switch_bright = 1.0; + } + + if(left < 0.5){ + float intense = utils_map(left,0.0, 0.5, 0.0, 1.0); + utils_truncate_number(&intense,0,1); + switch_blue = intense; + switch_red = 1.0-intense; + switch_green = 0; + }else{ + float intense = utils_map(left , 0.5, 1.0, 0.0, 1.0); + utils_truncate_number(&intense,0,1); + switch_green = intense; + switch_blue = 1.0-intense; + switch_red = 0; + } + ledpwm_set_intensity(LED_HW1, switch_bright*switch_blue); + ledpwm_set_intensity(LED_HW2, switch_bright*switch_green); + ledpwm_set_intensity(LED_HW3, switch_bright*switch_red); + } + + chThdSleepMilliseconds(20); + } +} +#endif diff --git a/hwconf/hw_stormcore_100s.h b/hwconf/hw_stormcore_100s.h index 1852ba80..9bcedfd4 100644 --- a/hwconf/hw_stormcore_100s.h +++ b/hwconf/hw_stormcore_100s.h @@ -28,6 +28,48 @@ #define HW_HAS_DRV8323S #define HW_HAS_3_SHUNTS +#if defined(HW_VER_IS_100S_V2) +#define SWITCH_LED_3_GPIO GPIOC +#define SWITCH_LED_3_PIN 15 +#define SWITCH_LED_2_GPIO GPIOC +#define SWITCH_LED_2_PIN 14 +#define SWITCH_LED_1_GPIO GPIOC +#define SWITCH_LED_1_PIN 13 + +#define LED_PWM1_ON() palClearPad(SWITCH_LED_1_GPIO,SWITCH_LED_1_PIN) +#define LED_PWM1_OFF() palSetPad(SWITCH_LED_1_GPIO,SWITCH_LED_1_PIN) +#define LED_PWM2_ON() palClearPad(SWITCH_LED_2_GPIO, SWITCH_LED_2_PIN) +#define LED_PWM2_OFF() palSetPad(SWITCH_LED_2_GPIO, SWITCH_LED_2_PIN) +#define LED_PWM3_ON() palClearPad(SWITCH_LED_3_GPIO, SWITCH_LED_3_PIN) +#define LED_PWM3_OFF() palSetPad(SWITCH_LED_3_GPIO, SWITCH_LED_3_PIN) + + +//#define HW_HAS_PHASE_FILTERS +#define PHASE_FILTER_GPIO GPIOA +#define PHASE_FILTER_PIN 15 +#define PHASE_FILTER_ON() palSetPad(PHASE_FILTER_GPIO, PHASE_FILTER_PIN) +#define PHASE_FILTER_OFF() palClearPad(PHASE_FILTER_GPIO, PHASE_FILTER_PIN) + +// Shutdown pin +#define HW_SHUTDOWN_GPIO GPIOB +#define HW_SHUTDOWN_PIN 2 +#define HW_SWITCH_SENSE_GPIO GPIOB +#define HW_SWITCH_SENSE_PIN 12 +#define HW_SHUTDOWN_HOLD_ON() palSetPad(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN) +#define HW_SHUTDOWN_HOLD_OFF() palClearPad(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN) +#define HW_SAMPLE_SHUTDOWN() palReadPad(HW_SWITCH_SENSE_GPIO, HW_SWITCH_SENSE_PIN) + +// Hold shutdown pin early to wake up on short pulses +#define HW_EARLY_INIT() palSetPadMode(HW_SHUTDOWN_GPIO, HW_SHUTDOWN_PIN, PAL_MODE_OUTPUT_PUSHPULL); \ + HW_SHUTDOWN_HOLD_ON(); \ + palSetPadMode(HW_SWITCH_SENSE_GPIO, HW_SWITCH_SENSE_PIN, \ + PAL_MODE_INPUT_PULLDOWN); \ + palSetPadMode(PHASE_FILTER_GPIO, PHASE_FILTER_PIN, \ + PAL_MODE_OUTPUT_PUSHPULL | \ + PAL_STM32_OSPEED_HIGHEST); \ + PHASE_FILTER_OFF() +#endif + #define DRV8323S_CUSTOM_SETTINGS() drv8323s_set_current_amp_gain(CURRENT_AMP_GAIN); \ drv8323s_write_reg(3,0x3af); \ drv8323s_write_reg(4,0x7af); @@ -101,12 +143,22 @@ #ifndef VIN_R2 #define VIN_R2 2200.0 #endif + +#if defined(HW_VER_IS_100S_V2) +#ifndef CURRENT_AMP_GAIN +#define CURRENT_AMP_GAIN 20.0 +#endif +#ifndef CURRENT_SHUNT_RES +#define CURRENT_SHUNT_RES 0.0005 +#endif +#else #ifndef CURRENT_AMP_GAIN #define CURRENT_AMP_GAIN 10.0 #endif #ifndef CURRENT_SHUNT_RES #define CURRENT_SHUNT_RES 0.001 #endif +#endif // Input voltage #define GET_INPUT_VOLTAGE() ((V_REG / 4095.0) * (float)ADC_Value[ADC_IND_VIN_SENS] * ((VIN_R1 + VIN_R2) / VIN_R2)) diff --git a/hwconf/hw_stormcore_60d.c b/hwconf/hw_stormcore_60d.c index c43b8bcc..9d2fa3b8 100644 --- a/hwconf/hw_stormcore_60d.c +++ b/hwconf/hw_stormcore_60d.c @@ -61,7 +61,7 @@ void hw_init_gpio(void) { RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); -#ifdef HW_VER_IS_60D_PLUS +#if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS) palSetPadMode(PHASE_FILTER_GPIO, PHASE_FILTER_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); @@ -367,7 +367,6 @@ static THD_FUNCTION(mux_thread, arg) { void smart_switch_keep_on(void) { palSetPad(SWITCH_OUT_GPIO, SWITCH_OUT_PIN); - } void smart_switch_shut_down(void) { @@ -523,7 +522,6 @@ static THD_FUNCTION(smart_switch_thread, arg) { mc_interface_unlock(); break; case SWITCH_HELD_AFTER_TURN_ON: - smart_switch_keep_on(); if(smart_switch_is_pressed()){ switch_state = SWITCH_HELD_AFTER_TURN_ON; } else { @@ -541,11 +539,11 @@ static THD_FUNCTION(smart_switch_thread, arg) { if (millis_switch_pressed > SMART_SWITCH_MSECS_PRESSED_OFF) { switch_state = SWITCH_SHUTTING_DOWN; + comm_can_shutdown(255); } break; case SWITCH_SHUTTING_DOWN: switch_bright = 0; - comm_can_shutdown(255); smart_switch_shut_down(); chThdSleepMilliseconds(10000); smart_switch_keep_on(); diff --git a/hwconf/hw_stormcore_60d.h b/hwconf/hw_stormcore_60d.h index 2ce81519..e50836cb 100644 --- a/hwconf/hw_stormcore_60d.h +++ b/hwconf/hw_stormcore_60d.h @@ -19,6 +19,8 @@ #ifdef HW_VER_IS_60D_PLUS #define HW_NAME "STORMCORE_60D+" +#elif defined (HW_VER_IS_60D_XS) +#define HW_NAME "STORMCORE_60Dxs" #else #define HW_NAME "STORMCORE_60D" #endif @@ -30,9 +32,15 @@ #define HW_HAS_DRV8323S // for idrive do 0x073b for reg 4 (LS) and 0x034b for reg 3 (HS) #define HW_HAS_3_SHUNTS +#if defined (HW_VER_IS_60D_XS) +#define DRV8323S_CUSTOM_SETTINGS(); drv8323s_set_current_amp_gain(CURRENT_AMP_GAIN); \ + drv8323s_write_reg(3,0x3aa); \ + drv8323s_write_reg(4,0x7aa); +#else #define DRV8323S_CUSTOM_SETTINGS(); drv8323s_set_current_amp_gain(CURRENT_AMP_GAIN); \ drv8323s_write_reg(3,0x3af); \ drv8323s_write_reg(4,0x7af); +#endif @@ -64,8 +72,8 @@ #define SMART_SWITCH_MSECS_PRESSED_OFF 2000 -#ifdef HW_VER_IS_60D_PLUS -#define HW_HAS_PHASE_FILTERS +#if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS) +//#define HW_HAS_PHASE_FILTERS #define PHASE_FILTER_GPIO GPIOE #define PHASE_FILTER_PIN 1 #define PHASE_FILTER_GPIO_M2 GPIOE @@ -103,7 +111,7 @@ #define HW_UART_P_RX_PORT GPIOA #define HW_UART_P_RX_PIN 10 -#ifdef HW_VER_IS_60D_PLUS +#if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS) //Pins for Third UART #define HW_UART_3_BAUD 115200 #define HW_UART_3_DEV SD2 @@ -116,10 +124,17 @@ // SPI for DRV8301 +#ifdef HW_VER_IS_60D_XS +#define DRV8323S_MOSI_GPIO GPIOC +#define DRV8323S_MOSI_PIN 11 +#define DRV8323S_MISO_GPIO GPIOC +#define DRV8323S_MISO_PIN 12 +#else #define DRV8323S_MOSI_GPIO GPIOC #define DRV8323S_MOSI_PIN 12 #define DRV8323S_MISO_GPIO GPIOC #define DRV8323S_MISO_PIN 11 +#endif #define DRV8323S_SCK_GPIO GPIOC #define DRV8323S_SCK_PIN 10 #define DRV8323S_CS_GPIO GPIOC @@ -246,7 +261,7 @@ #define VIN_R2 2200.0 #endif -#ifdef HW_VER_IS_60D_PLUS +#if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS) #ifndef CURRENT_AMP_GAIN #define CURRENT_AMP_GAIN 20.0 #endif @@ -364,7 +379,7 @@ // NRF SWD -#ifdef HW_VER_IS_60D_PLUS +#if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS) #define NRF5x_SWDIO_GPIO GPIOD #define NRF5x_SWDIO_PIN 9 #define NRF5x_SWCLK_GPIO GPIOD