|
|
@@ -38,6 +38,8 @@ static const float v_cs1180_ref = 1235.0f;//cs1180 vref = 1.235v
|
|
|
static const float max_cs1180_adc = 0x7FFFF;//
|
|
|
static const float small_cur_r_sense = 360.0f;//ŷķ
|
|
|
|
|
|
+#define GD32_ADC_READ_TIMES 4
|
|
|
+
|
|
|
static void __inline__ select_gain_10x(int select){
|
|
|
if (select){
|
|
|
ML5238_IMON_OUT_10X();
|
|
|
@@ -57,22 +59,22 @@ static int __inline__ _is_x10_gain(void){
|
|
|
static void current_10x_calibrate(void){
|
|
|
/* calibrate the 10x gain */
|
|
|
ML5238_IMON_OUT_ZERO_10X();
|
|
|
- vim0_10x = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ vim0_10x = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
ML5238_IMON_OUT_V2000_10X();
|
|
|
- float vim1 = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ 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, 10);
|
|
|
+ float vr = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
imon_gain_10x = ML5238_GAIN(vim0_10x, vim1, vr);
|
|
|
}
|
|
|
|
|
|
static void current_50x_calibrate(void){
|
|
|
/* calibrate the 50x gain */
|
|
|
ML5238_IMON_OUT_ZERO_50X();
|
|
|
- vim0_50x = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ vim0_50x = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
ML5238_IMON_OUT_V2000_50X();
|
|
|
- float vim1 = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ float vim1 = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
ML5238_IMON_OUT_V100_50X();
|
|
|
- float vr = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ float vr = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
imon_gain_50x = ML5238_GAIN(vim0_50x, vim1, vr);
|
|
|
}
|
|
|
|
|
|
@@ -100,15 +102,15 @@ 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, 10);
|
|
|
+ float adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
if (adc >= 0xFFF0 && (!_is_x10_gain())){//overflow, use 10x gain
|
|
|
current_10x_calibrate();
|
|
|
select_gain_10x(1);
|
|
|
- adc = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
}else if (adc <= 0x1F && (_is_x10_gain())){// is too small, select 50x gain
|
|
|
current_50x_calibrate();
|
|
|
select_gain_10x(0);
|
|
|
- adc = adc_sample_avg(ADC_CHAN_IMON, 10);
|
|
|
+ adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);
|
|
|
}
|
|
|
float cali_adc = ML5238_V_RSENSER(adc, vim0_now, imon_gain_now);
|
|
|
|
|
|
@@ -130,7 +132,6 @@ float get_pack_current(void){
|
|
|
if (abs(current) >= CS1180_MAX_CURRENT){
|
|
|
return get_pack_current_by_gd();
|
|
|
}
|
|
|
- sys_debug("%f, %f\n", current, get_pack_current_by_gd());
|
|
|
return current;
|
|
|
}
|
|
|
|
|
|
@@ -139,14 +140,14 @@ float get_pack_current(void){
|
|
|
float get_cell_voltage(int cell){
|
|
|
ML5238_SELECT_CELL(cell);
|
|
|
delay_us(100);
|
|
|
- float adc = adc_sample_avg(ADC_CHAN_VMON, 10);
|
|
|
+ float adc = adc_sample_avg(ADC_CHAN_VMON, GD32_ADC_READ_TIMES);
|
|
|
|
|
|
return cell_real_vol((adc / max_gd_adc) * v_gd_ref);
|
|
|
}
|
|
|
|
|
|
/* get battery pack's aux current (MA) */
|
|
|
float get_small_current(void){
|
|
|
- float adc = adc_sample_avg(ADC_CHAN_AUX_CURR, 10);
|
|
|
+ float adc = adc_sample_avg(ADC_CHAN_AUX_CURR, GD32_ADC_READ_TIMES);
|
|
|
|
|
|
return ((adc / max_gd_adc * v_gd_ref)) / small_cur_r_sense;
|
|
|
}
|