Bläddra i källkod

work for ML5238

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 år sedan
förälder
incheckning
c44fb261ab

+ 19 - 15
Application/app/iv_measure.c

@@ -18,7 +18,11 @@ static float imon_gain_now;
 static float vim0_10x = 0.0f;
 static float vim0_50x = 0.0f;
 static float vim0_now;
+#if defined CONFIG_BOARD_SP700
 #define r_resistor 1.0f // 1ºÁÅ·
+#elif defined CONFIG_BOARD_SP600
+#define r_resistor 2.0f
+#endif
 #define r_pcb_resistor 0.0f // pcb resistor
 static const float r_sense = r_resistor + r_pcb_resistor;
 static const float v_ref = 3300.0f; //adc ref = 3.3v
@@ -70,19 +74,19 @@ void current_calibrate(void){
 void measure_system_init(void){
 	adc_init();
 	ml5238_init();
-	cs1180_init();
+	//cs1180_init();
 	current_calibrate();
 }
 
 /* get battery pack's current (mA) */
-float get_imon_current(int calibration){
-	float adc = adc_sample(ADC_CHAN_IMON, calibration);
+float get_imon_current(void){
+	float adc = adc_sample(ADC_CHAN_IMON, TRUE);
 	if (adc >= 0xFFF0 && (!_is_x10_gain())){//overflow, use 10x gain
 		select_gain_10x(1);
-		adc = adc_sample(ADC_CHAN_IMON, calibration);
+		adc = adc_sample(ADC_CHAN_IMON, TRUE);
 	}else if (adc <= 0x1F && (_is_x10_gain())){// is too small, select 50x gain
 		select_gain_10x(0); 
-		adc = adc_sample(ADC_CHAN_IMON, calibration);		
+		adc = adc_sample(ADC_CHAN_IMON, TRUE);		
 	}
 	float cali_adc = ML5238_V_RSENSER(adc, vim0_now, imon_gain_now);
 
@@ -90,25 +94,25 @@ float get_imon_current(int calibration){
 }
 
 /* get cell's voltage (mV) */
-float get_vmon_voltage(int cell, int calibration){
+float get_vmon_voltage(int cell){
 	ml5238_select_cell_to_vmon(cell);
-	delay_us(50);
-	float adc = adc_sample(ADC_CHAN_VMON, calibration);
+	delay_us(100);
+	float adc = adc_sample(ADC_CHAN_VMON, TRUE);
 
-	return (adc / max_adc) * v_ref * 1000;
+	return cell_real_vol((adc / max_adc) * v_ref);
 }
 
 /* get battery pack's aux current (mA) */
-float get_small_current(int calibration){
-	float adc = adc_sample(ADC_CHAN_AUX_CURR, calibration);
+float get_small_current(void){
+	float adc = adc_sample(ADC_CHAN_AUX_CURR, TRUE);
 
 	return (adc / max_adc * v_ref) / small_cur_r_sense * 1000;
 }
 
-int get_pcb_temperature(int calibration){
+int get_pcb_temperature(void){
 	TEMP_OPEN(1);
 	delay_us(100);
-	uint16_t adc = adc_sample(ADC_CHAN_TEMPERATURE_4, calibration);
+	uint16_t adc = adc_sample(ADC_CHAN_TEMPERATURE_4, TRUE);
 	TEMP_OPEN(0);
 	return get_temp_by_adc(adc);
 }
@@ -116,10 +120,10 @@ int get_pcb_temperature(int calibration){
 /*
  * index : 0...2
 */
-int get_pack_temperature(int index, int calibration){
+int get_pack_temperature(int index){
 	TEMP_OPEN(1);
 	delay_us(100);
-	uint16_t adc = adc_sample(ADC_CHAN_TEMPERATURE_1 + index, calibration);
+	uint16_t adc = adc_sample(ADC_CHAN_TEMPERATURE_1 + index, TRUE);
 	TEMP_OPEN(0);
 	return get_temp_by_adc(adc);
 }

+ 5 - 5
Application/app/iv_measure.h

@@ -1,11 +1,11 @@
 #ifndef _IV_Measure_H__
 #define _IV_Measure_H__
 void measure_system_init(void);
-float get_imon_current(int calibration);
-float get_vmon_voltage(int cell, int calibration);
-float get_small_current(int calibration);
-int get_pcb_temperature(int calibration);
-int get_pack_temperature(int index, int calibration);
+float get_imon_current(void);
+float get_vmon_voltage(int cell);
+float get_small_current(void);
+int get_pcb_temperature(void);
+int get_pack_temperature(int index);
 
 #endif /* _IV_Measure_H__ */
 

+ 2 - 0
Application/app/main.c

@@ -1,9 +1,11 @@
 #include "bsp/shark_bsp.h"
+#include "app/iv_measure.h"
 #include "libs/shark_task.h"
 
 int main(void)
 {
 	bsp_init();
+	measure_system_init();
 	shark_task_run();
 	return 0;
 }

+ 20 - 15
Application/bsp/gd32_adc.c

@@ -1,7 +1,10 @@
 #include "gd32_adc.h"
 #include "gpio.h"
+#include "clock.h"
 /* For 12-bits resolution, the total conversion time is 
-sampling time + 12.5 ADCCLK cycles */
+ *sampling time + 12.5 ADCCLK cycles 
+ *all channel is enabled oversample to reach 16bit accurate
+*/
 void adc_init(void){
 	rcu_periph_clock_enable(RCU_GPIOA);
 	rcu_periph_clock_enable(RCU_GPIOB);	
@@ -13,32 +16,34 @@ void adc_init(void){
 
 	rcu_periph_clock_enable(RCU_ADC);
 	adc_deinit();
-
-	adc_resolution_config(ADC_RESOLUTION_12B);
     /* ADC trigger config */
-    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE); 
-	adc_special_function_config(ADC_SCAN_MODE,ENABLE);
+    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
 	/* ADC data alignment config */
 	adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
 	/* ADC channel length config */
 	adc_channel_length_config(ADC_REGULAR_CHANNEL, 1);
 
+	adc_resolution_config(ADC_RESOLUTION_12B);
+ 
+	//adc_special_function_config(ADC_SCAN_MODE,ENABLE);
+
 	adc_discontinuous_mode_config(ADC_REGULAR_CHANNEL, 1);
 
-	//hardware oversample to 16bit
-	adc_oversample_mode_config(ADC_OVERSAMPLING_ONE_CONVERT, ADC_OVERSAMPLING_SHIFT_4B, ADC_OVERSAMPLING_RATIO_MUL256);
+	adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
+
 }
 
 int adc_sample(int chan, int calibration){
 	int value = -0xFFFFFF;
-	if (chan == ADC_CHAN_AUX_CURR || chan == ADC_CHAN_IMON || chan == ADC_CHAN_VMON){
-		adc_oversample_mode_enable();
-	}else {
-		adc_oversample_mode_disable();
-	}
-    /* ADC regular channel config */
-    adc_regular_channel_config(0, chan, ADC_SAMPLETIME_7POINT5);//7.5 + 12.5 = 20 cycle, 20/(28*1000000)
+	int mask = 0xFFFF;
+	//hardware oversample to 16bit
+	adc_oversample_mode_config(ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_4B, ADC_OVERSAMPLING_RATIO_MUL256);
+	adc_oversample_mode_enable();
+
+    /* use max convert time to make sure the adc work fine */
+    adc_regular_channel_config(0, chan, ADC_SAMPLETIME_239POINT5);//239.5 + 12.5 = 242 cycle, 242/(28*1000000)
 	adc_enable();
+	delay_us(1000); //MUST delay, for adc work fine
 	if (calibration) {
 		/* ADC calibration and reset calibration */
     	adc_calibration_enable();
@@ -50,7 +55,7 @@ int adc_sample(int chan, int calibration){
 	adc_flag_clear(ADC_FLAG_EOC);
 	adc_disable();
 
-	return value;
+	return value & mask;
 }
 
 

+ 8 - 8
Application/bsp/ml5238.h

@@ -24,20 +24,20 @@ int ml5238_select_cell_to_vmon(int cell);
 int ml5238_write(uint8_t regaddr, uint8_t data);
 
 /* IMON output 0V, used to cali the GAIN */
-#define ML5238_IMON_OUT_ZERO_10X() {ml5238_write(ML5238_IMON, 0x12);delay_us(50);};
-#define ML5238_IMON_OUT_ZERO_50X() {ml5238_write(ML5238_IMON, 0x13);delay_us(50);};
+#define ML5238_IMON_OUT_ZERO_10X() {ml5238_write(ML5238_IMON, 0x12);delay_us(1000);};
+#define ML5238_IMON_OUT_ZERO_50X() {ml5238_write(ML5238_IMON, 0x13);delay_us(1000);};
 
 /* IMON output 2V, used to cali the GAIN */
-#define ML5238_IMON_OUT_V2000_10X() {ml5238_write(ML5238_IMON, 0x14);delay_us(50);};
-#define ML5238_IMON_OUT_V2000_50X() {ml5238_write(ML5238_IMON, 0x15);delay_us(50);};
+#define ML5238_IMON_OUT_V2000_10X() {ml5238_write(ML5238_IMON, 0x14);delay_us(1000);};
+#define ML5238_IMON_OUT_V2000_50X() {ml5238_write(ML5238_IMON, 0x15);delay_us(1000);};
 
 /* IMON output 100mV, used to cali the GAIN */
-#define ML5238_IMON_OUT_V100_10X() {ml5238_write(ML5238_IMON, 0x1c);delay_us(50);};
-#define ML5238_IMON_OUT_V100_50X() {ml5238_write(ML5238_IMON, 0x1d);delay_us(50);};
+#define ML5238_IMON_OUT_V100_10X() {ml5238_write(ML5238_IMON, 0x1c);delay_us(1000);};
+#define ML5238_IMON_OUT_V100_50X() {ml5238_write(ML5238_IMON, 0x1d);delay_us(1000);};
 
 /* IMON output real pin's voltage */
-#define ML5238_IMON_OUT_10X() {ml5238_write(ML5238_IMON, 0x10);delay_us(50);};
-#define ML5238_IMON_OUT_50X() {ml5238_write(ML5238_IMON, 0x11);delay_us(50);};
+#define ML5238_IMON_OUT_10X() {ml5238_write(ML5238_IMON, 0x10);delay_us(1000);};
+#define ML5238_IMON_OUT_50X() {ml5238_write(ML5238_IMON, 0x11);delay_us(1000);};
 
 //vim0 == xxx_OUT_ZERO_xxx, vim1 == xxx_OUT_V2000_xxx, vr == xxx_OUT_V100_xxx
 #define ML5238_GAIN(vim0, vim1, vr) ((vim1-vim0)/vr)