Merge pull request #143 from powerdesigns/BBSHD-tuning

More bbshd support
This commit is contained in:
Benjamin Vedder 2020-03-29 17:12:21 +02:00 committed by GitHub
commit 6b3bcca4c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 55 additions and 11 deletions

View File

@ -35,6 +35,7 @@
#define HW_HAS_3_SHUNTS
#define HW_HAS_PHASE_SHUNTS
#define HW_HAS_SIN_COS_ENCODER
#define HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
// Macros
#define ENABLE_GATE() palSetPad(GPIOC, 14)

View File

@ -28,6 +28,8 @@
// Variables
static volatile bool i2c_running = false;
void hw_luna_bbshd_setup_dac(void);
// I2C configuration
static const I2CConfig i2cfg = {
OPMODE_I2C,
@ -99,7 +101,11 @@ void hw_init_gpio(void) {
palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOA, 3, PAL_MODE_INPUT_ANALOG);
#ifdef HW_BBSHD_USE_DAC
hw_luna_bbshd_setup_dac();
#else
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
#endif
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_ANALOG);
@ -120,7 +126,7 @@ void hw_setup_adc_channels(void) {
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, ADC_SampleTime_15Cycles); // 6 ADC_IND_EXT2
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_15Cycles); // 9 TEMP_MOTOR
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 5, ADC_SampleTime_15Cycles); // 12 V_GATE_DRIVER
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_15Cycles); // 15 UNUSED
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_15Cycles); // 15 TEMP_FET
// ADC2 regular channels
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_15Cycles); // 1 SENS2
@ -243,3 +249,30 @@ void hw_try_restore_i2c(void) {
i2cReleaseBus(&HW_I2C_DEV);
}
}
void hw_luna_bbshd_setup_dac(void) {
// GPIOA clock enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// DAC Periph clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
// DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration
palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
// Enable both DAC channels with output buffer disabled to achieve rail-to-rail output
DAC->CR |= DAC_CR_EN1 | DAC_CR_BOFF1 | DAC_CR_EN2 | DAC_CR_BOFF2;
// Set DAC channels at 1.65V
hw_luna_bbshd_DAC1_setdata(0x800);
hw_luna_bbshd_DAC2_setdata(0x800);
}
void hw_luna_bbshd_DAC1_setdata(uint16_t data) {
DAC->DHR12R1 = data;
}
void hw_luna_bbshd_DAC2_setdata(uint16_t data) {
DAC->DHR12R2 = data;
}

View File

