oversample voltage measurement to remove 25Mhz clock noise

The 25MHz clock couples through the floating phase filter capacitor opendrain output on 1 phase. Which appears as a voltage offset and screws up flux linkage measurements at lower voltages. By oversampling, this offset is removed and flux linkage measurements now work properly at all voltages.
This commit is contained in:
Euan 2024-02-23 23:09:54 +00:00
parent b3b047809a
commit b698a9da97
2 changed files with 59 additions and 16 deletions

View File

@ -145,8 +145,12 @@ void hw_setup_adc_channels(void) {
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 5, ADC_SampleTime_15Cycles); // 12 - ADC_IND_CURR2
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 6, ADC_SampleTime_15Cycles); // 15 - ADC_IND_CURR2
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 7, ADC_SampleTime_15Cycles); // 18 - ADC_IND_CURR2
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 8, ADC_SampleTime_15Cycles); // 21 - ADC_IND_EXT
ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 9, ADC_SampleTime_56Cycles); // 24 - ADC_IND_VREFINT
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 8, ADC_SampleTime_15Cycles); // 21 - ADC_IND_SENS3
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 9, ADC_SampleTime_15Cycles); // 24 - ADC_IND_EXT
ADC_RegularChannelConfig(ADC1, ADC_Channel_Vrefint, 10, ADC_SampleTime_56Cycles); // 27 - ADC_IND_VREFINT
// ADC2 regular channels
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 1, ADC_SampleTime_15Cycles); // 1 - ADC_IND_CURR1
@ -156,8 +160,12 @@ void hw_setup_adc_channels(void) {
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 5, ADC_SampleTime_15Cycles); // 13 - ADC_IND_CURR1
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 6, ADC_SampleTime_15Cycles); // 16 - ADC_IND_CURR1
ADC_RegularChannelConfig(ADC2, ADC_Channel_11, 7, ADC_SampleTime_15Cycles); // 19 - ADC_IND_CURR1
ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 8, ADC_SampleTime_15Cycles); // 22 - ADC_IND_EXT2
ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 9, ADC_SampleTime_56Cycles); // 25 - ADC_IND_TEMP_MOTOR
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 8, ADC_SampleTime_15Cycles); // 22 - ADC_IND_SENS2
ADC_RegularChannelConfig(ADC2, ADC_Channel_6, 9, ADC_SampleTime_15Cycles); // 25 - ADC_IND_EXT2
ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 10, ADC_SampleTime_56Cycles); // 28 - ADC_IND_TEMP_MOTOR
// ADC3 regular channels
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 1, ADC_SampleTime_15Cycles); // 2 - ADC_IND_VIN_SENS
@ -167,8 +175,11 @@ void hw_setup_adc_channels(void) {
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 5, ADC_SampleTime_15Cycles); // 14 - UNUSED
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 6, ADC_SampleTime_15Cycles); // 17 - UNUSED
ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 7, ADC_SampleTime_15Cycles); // 20 - UNUSED
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 8, ADC_SampleTime_15Cycles); // 23 - ADC_IND_TEMP_MOS
ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 9, ADC_SampleTime_56Cycles); // 26 - UNUSED
ADC_RegularChannelConfig(ADC3, ADC_Channel_2, 8, ADC_SampleTime_15Cycles); // 23 - ADC_IND_SENS1
ADC_RegularChannelConfig(ADC3, ADC_Channel_3, 9, ADC_SampleTime_15Cycles); // 26 - ADC_IND_TEMP_MOS
ADC_RegularChannelConfig(ADC3, ADC_Channel_15, 10, ADC_SampleTime_56Cycles); // 29 - UNUSED
// Injected channels
ADC_InjectedChannelConfig(ADC1, ADC_Channel_11, 1, ADC_SampleTime_15Cycles); // ADC_IND_CURR2
@ -361,3 +372,28 @@ static void terminal_cmd_read_current_cal(int argc, const char **argv) {
return;
}
float hw_a50s_get_adc_v_l1() {
if (mc_interface_get_configuration()->motor_type == MOTOR_TYPE_FOC) {
return ((ADC_Value[ADC_IND_SENS1] + ADC_Value[ADC_IND_SENS1_2]) / 2.0);
} else {
return ADC_Value[ADC_IND_SENS1];
}
}
float hw_a50s_get_adc_v_l2() {
if (mc_interface_get_configuration()->motor_type == MOTOR_TYPE_FOC) {
return ((ADC_Value[ADC_IND_SENS2] + ADC_Value[ADC_IND_SENS2_2]) / 2.0);
} else {
return ADC_Value[ADC_IND_SENS2];
}
}
float hw_a50s_get_adc_v_l3() {
if (mc_interface_get_configuration()->motor_type == MOTOR_TYPE_FOC) {
return ((ADC_Value[ADC_IND_SENS3] + ADC_Value[ADC_IND_SENS3_2]) / 2.0);
} else {
return ADC_Value[ADC_IND_SENS3];
}
}

View File

@ -28,14 +28,17 @@
// Macros
// ADC Vectors, see .c
#define HW_ADC_CHANNELS 27
#define HW_ADC_CHANNELS 30
#define HW_ADC_INJ_CHANNELS 2
#define HW_ADC_NBR_CONV 9
#define HW_ADC_NBR_CONV 10
// ADC Indexes
#define ADC_IND_SENS1 3
#define ADC_IND_SENS2 4
#define ADC_IND_SENS3 5
#define ADC_IND_SENS1_2 21
#define ADC_IND_SENS2_2 22
#define ADC_IND_SENS3_2 23
#define ADC_IND_CURR1 1
#define ADC_IND_CURR2 0
@ -54,11 +57,11 @@
#define ADC_IND_CURR2_6 18
#define ADC_IND_VIN_SENS 2
#define ADC_IND_EXT 21
#define ADC_IND_EXT2 22
#define ADC_IND_TEMP_MOS 23
#define ADC_IND_TEMP_MOTOR 25
#define ADC_IND_VREFINT 24
#define ADC_IND_EXT 24
#define ADC_IND_EXT2 25
#define ADC_IND_TEMP_MOS 26
#define ADC_IND_TEMP_MOTOR 28
#define ADC_IND_VREFINT 27
// ADC macros and settings
@ -196,9 +199,9 @@
#define PIN_HW_2 2
// Measurement macros
#define ADC_V_L1 ADC_Value[ADC_IND_SENS1]
#define ADC_V_L2 ADC_Value[ADC_IND_SENS2]
#define ADC_V_L3 ADC_Value[ADC_IND_SENS3]
#define ADC_V_L1 hw_a50s_get_adc_v_l1()
#define ADC_V_L2 hw_a50s_get_adc_v_l2()
#define ADC_V_L3 hw_a50s_get_adc_v_l3()
#define ADC_V_ZERO (ADC_Value[ADC_IND_VIN_SENS] / 2)
// Macros
@ -292,4 +295,8 @@
float hw_a50s_get_current_cal_1(void);
float hw_a50s_get_current_cal_2(void);
float hw_a50s_get_adc_v_l1(void);
float hw_a50s_get_adc_v_l2(void);
float hw_a50s_get_adc_v_l3(void);
#endif /* HW_A50S_V23C_CORE_H_ */