Axiom: Individual IGBT temperature monitoring

Signed-off-by: Marcos Chaparro <mchaparro@powerdesigns.ca>
This commit is contained in:
Marcos Chaparro 2019-05-09 19:12:54 -03:00
parent a80829f5c5
commit 90dee2b31e
2 changed files with 86 additions and 41 deletions

View File

@ -28,7 +28,9 @@
#include "utils.h"
#include "terminal.h"
#include "commands.h"
#include "mc_interface.h"
#include "stdio.h"
#include <math.h>
#include "hw_axiom_fpga_bitstream.c" //this file ONLY contains the fpga binary blob
@ -172,9 +174,9 @@ void hw_init_gpio(void) {
hw_axiom_setup_dac();
#else
palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG); //Temperature bridge A
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); //Temperature bridge B
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG); //Temperature bridge B
#endif
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG); //Temperature bridge C
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG); //Temperature bridge C
palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_ANALOG); //Accel 2
#ifndef HW_PALTA_REV_B
@ -215,26 +217,28 @@ void hw_init_gpio(void) {
void hw_setup_adc_channels(void) {
// ADC1 regular channels
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 4, ADC_SampleTime_15Cycles);
//ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 5, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 5, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles); // 0 SENS1
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 2, ADC_SampleTime_15Cycles); // 3 CURR1
ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 3, ADC_SampleTime_15Cycles); // 6 Throttle2
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 IGBT_TEMP3
// ADC2 regular channels
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 3, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 4, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 5, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_15Cycles); // 1 SENS2
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 2, ADC_SampleTime_15Cycles); // 4 CURR2
ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 3, ADC_SampleTime_15Cycles); // 7 IGBT_TEMP2
ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 4, ADC_SampleTime_15Cycles); // 10 Throttle1
ADC_RegularChannelConfig(ADC2, ADC_Channel_4, 5, ADC_SampleTime_15Cycles); // 13 IGBT_TEMP1
ADC_RegularChannelConfig(ADC2, ADC_Channel_Vrefint, 6, ADC_SampleTime_15Cycles);// 16 VREFINT
// ADC3 regular channels
ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 2, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 3, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 4, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 5, ADC_SampleTime_15Cycles);
ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 1, ADC_SampleTime_15Cycles); // 2 SENS3
ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 2, ADC_SampleTime_15Cycles); // 5 CURR3
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 3, ADC_SampleTime_15Cycles); // 8 PCB_TEMP
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 4, ADC_SampleTime_15Cycles); // 11 VBUS
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 5, ADC_SampleTime_15Cycles); // 14 UNUSED
ADC_RegularChannelConfig(ADC3, ADC_Channel_Vrefint, 6, ADC_SampleTime_15Cycles);// 17
// Injected channels
ADC_InjectedChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_15Cycles);
@ -570,3 +574,20 @@ float hw_axiom_read_current_sensor_gain() {
inline float hw_axiom_get_current_sensor_gain() {
return current_sensor_gain;
}
float hw_axiom_get_highest_IGBT_temp() {
float t1 = NTC_TEMP_MOS1();
float t2 = NTC_TEMP_MOS2();
float t3 = NTC_TEMP_MOS3();
float res = 0.0;
if (t1 > t2 && t1 > t3) {
res = t1;
} else if (t2 > t1 && t2 > t3) {
res = t2;
} else {
res = t3;
}
return res;
}

View File

@ -25,7 +25,7 @@
#define HW_NAME "AXIOM"
#define HW_AXIOM_USE_DAC
//#define HW_AXIOM_USE_DAC
//#define HW_AXIOM_USE_MOTOR_TEMP
#define HW_USE_LINE_TO_LINE
#define HW_AXIOM_FORCE_HIGH_CURRENT_MEASUREMENTS
@ -57,26 +57,29 @@
/*
* ADC Vector
*
* 0: IN0 SENS1
* 1: IN1 SENS2
* 2: IN2 SENS3
* 3: IN10 CURR1
* 4: IN11 CURR2
* 5: IN12 CURR3
* 6: IN8 ADC_EXT2
* 7: IN0 SENS1
* 8: IN3 TEMP_PCB
* 9: IN14 TEMP_MOTOR
* 10: IN15 ADC_EXT1
* 11: IN13 AN_IN
* 12: Vrefint
* 13: IN0 SENS1
* 14: IN1 SENS2
* 0 (1): IN0 SENS1
* 1 (2): IN1 SENS2
* 2 (3): IN2 SENS3
* 3 (1): IN10 CURR1
* 4 (2): IN11 CURR2
* 5 (3): IN12 CURR3
* 6 (1): IN8 ADC_IND_EXT2
* 7 (2): IN6 TEMP_IGBT_2
* 8 (3): IN3 TEMP_PCB
* 9 (1): IN14 TEMP_MOTOR
* 10 (2): IN15 ADC_IND_EXT
* 11 (3): IN13 AN_IN
* 12 (1): IN9 V_GATE_DRIVER
* 13 (2): IN4 TEMP_IGBT_1
* 14 (3) IN3 UNUSED
* 15 (1): IN5 TEMP_IGBT_3
* 16 (2): VREFINT ADC_IND_VREFINT
* 17 (3): VREFINT UNUSED
*/
#define HW_ADC_CHANNELS 15
#define HW_ADC_CHANNELS 18
#define HW_ADC_INJ_CHANNELS 3
#define HW_ADC_NBR_CONV 5
#define HW_ADC_NBR_CONV 6
// ADC Indexes
#define ADC_IND_SENS1 0
@ -89,21 +92,28 @@
#define ADC_IND_VOUT_GATE_DRV 12
#define ADC_IND_EXT 10
#define ADC_IND_EXT2 6
#define ADC_IND_TEMP_MOS 8
#define ADC_IND_TEMP_PCB 8
#define ADC_IND_TEMP_MOTOR 9
#define ADC_IND_TEMP_IGBT_1 13
#define ADC_IND_TEMP_IGBT_2 7
#define ADC_IND_TEMP_IGBT_3 15
#define ADC_IND_VREFINT 16
// When reading switch temperature, return the center IGBT temp
// because it will be the hotter one.
#define ADC_IND_TEMP_MOS ADC_IND_TEMP_IGBT_2
// ADC macros and settings
#ifdef HW_PALTA_REV_B
#define HVDC_TRANSFER_FUNCTION 112.15 //[V/V]
#define PHASE_TRANSFER_FUNCTION 112.15 //[V/V]
#define PHASE_VOLTAGE_TRANSFER_FUNCTION 112.15 //[V/V]
#else
#define HVDC_TRANSFER_FUNCTION 185.0 //[V/V]
#define PHASE_VOLTAGE_TRANSFER_FUNCTION 185.0 //[V/V]
#endif
#define DEFAULT_CURRENT_AMP_GAIN 0.003761 //Transfer Function [V/A] for ISB-425-A
// Component parameters (can be overridden)
#ifndef V_REG
#define V_REG 3.3
@ -133,10 +143,24 @@
// 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) / 3434.0) + (1.0 / 298.15)) - 273.15)
#define NTC_RES_IGBT(adc_val) ((4095.0 * 5000.0) / adc_val - 5000.0)
#define NTC_TEMP(adc_ind) hw_axiom_get_highest_IGBT_temp()
//#define NTC_TEMP(adc_ind) (1.0 / ((logf(NTC_RES(ADC_Value[adc_ind]) / 10000.0) / 3434.0) + (1.0 / 298.15)) - 273.15)
#define NTC_RES_MOTOR(adc_val) ((4095.0 * 10000.0) / adc_val - 10000.0)
// If DAC enabled, only IGBT_TEMP_3 is available
#ifdef HW_AXIOM_USE_DAC
#define NTC_TEMP_MOS1() (25.0)
#define NTC_TEMP_MOS2() (25.0)
#define NTC_TEMP_MOS3() (1.0 / ((logf(NTC_RES_IGBT(ADC_Value[ADC_IND_TEMP_IGBT_3]) / 5000.0) / 3433.0) + (1.0 / 298.15)) - 273.15)
#else
// Individual IGBT Temperature sensing
#define NTC_TEMP_MOS1() (1.0 / ((logf(NTC_RES_IGBT(ADC_Value[ADC_IND_TEMP_IGBT_1]) / 5000.0) / 3433.0) + (1.0 / 298.15)) - 273.15)
#define NTC_TEMP_MOS2() (1.0 / ((logf(NTC_RES_IGBT(ADC_Value[ADC_IND_TEMP_IGBT_2]) / 5000.0) / 3433.0) + (1.0 / 298.15)) - 273.15)
#define NTC_TEMP_MOS3() (1.0 / ((logf(NTC_RES_IGBT(ADC_Value[ADC_IND_TEMP_IGBT_3]) / 5000.0) / 3433.0) + (1.0 / 298.15)) - 273.15)
#endif
#ifdef HW_AXIOM_USE_MOTOR_TEMP
#define NTC_TEMP_MOTOR(beta) (1.0 / ((logf(NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) / 10000.0) / beta) + (1.0 / 298.15)) - 273.15)
#else
@ -258,7 +282,6 @@
#define HW_GATE_DRIVER_SUPPLY_MAX_VOLTAGE 16.0
#define HW_GATE_DRIVER_SUPPLY_MIN_VOLTAGE 14.0
// Default setting overrides
#ifndef MCCONF_DEFAULT_MOTOR_TYPE
#define MCCONF_DEFAULT_MOTOR_TYPE MOTOR_TYPE_FOC
@ -290,5 +313,6 @@ char hw_axiom_configure_FPGA(void);
void hw_axiom_DAC1_setdata(uint16_t data);
void hw_axiom_DAC2_setdata(uint16_t data);
float hw_axiom_get_current_sensor_gain(void);
float hw_axiom_get_highest_IGBT_temp(void);
#endif /* HW_AXIOM_H_ */