|
|
@@ -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;
|
|
|
}
|
|
|
|