Explorar o código

add balance && single cell voltage test

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui %!s(int64=5) %!d(string=hai) anos
pai
achega
08f96236a0

+ 66 - 37
Application/app/sox/health.c

@@ -5,9 +5,12 @@
 #include "measure_task.h"
 
 #define MAX_CURRENT_FOR_CHARGER (20*1000) //最大充电电流20A
-#define MIN_VOLTAGE_FOR_DISCHARGER (39 * 1000) //允许能放电的最小电压
+#define MIN_VOLTAGE_FOR_DISCHARGER (34 * 1000) //允许能放电的最小电压
 #define MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER (40 * 1000) //恢复放电的最小电压
 #define MIN_VOLTAGE_FOR_POWER_DOWN (32 * 1000)
+#define SIGLE_CELL_LOWER_DISCHARGER_VOLTAGE (1820) //最小允许的电芯放电电压 1.8v, 考虑到采样的误差取 1.82
+#define SIGLE_CELL_MAX_CHARGER_VOLTAGE (3880)//最大允许充电电压,3.9v,考虑到采样的误差取 3.88
+
 static int8_t charger_normal_low_temp[PACK_TEMPS_NUM] = {0,0,0,0}; //正常的充电最低温度
 static int8_t charger_normal_high_temp[PACK_TEMPS_NUM] = {50,50,50,55}; //正常的充电最高温度
 static int8_t charger_lower_low_temp[PACK_TEMPS_NUM] = {-5,-5,-5,0}; //需要停止充电的最低温度
