|
|
@@ -30,17 +30,13 @@ static float imon_gain_now;
|
|
|
static float vim0_10x = 0.0f;
|
|
|
static float vim0_50x = 0.0f;
|
|
|
static float vim0_now;
|
|
|
-static float ml5238_10x_a = 1.0f;
|
|
|
-static float ml5238_50x_a = 1.0f;
|
|
|
|
|
|
-static float ml5238_10x_b = 0.0f;
|
|
|
-static float ml5238_50x_b = 0.0f;
|
|
|
+static linear_ceoff_t ml5238_10x_ceoff = {.Ka = 1.0f, .Cb = 0.0f};
|
|
|
+static linear_ceoff_t ml5238_50x_ceoff = {.Ka = 1.0f, .Cb = 0.0f};
|
|
|
+static linear_ceoff_t ml5238_now_ceoff;
|
|
|
|
|
|
-static float ml5238_now_a = 1.0f;
|
|
|
-static float ml5238_now_b = 0.0f;
|
|
|
+static linear_ceoff_t cs1180_ceoff = {.Ka = 1.0f, .Cb = 0.0f};
|
|
|
|
|
|
-static float cs1180_a = 1.0f;
|
|
|
-static float cs1180_b = 0.0f;
|
|
|
|
|
|
#define gain_default_50x 1
|
|
|
#define CS1180_MAX_CURRENT 4500 //MA, cs1180的最大电流,超过这个使用ML5238
|
|
|
@@ -60,14 +56,13 @@ static void __inline__ select_gain_10x(int select){
|
|
|
ML5238_IMON_OUT_10X();
|
|
|
imon_gain_now = imon_gain_10x;
|
|
|
vim0_now = vim0_10x;
|
|
|
- ml5238_now_a = ml5238_10x_a;
|
|
|
- ml5238_now_b = ml5238_10x_b;
|
|
|
+ ml5238_now_ceoff = ml5238_10x_ceoff;
|
|
|
+
|
|
|
}else {
|
|
|
ML5238_IMON_OUT_50X();
|
|
|
imon_gain_now = imon_gain_50x;
|
|
|
vim0_now = vim0_50x;
|
|
|
- ml5238_now_a = ml5238_50x_a;
|
|
|
- ml5238_now_b = ml5238_50x_b;
|
|
|
+ ml5238_now_ceoff = ml5238_50x_ceoff;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -163,9 +158,13 @@ static float get_pack_current_by_cs1180(int *valid){
|
|
|
return (vol / r_sense) * 1000 - 5.0f;//板子固定5MA,cs1180无法测量到
|
|
|
}
|
|
|
|
|
|
+static __inline__ float get_caliberated_current(linear_ceoff_t *cof, float x) {
|
|
|
+ return (x * cof->Ka) + cof->Cb;
|
|
|
+}
|
|
|
+
|
|
|
float get_pack_current(int *current_5238){
|
|
|
float current = get_pack_current_by_gd();
|
|
|
- current = ml5238_now_a * current + ml5238_now_b;
|
|
|
+ current = get_caliberated_current(&ml5238_now_ceoff, current);
|
|
|
if (current_5238 != NULL){
|
|
|
*current_5238 = (int)current;
|
|
|
}
|
|
|
@@ -173,7 +172,7 @@ float get_pack_current(int *current_5238){
|
|
|
int valid = 1;
|
|
|
float cs1180_current = get_pack_current_by_cs1180(&valid);
|
|
|
if (valid == 1) {
|
|
|
- current = cs1180_current * cs1180_a + cs1180_b;
|
|
|
+ current = get_caliberated_current(&cs1180_ceoff, cs1180_current);
|
|
|
}
|
|
|
}
|
|
|
return current;
|
|
|
@@ -258,17 +257,14 @@ int measure_stop_cali(uint8_t adc, uint8_t gain){
|
|
|
if (adc_cali[adc].finished ) {
|
|
|
if (adc == GD32_ADC) {
|
|
|
if (gain == 10) {
|
|
|
- ml5238_10x_a = adc_cali[adc].Cb;
|
|
|
- ml5238_10x_b = adc_cali[adc].Ka;
|
|
|
+ ml5238_10x_ceoff = adc_cali[adc].coeff;
|
|
|
}else if (gain == 50) {
|
|
|
- ml5238_50x_a = adc_cali[adc].Cb;
|
|
|
- ml5238_50x_b = adc_cali[adc].Ka;
|
|
|
+ ml5238_50x_ceoff = adc_cali[adc].coeff;
|
|
|
}
|
|
|
}else {
|
|
|
- cs1180_a = adc_cali[adc].Cb;
|
|
|
- cs1180_b = adc_cali[adc].Ka;
|
|
|
+ cs1180_ceoff = adc_cali[adc].coeff;
|
|
|
}
|
|
|
- sys_debug("stop %f, %f\n", adc_cali[adc].Cb, adc_cali[adc].Ka);
|
|
|
+ sys_debug("stop %f, %f\n", adc_cali[adc].coeff.Ka, adc_cali[adc].coeff.Cb);
|
|
|
}
|
|
|
select_gain_10x(0);
|
|
|
return adc_cali[adc].finished;
|