Browse Source

update

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 năm trước cách đây
mục cha
commit
f7a9ee6b12

+ 0 - 15
Application/app/controller.c

@@ -2,19 +2,4 @@
 #include "app/sox/state.h"
 #include "controller.h"
 
-void discharger_open(int open){
-	/* 打开大电前,先打开短路保护*/
-	if (open) {
-		ml5238_short_current_detect(SHORT_CURRENT_MODE_66_6A);
-	}else {
-		ml5238_short_current_detect(SHORT_CURRENT_MODE_DISABLE);
-	}
-	ml5238_enable_discharger_mosfet(open);
-	bms_state_get()->mosfet_discharger = open;
-}
 
-
-void charger_open(int open) {
-	ml5238_enable_charger_mosfet(open);
-	bms_state_get()->mosfet_charger = open;
-}

+ 1 - 0
Application/app/sox/health.c

@@ -36,6 +36,7 @@ void health_init(void){
 	ml5238_register_notify_handler(check_ml5238_state);
 	init_detect_timer();
 	set_log_level(MOD_HEALTH, L_debug);
+	_health.internal_resistance = 20; //毫欧,暂时用一个固定数据,后期需要计算R0=(U2-U1)/(I1-I2) - R1(R1为电路上的等效电阻+采样电阻)
 }
 
 bms_health_t *bms_health(){

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

@@ -17,6 +17,7 @@ typedef struct {
 	uint32_t sigle_cell_lower_voltage:1;
 	uint32_t sigle_cell_over_voltage:1;
 	uint32_t load_current_short:1; //´óµç¶Ì·±£»¤
+	uint16_t internal_resistance;   //pack's internal resistance
 }bms_health_t;
 
 

+ 5 - 1
Application/app/sox/measure_task.c

@@ -2,6 +2,7 @@
 #include "app/sox/measure.h"
 #include "libs/shark_task.h"
 #include "measure_task.h"
+#include "state.h"
 
 static measure_value_t _measure_value;
 static measure_notify _current_notify;
@@ -39,7 +40,7 @@ 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 = 100;
+	_pack_current_task.delay = 30;
 	_pack_current_task.index = 0;
 	_measure_value.load_current = get_pack_current();
 	shark_task_add(&_pack_current_task._task);
@@ -67,6 +68,9 @@ static void init_cell_task(void){
 }
 
 static u32 cell_task_handler(void){
+	if (bms_state_get()->pack_balancing){ //if balance, do'nt sample cell voltage
+		return _cell_task.delay;
+	}
 	_measure_value.cell_vol[_cell_task.index] = get_cell_voltage(_cell_task.index);
 	_cell_task.index = (_cell_task.index + 1) % CELLS_NUM;
 	_voltage_notify();//֪ͨbms state ÓÐеĵçѹÊý¾Ý

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

@@ -1,5 +1,6 @@
 #ifndef _Measure_Task_H__
 #define _Measure_Task_H__
+#include "bsp/shark_bsp.h"
 
 typedef struct{
 	float small_current;

+ 48 - 0
Application/app/sox/soc.c

@@ -0,0 +1,48 @@
+#include "soc.h"
+#include "app/sox/measure.h"
+#include "app/sox/measure_task.h"
+#include "health.h"
+#include "state.h"
+
+static soc_t _soc;
+static uint8_t charing = 0;
+static u64     time_ms = 0;
+static float _charger_coefficient = 1.0f;
+static float _discharger_coefficient = 1.0f;
+void soc_init(void){
+	time_ms = shark_get_mseconds();
+	_soc.coulomb_min = 0;
+	_soc.coulomb_max = 30.0f * 3600.0f; //30HA,这个值最总需要health模块给
+}
+
+static __inline__ float _delta_time(void){
+	u32 delta = shark_get_mseconds() - time_ms;
+	time_ms = shark_get_mseconds();
+	return  (float)delta / (1000.0f); //秒
+}
+
+void soc_update(void){
+	if (!charing && bms_state_get()->charging){
+		_soc.charger_coulomb = 0;//clear charing
+		charing = 1;
+	}else if (charing && !bms_state_get()->charging){
+		charing = 0;
+		_soc.dischrger_coulomb = 0; //clear discharger
+	}
+	float current = measure_value()->load_current / 1000.0f; //A
+	float delta_q = current * _delta_time();
+	if (charing){
+		delta_q = delta_q * _charger_coefficient;
+		_soc.charger_coulomb += abs(delta_q);
+	}else {
+		delta_q = delta_q * _discharger_coefficient;
+		_soc.dischrger_coulomb += abs(delta_q); //转为正数
+	}
+	_soc.coulomb_now += delta_q; //充电加, 放电减
+	_soc.capacity = (_soc.coulomb_now - _soc.coulomb_min)/(_soc.coulomb_max - _soc.coulomb_min) * 100;
+}
+
+soc_t *get_soc(void){
+	return &_soc;
+}
+

+ 17 - 0
Application/app/sox/soc.h

@@ -0,0 +1,17 @@
+#pragma once
+#include "libs/shark_libs.h"
+
+typedef struct {
+	float coulomb_now; /*AH, 若导线中载有1安培的稳定电流,则在1秒内通过导线横截面积的电量为1库仑 */
+	uint8_t capacity;  /* 电池的容量百分比 */
+	float coulomb_min;
+	float coulomb_max;
+	float power; //功率,当前的电压 x 当前的电流(w)
+	float energy; //当前的能量(wh)
+	float charger_coulomb; //本次充电的AH
+	float dischrger_coulomb; //本次放电的AH
+}soc_t;
+
+void soc_init(void);
+void soc_update(void);
+soc_t *get_soc(void);

+ 48 - 10
Application/app/sox/state.c

@@ -5,6 +5,7 @@
 #include "app/sox/measure_task.h"
 #include "libs/shark_task.h"
 #include "health.h"
+#include "soc.h"
 #include "state.h"
 #include "iostate.h"
 
@@ -14,10 +15,13 @@
 
 static bms_state_t _bms_state;
 static shark_task_t _bms_main_task;
+static shark_timer_t _balance_timer;
+
 static void _current_notify(void);
 static void _voltage_notify(void);
 static void _temperature_notify(void);
 static u32 _bms_main_task_handler(void);
+static void _balance_timer_handler(shark_timer_t *t);
 
 void bms_state_init(void){
 	_bms_state.cell_index_of_max_vol = 0xff;
@@ -25,12 +29,36 @@ void bms_state_init(void){
 	measure_task_init(_current_notify, _voltage_notify, _temperature_notify);
 	io_state_init();
 	health_init();
+	soc_init();
 	shark_task_add(&_bms_main_task);
 }
 
 bms_state_t *bms_state_get(void){
 	return &_bms_state;
 }
+/*
+ 放电mos和充电mos的开关要小心:
+ 1. 大部分的情况下,尽量能做到同时开关,主要是用来保护被关闭那路mos的体二极管(不能过大电流)
+ 2. 充电过压的情况下,必须要关闭充电mos,但是这个时候放电mos可能是打开的,这样的情况下,
+    需要检测放电电流,超过4A必须强制打开充电mos,防止烧充电mos的体二极管
+ 3. 收到打开大电的指令后,必须两个mos都要打开,然后再经过2的判断
+    。。。。。
+*/
+static void discharger_open(int open){
+	/* 打开大电前,先打开短路保护*/
+	if (open) {
+		ml5238_short_current_detect(SHORT_CURRENT_MODE_100A_200A);//SP600:100A, SP700:200A
+	}else {
+		ml5238_short_current_detect(SHORT_CURRENT_MODE_DISABLE);
+	}
+	ml5238_enable_discharger_mosfet(open);
+}
+
+
+static void charger_open(int open) {
+	ml5238_enable_charger_mosfet(open);
+}
+
 
 #define Health_Success 0
 #define Health_Discharger_Failt 1
@@ -39,8 +67,8 @@ bms_state_t *bms_state_get(void){
 
 static s32 _process_unheath(void){
 	if (bms_health()->load_current_short) {//短路检测后,关闭充放电mos
-		ml5238_enable_discharger_mosfet(0);
-		ml5238_enable_charger_mosfet(0); //disable charger mosfet
+		discharger_open(0);
+		charger_open(0); //disable charger mosfet
 		AUX_VOL_OPEN(0);
 		_bms_state.charging = 0;
 		_bms_state.discharging = 0;
@@ -48,13 +76,13 @@ static s32 _process_unheath(void){
 	}
 
 	if (bms_health()->charger_over_current || bms_health()->charger_over_temp || bms_health()->charger_lower_temp){
-		ml5238_enable_charger_mosfet(0); //disable charger mosfet
+		charger_open(0); //disable charger mosfet
 		_bms_state.charging = 0;
 		return Health_charger_Fault;
 	}
 
 	if (bms_health()->discharger_over_temp || bms_health()->discharger_lower_temp || bms_health()->discharger_lower_voltage){
-		ml5238_enable_discharger_mosfet(0); //disable charger mosfet
+		discharger_open(0); //disable charger mosfet
 		_bms_state.discharging = 0;
 		return Health_Discharger_Failt;
 	}
@@ -71,10 +99,10 @@ static s32 _process_unheath(void){
 static void _process_user_request(s32 health){
 	if (_bms_state.user_request & USER_REQUEST_PENDING){
 		if ((health & Health_charger_Fault) == 0){
-			ml5238_enable_charger_mosfet(!!(_bms_state.user_request & USER_REQUEST_CHARGER));
+			charger_open(!!(_bms_state.user_request & USER_REQUEST_CHARGER));
 		}
 		if ((health & Health_Discharger_Failt) == 0){
-			ml5238_enable_discharger_mosfet(!!(_bms_state.user_request & USER_REQUEST_DISCHARGER));
+			discharger_open(!!(_bms_state.user_request & USER_REQUEST_DISCHARGER));
 		}
 		if ((health & Health_aux_Fault) == 0){
 			AUX_VOL_OPEN(!!(_bms_state.user_request & USER_REQUEST_SMALLCURRENT));
@@ -94,8 +122,8 @@ static void _process_power_down(void){
 		}
 		AUX_VOL_OPEN(0);
 		CS1180_PWR_ENABLE(0);
-		ml5238_enable_discharger_mosfet(0);
-		ml5238_enable_charger_mosfet(0);		
+		discharger_open(0);
+		charger_open(0);		
 		ml5238_power_down();
 	}
 #endif
@@ -119,7 +147,7 @@ static void _process_deepsleep(s32 health){
 static void _process_iostate_changed(void){
 	if (!(io_state()->hall_detect)){
 		if (ml5238_is_discharging()){
-			ml5238_enable_discharger_mosfet(0);
+			discharger_open(0);
 		}
 		if (!AUX_VOL_IS_OPEN()){
 			AUX_VOL_OPEN(1);
@@ -127,7 +155,7 @@ static void _process_iostate_changed(void){
 	}
 	if (IS_CHARGER_IN()) {
 		if (!ml5238_is_charging()){
-			ml5238_enable_charger_mosfet(1);
+			charger_open(1);
 		}
 	}
 }
@@ -163,6 +191,8 @@ static void check_charging(){
 		if (debounce_reach_max(_charging_detect)){
 			_bms_state.charging = 0;
 			_bms_state.discharging = 1;
+			shark_timer_cancel(&_balance_timer);
+			_balance_timer_handler(&_balance_timer);
 			debounce_reset(_charging_detect);
 		}
 	}
@@ -172,6 +202,7 @@ static void check_charging(){
 static void _current_notify(void){
 	check_current_state(); //check health of current
 	check_charging();
+	soc_update(); //计算soc
 }
 
 /* 需要检查电芯的电压,如果发现有电芯电压过高,需要开启被动均衡 
@@ -179,6 +210,11 @@ static void _current_notify(void){
  * 木桶效应,目标是电压最高的那个cell,尽量压制,不让电压再升高,或者升高的尽量慢一些
 */
 static debounce_t _cell_balance = {.count = 10, .max_count = 20};
+
+static void _balance_timer_handler(shark_timer_t *t){
+	ml5238_cell_start_balance(0);
+	_bms_state.pack_balancing = 0;
+}
 static void check_cell_balance(uint8_t current_max_index){
 	if (!_bms_state.charging){ //not charging, need not do balance
 		if (_bms_state.pack_balancing){
@@ -204,6 +240,8 @@ static void check_cell_balance(uint8_t current_max_index){
 	}
 	if (_bms_state.pack_balancing && (current_max_index != _bms_state.cell_index_of_max_vol)){
 		ml5238_cell_start_balance(BIT(current_max_index));
+		_balance_timer.handler = _balance_timer_handler;
+		shark_timer_post(&_balance_timer, 60 * 1000); //stop balance after 1 minute
 	}
 	_bms_state.cell_index_of_max_vol = current_max_index;	
 }

+ 1 - 1
Application/bsp/ml5238.c

@@ -174,7 +174,7 @@ int ml5238_enable_charger_mosfet(int enable){
 
 int ml5238_short_current_detect(int mode){
 	uint8_t rsense = 0;
-	if (mode >= SHORT_CURRENT_MODE_33_3A){
+	if (mode >= SHORT_CURRENT_MODE_50A_100A){
 		if (ml5238_read(ML5238_RSENSE, &rsense) == 0){
 			if (ml5238_write(ML5238_SETSC, mode) == 0){
 				if (rsense & (RSENSE_ESC | RSENSE_ISC)){

+ 4 - 4
Application/bsp/ml5238.h

@@ -25,10 +25,10 @@ void ml5238_register_notify_handler(ml5238_notify_hander handler);
 #define ML5238_Event_Load_Disconnect 3
 
 #define SHORT_CURRENT_MODE_DISABLE -1
-#define SHORT_CURRENT_MODE_33_3A 0
-#define SHORT_CURRENT_MODE_66_6A 1
-#define SHORT_CURRENT_MODE_100A 2
-#define SHORT_CURRENT_MODE_133_3A 3
+#define SHORT_CURRENT_MODE_50A_100A 0 //sp600: 50A, SP700: 100A
+#define SHORT_CURRENT_MODE_100A_200A 1 //sp600: 100A SP700: 200A
+#define SHORT_CURRENT_MODE_150A_300A 2  //sp600: 150A Sp700: 300A
+#define SHORT_CURRENT_MODE_200A_400A 3 //sp600:200A SP700: 400A
 
 /* ml5238 will amplify the vmon val by 0.5, so we need 
  * multi 2 to the adc value, to get the real vol 

+ 2 - 0
Application/libs/shark_types.h

@@ -28,3 +28,5 @@ typedef int32_t s32;
 typedef int64_t s64;
 
 typedef enum { shark_false, shark_true } shark_bool;
+
+#define abs(x) ((x>0)?x:-x)

+ 1 - 1
Librarys/CMSIS/GD32F3x0/Source/startup_gd32f3x0.s

@@ -48,7 +48,7 @@ __initial_sp
 ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
 ; </h>
 
-Heap_Size       EQU     0x00000400
+Heap_Size       EQU     0x00000000
 
                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
 __heap_base

+ 55 - 43
Project/SP700.uvoptx

@@ -255,7 +255,7 @@
 
   <Group>
     <GroupName>SOX</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
@@ -319,6 +319,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>8</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\app\sox\soc.c</PathWithFileName>
+      <FilenameWithoutPath>soc.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -329,7 +341,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>8</FileNumber>
+      <FileNumber>9</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -341,7 +353,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>9</FileNumber>
+      <FileNumber>10</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -353,7 +365,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <FileNumber>11</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -365,7 +377,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -377,7 +389,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -389,7 +401,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -401,7 +413,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -413,7 +425,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -425,7 +437,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -437,7 +449,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -449,7 +461,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -461,7 +473,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -481,7 +493,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -493,7 +505,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -505,7 +517,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -517,7 +529,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -537,7 +549,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -549,7 +561,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -561,7 +573,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -573,7 +585,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -585,7 +597,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -597,7 +609,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -609,7 +621,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -621,7 +633,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -633,7 +645,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -645,7 +657,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -657,7 +669,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -669,7 +681,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -681,7 +693,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -693,7 +705,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -705,7 +717,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -717,7 +729,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -729,7 +741,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -741,7 +753,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -753,7 +765,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -765,7 +777,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -777,7 +789,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -789,7 +801,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -801,7 +813,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -815,13 +827,13 @@
 
   <Group>
     <GroupName>StartUp</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -833,7 +845,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/SP700.uvprojx

@@ -423,6 +423,11 @@
               <FileType>1</FileType>
               <FilePath>..\Application\app\sox\health.c</FilePath>
             </File>
+            <File>
+              <FileName>soc.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\soc.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>