@ -26,7 +26,9 @@
// HW properties
#define HW_HAS_3_SHUNTS
#define HW_HAS_PHASE_SHUNTS
#define HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
#define HW_USE_BRK
#define HW_BBSHD_USE_DAC
// Macros
#define LED_GREEN_GPIO GPIOB
@ -62,12 +64,12 @@
#define ADC_IND_CURR2 4
#define ADC_IND_CURR3 5
#define ADC_IND_VIN_SENS 11
#define ADC_IND_GATE_DRV 12
#define ADC_IND_VOUT_GATE_DRV 12
#define ADC_IND_EXT 10
#define ADC_IND_EXT2 6
#define ADC_IND_EXT3 13
#define ADC_IND_TEMP_MOS 8
#define ADC_IND_TEMP_MOS_2 15
#define ADC_IND_TEMP_MOS 15
#define ADC_IND_TEMP_MOS_2 8
#define ADC_IND_TEMP_MOS_3 16
#define ADC_IND_TEMP_MOTOR 9
#define ADC_IND_VREFINT 16
@ -88,15 +90,18 @@
#define CURRENT_AMP_GAIN 20.0
#endif
#ifndef CURRENT_SHUNT_RES
#define CURRENT_SHUNT_RES (0.0005 / 3.0)
#define CURRENT_SHUNT_RES (0.0005 / 2.0)
#endif
// Input voltage
#define GET_INPUT_VOLTAGE() ((V_REG / 4095.0) * (float)ADC_Value[ADC_IND_VIN_SENS] * ((VIN_R1 + VIN_R2) / VIN_R2))
// 12V supply voltage
#define GET_GATE_DRIVER_SUPPLY_VOLTAGE() ((float)ADC_VOLTS(ADC_IND_VOUT_GATE_DRV) * 11.0)
// NTC Termistors
#define NTC_RES(adc_val) ((4095.0 * 10000.0) / adc_val - 10000.0)
#define NTC_TEMP(adc_ind) (1.0 / ((logf(NTC_RES(ADC_Value[adc_ind]) / 10000.0) / 3380.0) + (1.0 / 298.15)) - 273.15)
#define NTC_TEMP(adc_ind) (1.0 / ((logf(NTC_RES(ADC_Value[adc_ind]) / 10000.0) / 3984.0) + (1.0 / 298.15)) - 273.15)
#define NTC_RES_MOTOR(adc_val) (10000.0 / ((4095.0 / (float)adc_val) - 1.0)) // Motor temp sensor on low side
@ -202,7 +207,7 @@
#define READ_HALL3() palReadPad(HW_HALL_ENC_GPIO3, HW_HALL_ENC_PIN3)
// Override dead time.
#define HW_DEAD_TIME_NSEC 660.0
#define HW_DEAD_TIME_NSEC 460.0
// Default setting overrides
#ifndef MCCONF_L_MAX_VOLTAGE
@ -237,6 +242,11 @@
#define HW_LIM_DUTY_MAX 0.0, 0.99
#define HW_LIM_TEMP_FET -40.0, 110.0
#define HW_GATE_DRIVER_SUPPLY_MIN_VOLTAGE 10.0
#define HW_GATE_DRIVER_SUPPLY_MAX_VOLTAGE 14.0
// HW-specific functions
void hw_luna_bbshd_DAC1_setdata(uint16_t data);
void hw_luna_bbshd_DAC2_setdata(uint16_t data);
#endif /* HW_LUNA_BBSHD_H_ */

View File

@ -1675,7 +1675,7 @@ void mc_interface_mc_timer_isr(bool is_second_motor) {
}
#endif
#ifdef HW_VERSION_AXIOM
#ifdef HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
if(motor->m_gate_driver_voltage > HW_GATE_DRIVER_SUPPLY_MAX_VOLTAGE) {
mc_interface_fault_stop(FAULT_CODE_GATE_DRIVER_OVER_VOLTAGE, is_second_motor);
}
@ -1932,7 +1932,7 @@ static void update_override_limits(volatile motor_if_state_t *motor, volatile mc
UTILS_LP_FAST(motor->m_temp_motor, temp_motor, 0.1);
#ifdef HW_VERSION_AXIOM
#ifdef HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
UTILS_LP_FAST(motor->m_gate_driver_voltage, GET_GATE_DRIVER_SUPPLY_VOLTAGE(), 0.01);
#endif

View File

@ -128,7 +128,7 @@ void terminal_process_string(char *str) {
commands_printf("Current : %.1f", (double)fault_vec[i].current);
commands_printf("Current filtered : %.1f", (double)fault_vec[i].current_filtered);
commands_printf("Voltage : %.2f", (double)fault_vec[i].voltage);
#ifdef HW_VERSION_AXIOM
#ifdef HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
commands_printf("Gate drv voltage : %.2f", (double)fault_vec[i].gate_driver_voltage);
#endif
commands_printf("Duty : %.3f", (double)fault_vec[i].duty);
@ -194,7 +194,7 @@ void terminal_process_string(char *str) {
commands_printf("Current 2 sample: %u\n", current2_samp);
} else if (strcmp(argv[0], "volt") == 0) {
commands_printf("Input voltage: %.2f\n", (double)GET_INPUT_VOLTAGE());
#ifdef HW_VERSION_AXIOM
#ifdef HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
commands_printf("Gate driver power supply output voltage: %.2f\n", (double)GET_GATE_DRIVER_SUPPLY_VOLTAGE());
#endif
} else if (strcmp(argv[0], "param_detect") == 0) {