Просмотр исходного кода

调整ML5238增益
1. 50x模式下充电大于18A,使用10x增益,10x模式下小于16A退到50x
2. 50x模式下放电大于25A,使用10x增益,10x模式下小于20A退到50x

Signed-off-by: huhui <huhui@sharkgulf.com>

huhui 4 лет назад
Родитель
Сommit
fd3c727216
1 измененных файлов с 41 добавлено и 10 удалено
  1. 41 10
      Application/app/sox/measure.c

+ 41 - 10
Application/app/sox/measure.c

@@ -53,13 +53,17 @@ static least_square_t adc_cali[2]; // y = ax + b
 
 #define GD32_ADC_READ_TIMES 128
 
-static int __inline__ _is_x10_gain(void){
+static int __inline__ is_x10_gain(void){
 	return imon_gain_now == imon_gain_10x;
 }
 
+static int __inline__ is_x50_gain(void){
+	return imon_gain_now == imon_gain_50x;
+}
+
 static void __inline__ check_gain(void){
 	int count = 5;
-	while (_is_x10_gain() && !ML5238_IS_10X()){
+	while (is_x10_gain() && !ML5238_IS_10X()){
 		ML5238_IMON_OUT_10X();
 		check_gain_error ++;
 		if (count-- <= 0) {
@@ -67,7 +71,7 @@ static void __inline__ check_gain(void){
 		}
 	}
 	count = 5;
-	while (!_is_x10_gain() && !ML5238_IS_50X()){
+	while (!is_x50_gain() && !ML5238_IS_50X()){
 		ML5238_IMON_OUT_50X();
 		check_gain_error ++;
 		if (count-- <= 0) {
@@ -76,7 +80,7 @@ static void __inline__ check_gain(void){
 	}
 }
 
-static void __inline__ select_gain_10x(int select){	
+static void __inline__ _select_gain_10x(int select){
 	if (select){
 		ML5238_IMON_OUT_10X();
 		imon_gain_now = imon_gain_10x;
@@ -92,6 +96,15 @@ static void __inline__ select_gain_10x(int select){
 	check_gain();
 }
 
+static void __inline select_gain_10x(void) {
+	_select_gain_10x(1);
+}
+
+static void __inline select_gain_50x(void) {
+	_select_gain_10x(0);
+}
+
+
 float get_ml5238_gain(void){
 	return imon_gain_now;
 }
@@ -136,9 +149,9 @@ void current_calibrate(void){
 	current_10x_calibrate();
 	current_50x_calibrate();
 #ifdef gain_default_50x
-	select_gain_10x(0);
+	select_gain_50x();
 #else
-	select_gain_10x(1);
+	select_gain_10x();
 #endif
 }
 
@@ -165,6 +178,24 @@ static float get_pack_current_by_gd(void){
 		check_gain_time = time_now;
 	}
 	float adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+	if (is_x10_gain()) { //is x10 gian
+		if ((adc < vim0_now) && (vim0_now - adc) <= 200) { //charging below about 16A, changed to 50x gain
+			select_gain_50x();
+			adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+		}else if ((adc > vim0_now) && (adc - vim0_now) <= 250) { //discharging below about 20A, changed to 50x gain
+			select_gain_50x();
+			adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+		}
+	}else { //is x50 gain
+		if (vim0_now - adc >= 1120){//charging >= 18A, full is 1241(20A)
+			select_gain_10x();
+			adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+		}else if (adc - vim0_now >= 1550) { //discharing >= 25A, full is 1861(30A)
+			select_gain_10x();
+			adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+		}
+	}
+#if 0
 	if (adc >= (max_gd_adc - 255.0f) && (!_is_x10_gain())){//overflow, use 10x gain
 		select_gain_10x(1);
 		adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
@@ -172,7 +203,7 @@ static float get_pack_current_by_gd(void){
 		select_gain_10x(0); 
 		adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);		
 	}
-
+#endif
 	float cali_adc = ML5238_V_RSENSER(adc, vim0_now, imon_gain_now);
 
 	return (int)((cali_adc / max_gd_adc) * v_gd_ref / r_sense * 1000);
@@ -251,9 +282,9 @@ int measure_start_cali(uint8_t adc, uint8_t gain, uint8_t samples){
 	sys_debug("start cali %d, %d, %d\n", adc, gain, samples);
 	if (adc == GD32_ADC) {
 		if (gain == 10) {
-			select_gain_10x(1);
+			select_gain_10x();
 		}else if (gain == 50) {
-			select_gain_10x(0);
+			select_gain_50x();
 		}else {
 			return 0;
 		}
@@ -290,7 +321,7 @@ int measure_stop_cali(uint8_t adc, uint8_t gain){
 		}
 		sys_debug("stop %f, %f\n", adc_cali[adc].coeff.Ka, adc_cali[adc].coeff.Cb);
 	}
-	select_gain_10x(0);
+	select_gain_50x();
 	return adc_cali[adc].finished;
 }