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

修改ML5238的gain的动态调整

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 4 лет назад
Родитель
Сommit
e1396c0248
3 измененных файлов с 64 добавлено и 23 удалено
  1. 62 18
      Application/app/sox/measure.c
  2. 2 3
      Application/app/sox/measure_task.c
  3. 0 2
      Application/app/sox/state.c

+ 62 - 18
Application/app/sox/measure.c

@@ -49,17 +49,23 @@ static const float max_cs1180_adc = 0x7FFFF;//
 static const float small_cur_r_sense = 0.360f;//ŷķ
 uint32_t check_gain_error = 0;
 static u64      check_gain_time = 0;
+u32   dgain_switch_count = 0;
+u32   cgain_switch_count = 0;
 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 +73,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 +82,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 +98,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 +151,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
 }
 
@@ -159,20 +174,49 @@ static float get_current_by_ml5238(void){
 
 /* get battery pack's current (mA) */
 static float get_pack_current_by_gd(void){
+	static u64 debounce_change_10xgain = 0;
+	static u64 debounce_change_50xgain = 0;
 	u64 time_now = shark_get_mseconds();
-	if (time_now - check_gain_time >= 100) {
+	if (time_now - check_gain_time >= 1000) {
 		check_gain();
 		check_gain_time = time_now;
 	}
 	float adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
-	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);
-	}else if (abs(adc - vim0_now) <= 255.0f && (_is_x10_gain())){// is too small, select 50x gain
-		select_gain_10x(0); 
-		adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);		
+	if (is_x10_gain()) { //is x10 gian
+		debounce_change_50xgain = shark_get_mseconds();
+		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);
+			cgain_switch_count ++;
+		}else if (adc > vim0_now) { //discharging below about 20A, changed to 50x gain(after 5s, avoid change gain freqencely)
+			if ((adc - vim0_now) <= 250) {
+				if ((shark_get_mseconds() - debounce_change_10xgain) >= 5*1000) {
+					select_gain_50x();
+					adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+					debounce_change_10xgain = shark_get_mseconds();
+					dgain_switch_count ++;
+				}
+			}else {
+				debounce_change_10xgain = shark_get_mseconds();
+			}
+		}
+	}else { //is x50 gain
+		debounce_change_10xgain = shark_get_mseconds();
+		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);
+			cgain_switch_count ++;
+		}else if (adc - vim0_now >= 2170) { //discharing >= 35A, full is 2850(46A)
+			if ((shark_get_mseconds() - debounce_change_50xgain) >= 500) { //after 500ms
+				select_gain_10x();
+				adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
+				debounce_change_50xgain = shark_get_mseconds();
+				dgain_switch_count ++;
+			}
+		}else {
+			debounce_change_50xgain = shark_get_mseconds();
+		}
 	}
-
 	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);
@@ -208,7 +252,7 @@ float get_pack_current(int *current_5238){
 /* get cell's voltage (mV) */
 float get_cell_voltage(int cell){
 	ML5238_SELECT_CELL(cell);
-	delay_us(700);
+	delay_us(100);
 	float adc = adc_sample_avg(ADC_CHAN_VMON, GD32_ADC_READ_TIMES);
 
 	return cell_real_vol((adc / max_gd_adc) * v_gd_ref);
@@ -251,9 +295,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 +334,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;
 }
 

+ 2 - 3
Application/app/sox/measure_task.c

@@ -37,12 +37,11 @@ measure_value_t * measure_value(void){
 }
 extern uint32_t check_gain_error;
 extern int gd32_adc_error;
+extern u32 dgain_switch_count, cgain_switch_count;
 void measure_log(void){
 	measure_debug("Current %.4f -- %.4f\n", (float)_measure_value.load_current/1000.0f, (float)_measure_value.current_5238/1000.0f);
-	for (int i = 0; i < CELLS_NUM; i++){
-		//measure_debug("Cell[%d]: %.3fv\n", i, _measure_value.cell_vol[i]/1000.0f);
-	}
 	measure_debug("Gain:%f, Off %f, check error = %d, %d\n", get_ml5238_gain(), get_ml5238_vos(), check_gain_error, gd32_adc_error);
+	measure_debug("Gain switch: %d, %d\n", dgain_switch_count, cgain_switch_count);
 }
 /*
  * 测量电芯电压,计算出总电压, 测量总电流,放电和充电

+ 0 - 2
Application/app/sox/state.c

@@ -133,7 +133,6 @@ void bms_state_log(void){
 	state_debug("Life Time: %d\n", shark_get_seconds());
 	state_debug("Sleep Time: %ds\n", get_system_sleep_time());
 	state_debug("ml5238 cali: %d\n", ml5238_cali_count);
-	state_debug("ps charger mask:in %d, %d\n", _bms_state.ps_charger_mask, _bms_state.ps_charger_in);
 	state_debug("open dfet %d - %d - 0x%x - %d\n", open_dfet, open_dfet_failt, close_dfet_reson, close_dfet_no_hall);
 	state_debug("Reset Reson 0x%x\n", bsp_get_rst_reson());
 	state_debug("BackUp value 0x%x\n", bsp_get_backup());
@@ -171,7 +170,6 @@ static void _debug_timer_handler(shark_timer_t *t){
 #else
 	bms_state_log();
 	measure_log();
-	shark_uart_log();
 #endif
 	shark_timer_post(&_debug_timer, 2000);
 }