Updates to stormcore configs

This commit is contained in:
Jeffrey M. Friesen 2021-08-11 10:58:48 -07:00
parent d02d74ceee
commit 817936f5c9
4 changed files with 195 additions and 9 deletions

View File

@ -21,9 +21,15 @@
#include "hal.h" #include "hal.h"
#include "stm32f4xx_conf.h" #include "stm32f4xx_conf.h"
#include "utils.h" #include "utils.h"
#include "ledpwm.h"
#include "drv8323s.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 // I2C configuration
static const I2CConfig i2cfg = { static const I2CConfig i2cfg = {
@ -40,6 +46,17 @@ void hw_init_gpio(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, 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 // LEDs
palSetPadMode(GPIOB, 0, palSetPadMode(GPIOB, 0,
PAL_MODE_OUTPUT_PUSHPULL | 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

View File

@ -28,6 +28,48 @@
#define HW_HAS_DRV8323S #define HW_HAS_DRV8323S
#define HW_HAS_3_SHUNTS #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); \ #define DRV8323S_CUSTOM_SETTINGS() drv8323s_set_current_amp_gain(CURRENT_AMP_GAIN); \
drv8323s_write_reg(3,0x3af); \ drv8323s_write_reg(3,0x3af); \
drv8323s_write_reg(4,0x7af); drv8323s_write_reg(4,0x7af);
@ -101,12 +143,22 @@
#ifndef VIN_R2 #ifndef VIN_R2
#define VIN_R2 2200.0 #define VIN_R2 2200.0
#endif #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 #ifndef CURRENT_AMP_GAIN
#define CURRENT_AMP_GAIN 10.0 #define CURRENT_AMP_GAIN 10.0
#endif #endif
#ifndef CURRENT_SHUNT_RES #ifndef CURRENT_SHUNT_RES
#define CURRENT_SHUNT_RES 0.001 #define CURRENT_SHUNT_RES 0.001
#endif #endif
#endif
// Input voltage // Input voltage
#define GET_INPUT_VOLTAGE() ((V_REG / 4095.0) * (float)ADC_Value[ADC_IND_VIN_SENS] * ((VIN_R1 + VIN_R2) / VIN_R2)) #define GET_INPUT_VOLTAGE() ((V_REG / 4095.0) * (float)ADC_Value[ADC_IND_VIN_SENS] * ((VIN_R1 + VIN_R2) / VIN_R2))

View File

@ -61,7 +61,7 @@ void hw_init_gpio(void) {
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); 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, palSetPadMode(PHASE_FILTER_GPIO, PHASE_FILTER_PIN,
PAL_MODE_OUTPUT_PUSHPULL | PAL_MODE_OUTPUT_PUSHPULL |
PAL_STM32_OSPEED_HIGHEST); PAL_STM32_OSPEED_HIGHEST);
@ -367,7 +367,6 @@ static THD_FUNCTION(mux_thread, arg) {
void smart_switch_keep_on(void) { void smart_switch_keep_on(void) {
palSetPad(SWITCH_OUT_GPIO, SWITCH_OUT_PIN); palSetPad(SWITCH_OUT_GPIO, SWITCH_OUT_PIN);
} }
void smart_switch_shut_down(void) { void smart_switch_shut_down(void) {
@ -523,7 +522,6 @@ static THD_FUNCTION(smart_switch_thread, arg) {
mc_interface_unlock(); mc_interface_unlock();
break; break;
case SWITCH_HELD_AFTER_TURN_ON: case SWITCH_HELD_AFTER_TURN_ON:
smart_switch_keep_on();
if(smart_switch_is_pressed()){ if(smart_switch_is_pressed()){
switch_state = SWITCH_HELD_AFTER_TURN_ON; switch_state = SWITCH_HELD_AFTER_TURN_ON;
} else { } else {
@ -541,11 +539,11 @@ static THD_FUNCTION(smart_switch_thread, arg) {
if (millis_switch_pressed > SMART_SWITCH_MSECS_PRESSED_OFF) { if (millis_switch_pressed > SMART_SWITCH_MSECS_PRESSED_OFF) {
switch_state = SWITCH_SHUTTING_DOWN; switch_state = SWITCH_SHUTTING_DOWN;
comm_can_shutdown(255);
} }
break; break;
case SWITCH_SHUTTING_DOWN: case SWITCH_SHUTTING_DOWN:
switch_bright = 0; switch_bright = 0;
comm_can_shutdown(255);
smart_switch_shut_down(); smart_switch_shut_down();
chThdSleepMilliseconds(10000); chThdSleepMilliseconds(10000);
smart_switch_keep_on(); smart_switch_keep_on();

View File

@ -19,6 +19,8 @@
#ifdef HW_VER_IS_60D_PLUS #ifdef HW_VER_IS_60D_PLUS
#define HW_NAME "STORMCORE_60D+" #define HW_NAME "STORMCORE_60D+"
#elif defined (HW_VER_IS_60D_XS)
#define HW_NAME "STORMCORE_60Dxs"
#else #else
#define HW_NAME "STORMCORE_60D" #define HW_NAME "STORMCORE_60D"
#endif #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_DRV8323S // for idrive do 0x073b for reg 4 (LS) and 0x034b for reg 3 (HS)
#define HW_HAS_3_SHUNTS #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); \ #define DRV8323S_CUSTOM_SETTINGS(); drv8323s_set_current_amp_gain(CURRENT_AMP_GAIN); \
drv8323s_write_reg(3,0x3af); \ drv8323s_write_reg(3,0x3af); \
drv8323s_write_reg(4,0x7af); drv8323s_write_reg(4,0x7af);
#endif
@ -64,8 +72,8 @@
#define SMART_SWITCH_MSECS_PRESSED_OFF 2000 #define SMART_SWITCH_MSECS_PRESSED_OFF 2000
#ifdef HW_VER_IS_60D_PLUS #if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS)
#define HW_HAS_PHASE_FILTERS //#define HW_HAS_PHASE_FILTERS
#define PHASE_FILTER_GPIO GPIOE #define PHASE_FILTER_GPIO GPIOE
#define PHASE_FILTER_PIN 1 #define PHASE_FILTER_PIN 1
#define PHASE_FILTER_GPIO_M2 GPIOE #define PHASE_FILTER_GPIO_M2 GPIOE
@ -103,7 +111,7 @@
#define HW_UART_P_RX_PORT GPIOA #define HW_UART_P_RX_PORT GPIOA
#define HW_UART_P_RX_PIN 10 #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 //Pins for Third UART
#define HW_UART_3_BAUD 115200 #define HW_UART_3_BAUD 115200
#define HW_UART_3_DEV SD2 #define HW_UART_3_DEV SD2
@ -116,10 +124,17 @@
// SPI for DRV8301 // 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_GPIO GPIOC
#define DRV8323S_MOSI_PIN 12 #define DRV8323S_MOSI_PIN 12
#define DRV8323S_MISO_GPIO GPIOC #define DRV8323S_MISO_GPIO GPIOC
#define DRV8323S_MISO_PIN 11 #define DRV8323S_MISO_PIN 11
#endif
#define DRV8323S_SCK_GPIO GPIOC #define DRV8323S_SCK_GPIO GPIOC
#define DRV8323S_SCK_PIN 10 #define DRV8323S_SCK_PIN 10
#define DRV8323S_CS_GPIO GPIOC #define DRV8323S_CS_GPIO GPIOC
@ -246,7 +261,7 @@
#define VIN_R2 2200.0 #define VIN_R2 2200.0
#endif #endif
#ifdef HW_VER_IS_60D_PLUS #if defined (HW_VER_IS_60D_PLUS) || defined (HW_VER_IS_60D_XS)
#ifndef CURRENT_AMP_GAIN #ifndef CURRENT_AMP_GAIN
#define CURRENT_AMP_GAIN 20.0 #define CURRENT_AMP_GAIN 20.0
#endif #endif
@ -364,7 +379,7 @@
// NRF SWD // 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_GPIO GPIOD
#define NRF5x_SWDIO_PIN 9 #define NRF5x_SWDIO_PIN 9
#define NRF5x_SWCLK_GPIO GPIOD #define NRF5x_SWCLK_GPIO GPIOD