소스 검색

update gd32 adc

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 년 전
부모
커밋
f3db3b8433
5개의 변경된 파일57개의 추가작업 그리고 56개의 파일을 삭제
  1. 13 12
      Application/app/sox/measure.c
  2. 21 38
      Application/app/sox/measure_task.c
  3. 1 1
      Application/bsp/bsp.c
  4. 2 2
      Project/SP700.uvoptx
  5. 20 3
      Project/SP700.uvprojx

+ 13 - 12
Application/app/sox/measure.c

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

+ 21 - 38
Application/app/sox/measure_task.c

@@ -17,8 +17,8 @@ struct means_task {
 	u32 delay;
 	u8  index;
 };
-static void init_pack_current_task(void);
-static void init_cell_task(void);
+
+static void init_current_voltage_task(void);
 static void init_temp_task(void);
 
 void measure_task_init(measure_notify cn, measure_notify vn, measure_notify tn){
@@ -26,8 +26,7 @@ void measure_task_init(measure_notify cn, measure_notify vn, measure_notify tn){
 	_voltage_notify = vn;
 	_temperature_notify = tn;
 	measure_adc_init();
-	init_pack_current_task();
-	init_cell_task();
+	init_current_voltage_task();
 	init_temp_task();
 	set_log_level(MOD_MEASURE, L_debug);
 }
@@ -36,51 +35,36 @@ measure_value_t * measure_value(void){
 	return &_measure_value;
 }
 
-/*
- * 测量总电流,放电和充电
-*/
-static struct means_task _pack_current_task;
-static u32 pack_current_task_handler(void);
-static void init_pack_current_task(void){
-	_pack_current_task._task.handler = pack_current_task_handler;
-	_pack_current_task.delay = 30;
-	_pack_current_task.index = 0;
-	_measure_value.load_current = get_pack_current();
-	shark_task_add(&_pack_current_task._task);
-}
-
-static u32 pack_current_task_handler(void){
-	_measure_value.load_current = get_pack_current();
-	_current_notify();//通知bms state 有新的电流数据
-	//measure_debug("load current = %f\n", _measure_value.load_current);
-	return _pack_current_task.delay;
-}
 
 /*
- * 测量电芯电压,计算出总电压
+ * 测量电芯电压,计算出总电压, 测量总电流,放电和充电
 */
-static struct means_task _cell_task;
-static u32 cell_task_handler(void);
-static void init_cell_task(void){
-	_cell_task._task.handler = cell_task_handler;
-	_cell_task.delay = 30;
-	_cell_task.index = 0;
+static struct means_task _current_voltage_task;
+static u32 current_voltage_task_handler(void);
+static void init_current_voltage_task(void){
+	_current_voltage_task._task.handler = current_voltage_task_handler;
+	_current_voltage_task.delay = 30;
+	_current_voltage_task.index = 0;
+	_measure_value.load_current = get_pack_current();
 	for (int i = 0; i < CELLS_NUM; i++){
 		_measure_value.cell_vol[i] = get_cell_voltage(i);
 	}
-	shark_task_add(&_cell_task._task);
+	shark_task_add(&_current_voltage_task._task);
 }
 
-static u32 cell_task_handler(void){
+static u32 current_voltage_task_handler(void){
 	if (bms_state_get()->pack_balancing){ //if balance, do'nt sample cell voltage
-		return _cell_task.delay;
+		return _current_voltage_task.delay;
 	}
+	/* 测量电流 */
+	_measure_value.load_current = get_pack_current();
+	_current_notify();//通知bms state 有新的电流数据
+	
 	//用内阻对cell的电压进行补偿,充电减,放电加
-	_measure_value.cell_vol[_cell_task.index] = get_cell_voltage(_cell_task.index) - bms_health()->internal_resistance[_cell_task.index] * _measure_value.load_current/1000;
-	//measure_debug("cell[%d]=%f\n", _cell_task.index, _measure_value.cell_vol[_cell_task.index]/1000.0f);
-	_cell_task.index = (_cell_task.index + 1) % CELLS_NUM;
+	_measure_value.cell_vol[_current_voltage_task.index] = get_cell_voltage(_current_voltage_task.index) - bms_health()->internal_resistance[_current_voltage_task.index] * _measure_value.load_current/1000;
+	_current_voltage_task.index = (_current_voltage_task.index + 1) % CELLS_NUM;
 	_voltage_notify();//通知bms state 有新的电压数据
-	return _cell_task.delay;
+	return _current_voltage_task.delay;
 }
 
 /*
@@ -99,7 +83,6 @@ static void init_temp_task(void){
 }
 static u32 temp_task_handler(void){
 	_measure_value.pack_temp[_temp_task.index] = get_pack_temperature(_temp_task.index);
-	//measure_debug("pack temp[%d]=%d\n", _temp_task.index, _measure_value.pack_temp[_temp_task.index]);
 	_temp_task.index = (_temp_task.index + 1) % (PACK_TEMPS_NUM);
 	_temperature_notify();//通知bms state 有新的温度数据
 	return _temp_task.delay;

+ 1 - 1
Application/bsp/bsp.c

@@ -17,7 +17,7 @@ const char iap_board_name[] __attribute__((at(0x08002800))) = "SP600";
 const char iap_fw_version[] __attribute__((at(0x08002A00))) = CONFIG_VERSION;
 const char iap_fw_name[] __attribute__((at(0x08002C00))) = "App";
 
-#define CONFIG_DEBUG 1
+#define CONFIG_DEBUG 0
 
 extern void system_clock_config(void);
 extern void SystemCoreClockUpdate(void);

+ 2 - 2
Project/SP700.uvoptx

@@ -135,12 +135,12 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
-          <Name>d</Name>
+          <Name></Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
           <Key>JL2CM3</Key>
-          <Name>-U20080643 -O78 -S2 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0GD32F3x0.FLM -FS08000000 -FL010000 -FP0($$Device:GD32F330C8$Flash\GD32F3x0.FLM)</Name>
+          <Name>-U20080643 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0GD32F3x0.FLM -FS08000000 -FL010000 -FP0($$Device:GD32F330C8$Flash\GD32F3x0.FLM)</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>

+ 20 - 3
Project/SP700.uvprojx

@@ -10,14 +10,14 @@
       <TargetName>GD32F330C8</TargetName>
       <ToolsetNumber>0x4</ToolsetNumber>
       <ToolsetName>ARM-ADS</ToolsetName>
-      <pCCUsed>5060750::V5.06 update 6 (build 750)::ARMCC</pCCUsed>
+      <pCCUsed>5060750::V5.06 update 6 (build 750)::.\ARMCC</pCCUsed>
       <uAC6>0</uAC6>
       <TargetOption>
         <TargetCommonOption>
           <Device>GD32F330C8</Device>
           <Vendor>GigaDevice</Vendor>
           <PackID>GigaDevice.GD32F3x0_DFP.2.0.0</PackID>
-          <PackURL>http://gd32mcu.21ic.com/data/documents/yingyongruanjian/</PackURL>
+          <PackURL>http://gd32mcu.com/data/documents/pack/</PackURL>
           <Cpu>IRAM(0x20000000,0x02000) IROM(0x08000000,0x10000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE</Cpu>
           <FlashUtilSpec></FlashUtilSpec>
           <StartupFile></StartupFile>
@@ -184,6 +184,8 @@
             <hadXRAM>0</hadXRAM>
             <uocXRam>0</uocXRam>
             <RvdsVP>2</RvdsVP>
+            <RvdsMve>0</RvdsMve>
+            <RvdsCdeCp>0</RvdsCdeCp>
             <hadIRAM2>0</hadIRAM2>
             <hadIROM2>0</hadIROM2>
             <StupSel>8</StupSel>
@@ -350,7 +352,7 @@
             <NoWarn>0</NoWarn>
             <uSurpInc>0</uSurpInc>
             <useXO>0</useXO>
-            <uClangAs>0</uClangAs>
+            <ClangAsOpt>4</ClangAsOpt>
             <VariousControls>
               <MiscControls></MiscControls>
               <Define></Define>
@@ -698,4 +700,19 @@
     <files/>
   </RTE>
 
+  <LayerInfo>
+    <Layers>
+      <Layer>
+        <LayName>&lt;Project Info&gt;</LayName>
+        <LayDesc></LayDesc>
+        <LayUrl></LayUrl>
+        <LayKeys></LayKeys>
+        <LayCat></LayCat>
+        <LayLic></LayLic>
+        <LayTarg>0</LayTarg>
+        <LayPrjMark>1</LayPrjMark>
+      </Layer>
+    </Layers>
+  </LayerInfo>
+
 </Project>