@@ -113,43 +116,69 @@ void check_current_state(void){
 static debounce_t _discharger_lower_voltage = {.count = 0, .max_count = 10};
 static debounce_t _discharger_low_normal_voltage = {.count = 0, .max_count = 10};
 static debounce_t _power_down_voltage = {.count = 0, .max_count = 10};
+static debounce_t _sigle_cell_discharger_lower_vol = {.count = 5, .max_count = 10};
+static debounce_t _sigle_cell_charger_max_vol = {.count = 15, .max_count = 30};
+
 void check_voltage_state(void) {
+	if (bms_state_get()->charging){
+		if (bms_state_get()->cell_max_vol>= SIGLE_CELL_MAX_CHARGER_VOLTAGE){
+			debounce_inc(_sigle_cell_charger_max_vol);
+		}else {
+			debounce_dec(_sigle_cell_charger_max_vol);
+		}
+		if (debounce_reach_max(_sigle_cell_charger_max_vol)){
+			_health.sigle_cell_over_voltage = 1;
+		}else if (debounce_reach_zero(_sigle_cell_charger_max_vol)){
+			_health.sigle_cell_over_voltage = 0;
+		}
+	}else if (bms_state_get()->discharging){
+		if (bms_state_get()->cell_min_vol <= SIGLE_CELL_LOWER_DISCHARGER_VOLTAGE){
+			debounce_inc(_sigle_cell_discharger_lower_vol);
+		}else {
+			debounce_dec(_sigle_cell_discharger_lower_vol);
+		}
+		if (debounce_reach_max(_sigle_cell_discharger_lower_vol)){
+			_health.sigle_cell_lower_voltage = 1;
+		}else if (debounce_reach_zero(_sigle_cell_discharger_lower_vol)){
+			_health.sigle_cell_lower_voltage = 0;
+		}
+	}	
 	if (!_health.discharger_lower_voltage){ //check for low pack voltage for close discharger
 		if (bms_state_get()->pack_voltage <= MIN_VOLTAGE_FOR_DISCHARGER){
-			debounce_inc(&_discharger_lower_voltage);
+			debounce_inc(_discharger_lower_voltage);
 		}else {
-			debounce_reset(&_discharger_lower_voltage);
+			debounce_reset(_discharger_lower_voltage);
 		}
-		if (debounce_reach(&_discharger_lower_voltage)){
+		if (debounce_reach_max(_discharger_lower_voltage)){
 			_health.discharger_lower_voltage = 1;
-			debounce_reset(&_discharger_lower_voltage);
+			debounce_reset(_discharger_lower_voltage);
 		}
 
 	}else { //check for discharger recovery
 		if (bms_state_get()->pack_voltage >= MIN_VOLTAGE_FOR_RECOVERY_DISCHARGER){
-			debounce_inc(&_discharger_low_normal_voltage);
+			debounce_inc(_discharger_low_normal_voltage);
 		}else {
-			debounce_reset(&_discharger_low_normal_voltage);
+			debounce_reset(_discharger_low_normal_voltage);
 		}
-		if (debounce_reach(&_discharger_low_normal_voltage)){
+		if (debounce_reach_max(_discharger_low_normal_voltage)){
 			_health.discharger_lower_voltage = 0;
-			debounce_reset(&_discharger_low_normal_voltage);
+			debounce_reset(_discharger_low_normal_voltage);
 		}		
 	}
 	/* check for power down */
 	if (!io_state()->charger_detect && !bms_state_get()->charging && !_health.powerdown_lower_voltage){
 		if (bms_state_get()->pack_voltage >= MIN_VOLTAGE_FOR_POWER_DOWN){
-			debounce_inc(&_power_down_voltage);
+			debounce_inc(_power_down_voltage);
 		}else {
-			debounce_reset(&_power_down_voltage);
+			debounce_reset(_power_down_voltage);
 		}
-		if (debounce_reach(&_power_down_voltage)){
+		if (debounce_reach_max(_power_down_voltage)){
 			/*
 			 * no need to clear powerdown(bms is shutdown), when charger insert, 
 			 * system will power on with powerdown_lower_voltage cleared
 			*/
 			_health.powerdown_lower_voltage = 1; 
-			debounce_reset(&_power_down_voltage);
+			debounce_reset(_power_down_voltage);
 		}	
 	}
 }
@@ -185,71 +214,71 @@ void check_temp_state(void){
 	if (bms_state_get()->charging){
 		if (!_health.charger_over_temp){
 			if (_is_over_temp(charger_higher_high_temp)) {//超过允许的最高温度
-				debounce_inc(&_charger_over_temp);
+				debounce_inc(_charger_over_temp);
 			}else {
-				debounce_reset(&_charger_over_temp);
+				debounce_reset(_charger_over_temp);
 			}
-			if (debounce_reach(&_charger_over_temp)){
+			if (debounce_reach_max(_charger_over_temp)){
 				_health.charger_over_temp = 1;
-				debounce_reset(&_charger_over_temp);
+				debounce_reset(_charger_over_temp);
 			}			
 		}
 		if (!_health.charger_lower_temp){
 			if (_is_low_temp(charger_lower_low_temp)) {//低于允许的最低温度
-				debounce_inc(&_charger_lower_temp);
+				debounce_inc(_charger_lower_temp);
 			}else {
-				debounce_reset(&_charger_lower_temp);
+				debounce_reset(_charger_lower_temp);
 			}
-			if (debounce_reach(&_charger_lower_temp)) {
+			if (debounce_reach_max(_charger_lower_temp)) {
 				_health.charger_lower_temp = 1;
-				debounce_reset(&_charger_lower_temp);
+				debounce_reset(_charger_lower_temp);
 			}
 		}
 		if (_health.charger_over_temp || _health.charger_lower_temp) {
 			if (!_is_over_temp(charger_normal_high_temp) && !_is_low_temp(charger_normal_low_temp)){
-				debounce_inc(&_charger_normal_temp);
+				debounce_inc(_charger_normal_temp);
 			}else {
-				debounce_reset(&_charger_normal_temp);
+				debounce_reset(_charger_normal_temp);
 			}
-			if (debounce_reach(&_charger_normal_temp)){
+			if (debounce_reach_max(_charger_normal_temp)){
 				_health.charger_over_temp = 0;
 				_health.charger_lower_temp = 0;
-				debounce_reset(&_charger_normal_temp);
+				debounce_reset(_charger_normal_temp);
 			}	
 		}
 	}else {
 		if (!_health.discharger_over_temp){
 			if (_is_over_temp(discharger_higher_high_temp)) {//超过允许的最高温度
-				debounce_inc(&_discharger_over_temp);
+				debounce_inc(_discharger_over_temp);
 			}else {
-				debounce_reset(&_discharger_over_temp);
+				debounce_reset(_discharger_over_temp);
 			}
-			if (debounce_reach(&_discharger_over_temp)){
+			if (debounce_reach_max(_discharger_over_temp)){
 				_health.discharger_over_temp = 1;
-				debounce_reset(&_discharger_over_temp);
+				debounce_reset(_discharger_over_temp);
 			}			
 		}
 		if (!_health.discharger_lower_temp){
 			if (_is_over_temp(discharger_lower_low_temp)) {//超过允许的最高温度
-				debounce_inc(&_discharger_lower_temp);
+				debounce_inc(_discharger_lower_temp);
 			}else {
-				debounce_reset(&_discharger_lower_temp);
+				debounce_reset(_discharger_lower_temp);
 			}
-			if (debounce_reach(&_discharger_lower_temp)) {
+			if (debounce_reach_max(_discharger_lower_temp)) {
 				_health.discharger_lower_temp = 1;
-				debounce_reset(&_discharger_lower_temp);
+				debounce_reset(_discharger_lower_temp);
 			}
 		}
 		if (_health.discharger_over_temp || _health.discharger_lower_temp) {
 			if (!_is_over_temp(discharger_normal_high_temp) && !_is_low_temp(discharger_normal_low_temp)){
-				debounce_inc(&_discharger_normal_temp);
+				debounce_inc(_discharger_normal_temp);
 			}else {
-				debounce_reset(&_discharger_normal_temp);
+				debounce_reset(_discharger_normal_temp);
 			}
-			if (debounce_reach(&_discharger_normal_temp)){
+			if (debounce_reach_max(_discharger_normal_temp)){
 				_health.charger_over_temp = 0;
 				_health.charger_lower_temp = 0;
-				debounce_reset(&_discharger_normal_temp);
+				debounce_reset(_discharger_normal_temp);
 			}	
 		}
 

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

@@ -14,6 +14,8 @@ typedef struct {
 	uint32_t discharger_lower_temp:1;
 	uint32_t discharger_lower_voltage:1;
 	uint32_t powerdown_lower_voltage:1;
+	uint32_t sigle_cell_lower_voltage:1;
+	uint32_t sigle_cell_over_voltage:1;
 	uint32_t small_current_short:1; //小电短路保护
 	uint32_t load_current_short:1; //大电短路保护
 }bms_health_t;

+ 50 - 14
Application/app/sox/state.c

@@ -13,6 +13,7 @@ static void _voltage_notify(void);
 static void _temperature_notify(void);
 
 void bms_state_init(void){
+	_bms_state.cell_index_of_max_vol = 0xff;
 	measure_task_init(_current_notify, _voltage_notify, _temperature_notify);
 	io_state_init();
 	health_init();
@@ -22,10 +23,7 @@ bms_state_t *bms_state_get(void){
 	return &_bms_state;
 }
 
-static debounce_t _charging_detect = {
-	.count = 0,
-	.max_count = 10
-};
+static debounce_t _charging_detect = {.count = 0, .max_count = 10};
 static void check_charging(){
 	if (bms_health()->charger_over_current || bms_health()->load_current_short) {
 		ml5238_enable_discharger_mosfet(0);
@@ -35,25 +33,25 @@ static void check_charging(){
 	}	
 	if (!_bms_state.charging) {
 		if (measure_value()->load_current >= MIN_START_CHARGER_CURRENT) {
-			_charging_detect.count ++;
+			debounce_inc(_charging_detect);
 		}else {
-			_charging_detect.count = 0;
+			debounce_reset(_charging_detect);
 		}
-		if (debounce_reach(&_charging_detect)){
+		if (debounce_reach_max(&_charging_detect)){
 			_bms_state.charging = 1;
 			_bms_state.discharging = 0;
-			_charging_detect.count = 0;
+			debounce_reset(_charging_detect);
 		}
 	}else {
 		if (measure_value()->load_current <= MIN_START_LOADING_CURRENT) {
-			_charging_detect.count ++;
+			debounce_inc(_charging_detect);
 		}else {
-			_charging_detect.count = 0;
+			debounce_reset(_charging_detect);
 		}
-		if (debounce_reach(&_charging_detect)){
+		if (debounce_reach_max(_charging_detect)){
 			_bms_state.charging = 0;
 			_bms_state.discharging = 1;
-			_charging_detect.count = 0;
+			debounce_reset(_charging_detect);
 		}
 	}
 
@@ -64,20 +62,58 @@ static void _current_notify(void){
 	check_charging();
 }
 
-/* 充电电流小于一定值,认为充满的时候,需要检查电芯的电压,如果发现有电芯电压过低,需要开启被动均衡 */
+/* 充电电流小于一定值,认为充满的时候,需要检查电芯的电压,如果发现有电芯电压过高,需要开启被动均衡 
+ * 充电过程中考虑balance,主要是希望cell 电压扩散后,保证1. 单电芯不能过压, 2. 单电芯不能比平均电压过低,导致
+ * 木桶效应,目标是电压最高的那个cell,尽量压制,不让电压再升高,或者升高的尽量慢一些
+*/
+static debounce_t _cell_balance = {.count = 10, .max_count = 20};
 static void check_cell_balance(void){
+	if (!_bms_state.charging){ //not charging, need not do balance
+		if (_bms_state.pack_balancing){
+			_bms_state.pack_balancing = 0;
+			_cell_balance.count = 10;
+			ml5238_cell_start_balance(0);
+		}
+		return;
+	}
 
+	if (_bms_state.cell_max_vol - _bms_state.cell_min_vol >= MAX_DIFF_BETWEEN_MIN_MAX_CELL){
+		debounce_inc(_cell_balance);
+	}else {
+		debounce_dec(_cell_balance);
+	}
+	if (!_bms_state.pack_balancing && debounce_reach_max(_cell_balance)){
+		_bms_state.pack_balancing = 1;
+	}else if (_bms_state.pack_balancing && debounce_reach_zero(_cell_balance)){
+		_bms_state.pack_balancing = 0;
+		ml5238_cell_start_balance(0);
+	}
 }
 
-
 static void _voltage_notify(void){
 	uint16_t voltage = 0;
+	uint16_t max_cell = 0;
+	uint16_t min_cell = 0xf000;
+	uint8_t max_index = 0;
 	for (int i = 0; i < CELLS_NUM; i++){
 		voltage += measure_value()->cell_vol[i];
+		if (max_cell > measure_value()->cell_vol[i]){
+			max_cell = measure_value()->cell_vol[i];
+			max_index = i;
+		}
+		if (min_cell < measure_value()->cell_vol[i]){
+			min_cell = measure_value()->cell_vol[i];
+		}		
 	}
 	_bms_state.pack_voltage = voltage;
+	_bms_state.cell_max_vol = max_cell;
+	_bms_state.cell_min_vol = min_cell;	
 	check_voltage_state(); //check health of cell voltage
 	check_cell_balance();
+	if (_bms_state.pack_balancing && (max_index != _bms_state.cell_index_of_max_vol)){
+		ml5238_cell_start_balance(BIT(max_index));
+	}
+	_bms_state.cell_index_of_max_vol = max_index;
 }
 
 static void _temperature_notify(void){

+ 20 - 3
Application/app/sox/state.h

@@ -16,11 +16,16 @@
 
 #define MIN_START_CHARGER_CURRENT 100 //ma, 如果有正向超过 MIN_START_CHARGER_CURRENT的电流,认为在充电
 #define MIN_START_LOADING_CURRENT 2  //ma, 如果有反向小于 MIN_START_LOADING_CURRENT的电流,认为在放电
+#define MAX_DIFF_BETWEEN_MIN_MAX_CELL 150 //0.15v ,压差超过这个值,开始balance
+#define MIN_DIFF_BETWEEN_MIN_MAX_CELL 050 //0.05v, 牙差低于这个数据,停止balance
 typedef struct{
 	uint16_t discharging :1;
 	uint16_t charging: 1;
 	uint16_t pack_balancing:1;
 	uint16_t pack_voltage; //电池包的总电压
+	uint16_t cell_max_vol;
+	uint16_t cell_min_vol;
+	uint8_t  cell_index_of_max_vol;
 	int      used_by;//where this battery is used for: on motor, on charger docker, on charger box, NONE
 	int      user_request;
 }bms_state_t;
@@ -41,9 +46,21 @@ typedef struct {
 	int max_count;
 }debounce_t;
 
-#define debounce_reach(dt) ((dt)->count >= (dt)->max_count)
-#define debounce_reset(dt) ((dt)->count = 0)
-#define debounce_inc(dt) ((dt)->count++)
+/* 充电充满判断OK前,需要经过balance 的判断再决定是否告知充电完成,判断balance前soc会一直在99% 
+ * balance 的时候,不会停止充电,soc一直99%,推出balance后,soc直接到100%
+*/
+typedef enum {
+	charger_full_fsm_start = 0,
+	charger_full_fsm_check_balance,
+	charger_full_fsm_end_balance,
+	charger_full_fsm_full
+}charger_full_fsm_t;
+
+#define debounce_reach_max(dt) (dt.count >= dt.max_count)
+#define debounce_reach_zero(dt) (dt.count == 0)
+#define debounce_reset(dt) {dt.count = 0;}
+#define debounce_inc(dt) {if (dt.count < dt.max_count) dt.count++;}
+#define debounce_dec(dt) {if (dt.count > 0) dt.count--;}
 void bms_state_init(void);
 bms_state_t * bms_state_get(void);
 

+ 3 - 4
Application/bsp/ml5238.c

@@ -112,13 +112,12 @@ static int __inline__ _discharger_mosfet_is_open(void){
 	return (data & FET_DF) != 0;
 }
 
-void ml5238_cell_start_balance(uint16_t *vcell, int cell_num){
-	
+void ml5238_cell_start_balance(uint16_t balance_mask){
+	ml5238_write(ML5238_CBALH, (balance_mask >> 8) & 0xFF);
+	ml5238_write(ML5238_CBALL, balance_mask & 0xFF);
 }
 
-void ml5238_cell_stop_balance(void){
 
-}
 
 int ml5238_enable_discharger_mosfet(int enable){
 	uint8_t data;

+ 1 - 0
Application/bsp/ml5238.h

@@ -8,6 +8,7 @@ int ml5238_enable_charger_mosfet(int enable);
 int ml5238_short_current_detect(int mode);
 int ml5238_is_load_disconnect(void);
 int ml5238_enable_load_detect(int enable);
+void ml5238_cell_start_balance(uint16_t balance_mask);
 
 typedef void (*ml5238_notify_hander)(int event);
 void ml5238_register_notify_handler(ml5238_notify_hander handler);

+ 147 - 147
Project/SP700.uvoptx

@@ -242,7 +242,7 @@
   </Group>
 
   <Group>
-    <GroupName>BSP</GroupName>
+    <GroupName>SOX</GroupName>
     <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
@@ -254,8 +254,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\bsp\gpio.c</PathWithFileName>
-      <FilenameWithoutPath>gpio.c</FilenameWithoutPath>
+      <PathWithFileName>..\Application\app\sox\state.c</PathWithFileName>
+      <FilenameWithoutPath>state.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -266,8 +266,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\bsp\irqs.c</PathWithFileName>
-      <FilenameWithoutPath>irqs.c</FilenameWithoutPath>
+      <PathWithFileName>..\Application\app\sox\iostate.c</PathWithFileName>
+      <FilenameWithoutPath>iostate.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -278,8 +278,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\bsp\spi.c</PathWithFileName>
-      <FilenameWithoutPath>spi.c</FilenameWithoutPath>
+      <PathWithFileName>..\Application\app\sox\measure.c</PathWithFileName>
+      <FilenameWithoutPath>measure.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -290,8 +290,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\bsp\cs1180.c</PathWithFileName>
-      <FilenameWithoutPath>cs1180.c</FilenameWithoutPath>
+      <PathWithFileName>..\Application\app\sox\measure_task.c</PathWithFileName>
+      <FilenameWithoutPath>measure_task.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
@@ -302,14 +302,82 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\app\sox\health.c</PathWithFileName>
+      <FilenameWithoutPath>health.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>BSP</GroupName>
+    <tvExp>0</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\bsp\gpio.c</PathWithFileName>
+      <FilenameWithoutPath>gpio.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>8</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\bsp\irqs.c</PathWithFileName>
+      <FilenameWithoutPath>irqs.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>9</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\bsp\spi.c</PathWithFileName>
+      <FilenameWithoutPath>spi.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>10</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\bsp\cs1180.c</PathWithFileName>
+      <FilenameWithoutPath>cs1180.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>11</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
       <PathWithFileName>..\Application\bsp\ml5238.c</PathWithFileName>
       <FilenameWithoutPath>ml5238.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>7</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>12</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -320,8 +388,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>8</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>13</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -332,8 +400,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>9</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>14</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -344,8 +412,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>10</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>15</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -356,8 +424,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>11</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>16</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -368,8 +436,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>2</GroupNumber>
-      <FileNumber>12</FileNumber>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -383,13 +451,13 @@
 
   <Group>
     <GroupName>Libs</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>13</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -400,8 +468,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>14</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -412,8 +480,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>3</GroupNumber>
-      <FileNumber>15</FileNumber>
+      <GroupNumber>4</GroupNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -432,8 +500,8 @@
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -444,8 +512,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -456,8 +524,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -468,8 +536,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -480,8 +548,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -492,8 +560,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -504,8 +572,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -516,8 +584,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -528,8 +596,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -540,8 +608,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -552,8 +620,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -564,8 +632,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -576,8 +644,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -588,8 +656,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -600,8 +668,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -612,8 +680,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -624,8 +692,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -636,8 +704,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -648,8 +716,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -660,8 +728,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -672,8 +740,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -684,8 +752,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -696,8 +764,8 @@
       <bShared>0</bShared>
     </File>
     <File>
-      <GroupNumber>4</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <GroupNumber>5</GroupNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -711,13 +779,13 @@
 
   <Group>
     <GroupName>StartUp</GroupName>
-    <tvExp>1</tvExp>
+    <tvExp>0</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>
     <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <GroupNumber>6</GroupNumber>
+      <FileNumber>44</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -727,74 +795,6 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
-    <File>
-      <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Librarys\CMSIS\GD32F3x0\Source\system_gd32f3x0.c</PathWithFileName>
-      <FilenameWithoutPath>system_gd32f3x0.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-  </Group>
-
-  <Group>
-    <GroupName>SOX</GroupName>
-    <tvExp>1</tvExp>
-    <tvExpOptDlg>0</tvExpOptDlg>
-    <cbSel>0</cbSel>
-    <RteFlg>0</RteFlg>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>41</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\state.c</PathWithFileName>
-      <FilenameWithoutPath>state.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>42</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\iostate.c</PathWithFileName>
-      <FilenameWithoutPath>iostate.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>43</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\measure.c</PathWithFileName>
-      <FilenameWithoutPath>measure.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
-    <File>
-      <GroupNumber>6</GroupNumber>
-      <FileNumber>44</FileNumber>
-      <FileType>1</FileType>
-      <tvExp>0</tvExp>
-      <tvExpOptDlg>0</tvExpOptDlg>
-      <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\measure_task.c</PathWithFileName>
-      <FilenameWithoutPath>measure_task.c</FilenameWithoutPath>
-      <RteFlg>0</RteFlg>
-      <bShared>0</bShared>
-    </File>
     <File>
       <GroupNumber>6</GroupNumber>
       <FileNumber>45</FileNumber>
@@ -802,8 +802,8 @@
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
       <bDave2>0</bDave2>
-      <PathWithFileName>..\Application\app\sox\health.c</PathWithFileName>
-      <FilenameWithoutPath>health.c</FilenameWithoutPath>
+      <PathWithFileName>..\Librarys\CMSIS\GD32F3x0\Source\system_gd32f3x0.c</PathWithFileName>
+      <FilenameWithoutPath>system_gd32f3x0.c</FilenameWithoutPath>
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>

+ 30 - 30
Project/SP700.uvprojx

@@ -390,6 +390,36 @@
             </File>
           </Files>
         </Group>
+        <Group>
+          <GroupName>SOX</GroupName>
+          <Files>
+            <File>
+              <FileName>state.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\state.c</FilePath>
+            </File>
+            <File>
+              <FileName>iostate.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\iostate.c</FilePath>
+            </File>
+            <File>
+              <FileName>measure.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\measure.c</FilePath>
+            </File>
+            <File>
+              <FileName>measure_task.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\measure_task.c</FilePath>
+            </File>
+            <File>
+              <FileName>health.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\health.c</FilePath>
+            </File>
+          </Files>
+        </Group>
         <Group>
           <GroupName>BSP</GroupName>
           <Files>
@@ -605,36 +635,6 @@
             </File>
           </Files>
         </Group>
-        <Group>
-          <GroupName>SOX</GroupName>
-          <Files>
-            <File>
-              <FileName>state.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\state.c</FilePath>
-            </File>
-            <File>
-              <FileName>iostate.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\iostate.c</FilePath>
-            </File>
-            <File>
-              <FileName>measure.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\measure.c</FilePath>
-            </File>
-            <File>
-              <FileName>measure_task.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\measure_task.c</FilePath>
-            </File>
-            <File>
-              <FileName>health.c</FileName>
-              <FileType>1</FileType>
-              <FilePath>..\Application\app\sox\health.c</FilePath>
-            </File>
-          </Files>
-        </Group>
       </Groups>
     </Target>
   </Targets>