mirror of https://github.com/rusefi/bldc.git
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:
parent
b3b047809a
commit
b698a9da97
|
@ -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];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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_ */
|
||||
|
|
Loading…
Reference in New Issue