Przeglądaj źródła

5280量程切换,1180测量0-16A

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 lat temu
rodzic
commit
0181cb08b8

+ 8 - 4
Application/app/sox/measure.c

@@ -71,7 +71,7 @@ static void current_10x_calibrate(void){
 	float vim1 = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
 	ML5238_IMON_OUT_V100_10X();
 	float vr = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
-	imon_gain_10x = ML5238_GAIN(vim0_10x, vim1, vr);
+	imon_gain_10x = 10.0f;//ML5238_GAIN(vim0_10x, vim1, vr);
 }
 
 static void current_50x_calibrate(void){
@@ -110,13 +110,14 @@ void measure_adc_init(void){
 /* get battery pack's current (mA) */
 static float get_pack_current_by_gd(void){
 	float adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
-	if (adc >= (max_gd_adc - 0xF) && (!_is_x10_gain())){//overflow, use 10x gain
+	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 (adc <= 0x1F && (_is_x10_gain())){// is too small, select 50x gain
+	}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);		
 	}
+
 	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);
@@ -128,8 +129,11 @@ static float get_pack_current_by_cs1180(int *valid){
 	return (vol / r_sense) * 1000 - 5.0f;//°å×ӹ̶¨5MA£¬cs1180ÎÞ·¨²âÁ¿µ½
 }
 
-float get_pack_current(void){
+float get_pack_current(int *current_5238){
 	float current = get_pack_current_by_gd();
+	if (current_5238 != NULL){
+		*current_5238 = (int)current;
+	}
 	if (cs1180_change_gain(current) == 0) {
 		int valid = 1;
 		float cs1180_current = get_pack_current_by_cs1180(&valid);

+ 1 - 1
Application/app/sox/measure.h

@@ -1,7 +1,7 @@
 #ifndef _IV_Measure_H__
 #define _IV_Measure_H__
 void measure_adc_init(void);
-float get_pack_current(void);
+float get_pack_current(int *current_5238);
 float get_cell_voltage(int cell);
 float get_small_current(void);
 float get_small_current_voltage(void);

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

@@ -36,7 +36,7 @@ measure_value_t * measure_value(void){
 }
 
 void measure_log(void){
-	measure_debug("Current %.4f\n", (float)_measure_value.load_current/1000.0f);
+	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);
 	}
@@ -51,7 +51,7 @@ static void init_current_voltage_task(void){
 	_current_voltage_task._task.handler = current_voltage_task_handler;
 	_current_voltage_task.delay = 15;
 	_current_voltage_task.index = 0;
-	_measure_value.load_current = get_pack_current();
+	_measure_value.load_current = get_pack_current(&_measure_value.current_5238);
 	for (int i = 0; i < CELLS_NUM; i++){
 		_measure_value.cell_vol[i] = get_cell_voltage(i);
 	}
@@ -60,7 +60,7 @@ static void init_current_voltage_task(void){
 
 static u32 current_voltage_task_handler(void){
 	/* 测量电流 */
-	_measure_value.load_current = get_pack_current();
+	_measure_value.load_current = get_pack_current(&_measure_value.current_5238);
 	_current_notify();//通知bms state 有新的电流数据
 
 	if (bms_state_get()->pack_balancing){ //if balance, do'nt sample cell voltage

+ 1 - 0
Application/app/sox/measure_task.h

@@ -5,6 +5,7 @@
 typedef struct{
 	int small_current;
 	int load_current;//may be discharger or charger current
+	int current_5238;
 	int      pack_temp[PACK_TEMPS_NUM];
 	uint16_t cell_vol[CELLS_NUM]; //mV
 }measure_value_t;

+ 2 - 2
Application/bsp/cs1180.c

@@ -250,9 +250,9 @@ int cs1180_adc_set_gain_online(int gain){
 
 
 int cs1180_change_gain(int current){
-	if (abs(current) < 3000){ //4.5
+	if (abs(current) < 4000){ //4.5
 		return cs1180_adc_set_gain_online(CS1180_GAIN_128X);
-	}else if (abs(current) < 12 * 1000){ //18
+	}else if (abs(current) < 16 * 1000){ //18
 		return cs1180_adc_set_gain_online(CS1180_GAIN_32X);
 	}/*else if (abs(current) < 48 * 1000){ //72
 		return cs1180_adc_set_gain_online(CS1180_GAIN_8X);