Jelajahi Sumber

soft current protect

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 tahun lalu
induk
melakukan
d9fab966d6

+ 16 - 4
Application/app/sox/health.c

@@ -48,7 +48,8 @@ static void clear_short_current_handler(shark_timer_t *timer);
 static void charger_detect_handler(shark_timer_t *timer);
 static void _aux_lock_timer_handler(shark_timer_t *t);
 static void _aux_unlock_timer_handler(shark_timer_t *t);
-
+void soft_current_init(void);
+int soft_current_push(float current_ma);
 static bms_health_t _health;
 static debounce_timer_t _load_detect_timer = {.max_count = 100, .interval = 10, ._timer.handler = load_detect_handler};
 static debounce_timer_t _charger_detect_timer = {.max_count = 500, .interval = 10, ._timer.handler = charger_detect_handler};
@@ -56,6 +57,7 @@ static shark_timer_t _clear_short_current_timer = {.handler = clear_short_curren
 void health_init(void){
 	/* 5238如果有异常情况,比如短路,负载移除,通过这个handler上报 */
 	ml5238_register_notify_handler(check_ml5238_state);
+	soft_current_init();
 	set_log_level(MOD_HEALTH, L_debug);
 	for (int i = 0; i < CELLS_NUM; i++){
 		_health.internal_resistance[i] = 1;//毫欧,暂时用一个固定数据,后期需要计算R0=(U2-U1)/(I1-I2) - R1(R1为电路上的等效电阻+采样电阻)
@@ -137,16 +139,17 @@ static debounce_t _charger_over_current = {
 	.count = 0,
 	.max_count = 70
 };
+#if 0
 static debounce_t _discharger_over_current = {
 	.count = 0,
 	.max_count = 20
 };
-
+#endif
 /* 55 - 100A, 14 - I x I / 750 */
 void check_current_state(void){
 	float current = measure_value()->load_current;
 	if (bms_state_get()->charging) {
-		_discharger_over_current.count = 0;
+		//_discharger_over_current.count = 0;
 		if (!_health.charger_over_current) {
 			if (current > MAX_CURRENT_FOR_CHARGER) {
 				_charger_over_current.count ++;
@@ -163,6 +166,14 @@ void check_current_state(void){
 	}else{
 		_charger_over_current.count = 0;
 		if (!_health.load_current_short){
+			if (soft_current_push(current)) {
+				_health.load_current_short = 1;
+				//_discharger_over_current.count = 0;
+				ml5238_enable_load_detect(1); //打开负载检测
+				shark_timer_post(&_load_detect_timer._timer, _load_detect_timer.interval);
+				soft_current_init();
+			}
+#if 0			
 			if ((abs(current) >= MAX_CURRENT_FOR_DISCHARGER)) {
 				_discharger_over_current.count++;
 			}else {
@@ -174,8 +185,9 @@ void check_current_state(void){
 				ml5238_enable_load_detect(1); //打开负载检测
 				shark_timer_post(&_load_detect_timer._timer, _load_detect_timer.interval);
 			}
+#endif			
 		}
-	}
+	}	
 }
 
 /* 检测pack电压,cell电压,pack电压过低触发powerdown*/

+ 58 - 0
Application/app/sox/soft_current_protect.c

@@ -0,0 +1,58 @@
+#include <string.h>
+#include "libs/shark_libs.h"
+#include "libs/circle_buffer.h"
+#include "libs/logger.h"
+#define MAX_SIZE 50
+typedef struct {
+	c_buffer_t   current;
+	c_buffer_t   delta_ts;
+	u32  ts_sum;
+	u64  last_ts;
+	float i2t_sum;
+}fifo_i2_time_t;
+
+static fifo_i2_time_t _fifo_i2;
+static u8 _buffer[MAX_SIZE * 2];
+
+void soft_current_init(void){
+	_fifo_i2.ts_sum = 0;
+	_fifo_i2.last_ts = 0;
+	_fifo_i2.i2t_sum = 0.0f;
+	circle_buffer_init(&_fifo_i2.current, _buffer, MAX_SIZE);
+	circle_reset(&_fifo_i2.current);
+	circle_buffer_init(&_fifo_i2.delta_ts, _buffer + MAX_SIZE, MAX_SIZE);
+	circle_reset(&_fifo_i2.delta_ts);
+}
+
+
+int soft_current_push(float current_ma){
+	u8 current = (int)((abs(current_ma)))/1000;
+	if (current <= 50) {
+		current = 0; //СÓÚ50A£¬²»¼ÆÈë
+	}
+	if (_fifo_i2.last_ts == 0){
+		circle_put_one_data(&_fifo_i2.current, current);
+		circle_put_one_data(&_fifo_i2.delta_ts, 15);
+	}else {
+		u8 delta_ts = shark_get_mseconds() - _fifo_i2.last_ts;
+		float ceff = (current * current)/(2500.0f);
+		ceff = ceff * ceff;
+		_fifo_i2.i2t_sum += (current * current * delta_ts)/1000.0f * ceff;
+		_fifo_i2.ts_sum += delta_ts;
+		while ((circle_get_write_space(&_fifo_i2.current) <= 0) || (_fifo_i2.ts_sum > 1000)){
+			u8 pre_current = 0, pre_ts = 0;
+			circle_get_one_data(&_fifo_i2.current, &pre_current);
+			circle_get_one_data(&_fifo_i2.delta_ts, &pre_ts);
+			ceff = (pre_current * pre_current)/(2500.0f);
+			ceff = ceff * ceff;
+			_fifo_i2.i2t_sum -= (pre_current * pre_current * pre_ts)/1000.0f * ceff;
+			_fifo_i2.ts_sum -= pre_ts;
+		}
+		circle_put_one_data(&_fifo_i2.current, current);
+		circle_put_one_data(&_fifo_i2.delta_ts,delta_ts);
+	}
+	_fifo_i2.last_ts = shark_get_mseconds();
+	sys_debug("_fifo_i2.i2t_sum = %f, %d\n", _fifo_i2.i2t_sum, _fifo_i2.ts_sum);
+	return (_fifo_i2.i2t_sum >= 2500.0f); //ÕÛËãµ½1s
+}
+

+ 2 - 2
Application/libs/circle_buffer.c

@@ -95,7 +95,7 @@ int circle_get_one_data(c_buffer_t *cbuff, uint8_t *data){
 	return 1;
 }
 
-
+#if 0
 static __inline__ int circle_get_write_space(c_buffer_t *cbuff){
 	int16_t size = (cbuff->w_pos >= cbuff->r_pos)?(cbuff->buffer_len - cbuff->w_pos + cbuff->r_pos):(cbuff->r_pos - cbuff->w_pos);
 	size -= 1;
@@ -104,7 +104,7 @@ static __inline__ int circle_get_write_space(c_buffer_t *cbuff){
 	}
 	return size;
 }
-
+#endif
 static __inline__ int circle_get_read_space(c_buffer_t *cbuff){
 	int16_t size = (cbuff->r_pos > cbuff->w_pos) ? (cbuff->buffer_len - cbuff->r_pos + cbuff->w_pos) : (cbuff->w_pos - cbuff->r_pos);
 	if (size <= 0){

+ 8 - 0
Application/libs/circle_buffer.h

@@ -25,6 +25,14 @@ static __inline__ void circle_update_write_position(c_buffer_t *cbuff, int pos){
 static __inline__ int circle_get_read_position(c_buffer_t *cbuff){
 	return cbuff->r_pos;
 }
+static __inline__ int circle_get_write_space(c_buffer_t *cbuff){
+	int16_t size = (cbuff->w_pos >= cbuff->r_pos)?(cbuff->buffer_len - cbuff->w_pos + cbuff->r_pos):(cbuff->r_pos - cbuff->w_pos);
+	size -= 1;
+	if (size <= 0){
+		return CBUFF_FULL;
+	}
+	return size;
+}
 
 void circle_buffer_init(c_buffer_t *cbuff, uint8_t *buffer, int16_t max_len);
 void circle_reset(c_buffer_t *cbuff);

+ 56 - 44
Project/SP700.uvoptx

@@ -408,6 +408,18 @@
       <RteFlg>0</RteFlg>
       <bShared>0</bShared>
     </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>16</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\Application\app\sox\soft_current_protect.c</PathWithFileName>
+      <FilenameWithoutPath>soft_current_protect.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
   </Group>
 
   <Group>
@@ -418,7 +430,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>16</FileNumber>
+      <FileNumber>17</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -430,7 +442,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>17</FileNumber>
+      <FileNumber>18</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -442,7 +454,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>18</FileNumber>
+      <FileNumber>19</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -454,7 +466,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>19</FileNumber>
+      <FileNumber>20</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -466,7 +478,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>20</FileNumber>
+      <FileNumber>21</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -478,7 +490,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>21</FileNumber>
+      <FileNumber>22</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -490,7 +502,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>22</FileNumber>
+      <FileNumber>23</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -502,7 +514,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>23</FileNumber>
+      <FileNumber>24</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -514,7 +526,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>24</FileNumber>
+      <FileNumber>25</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -526,7 +538,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>25</FileNumber>
+      <FileNumber>26</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -538,7 +550,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>26</FileNumber>
+      <FileNumber>27</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -550,7 +562,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>27</FileNumber>
+      <FileNumber>28</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -562,7 +574,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>28</FileNumber>
+      <FileNumber>29</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -574,7 +586,7 @@
     </File>
     <File>
       <GroupNumber>3</GroupNumber>
-      <FileNumber>29</FileNumber>
+      <FileNumber>30</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -594,7 +606,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>30</FileNumber>
+      <FileNumber>31</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -606,7 +618,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>31</FileNumber>
+      <FileNumber>32</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -618,7 +630,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>32</FileNumber>
+      <FileNumber>33</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -630,7 +642,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>33</FileNumber>
+      <FileNumber>34</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -642,7 +654,7 @@
     </File>
     <File>
       <GroupNumber>4</GroupNumber>
-      <FileNumber>34</FileNumber>
+      <FileNumber>35</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -662,7 +674,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>35</FileNumber>
+      <FileNumber>36</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -674,7 +686,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>36</FileNumber>
+      <FileNumber>37</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -686,7 +698,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>37</FileNumber>
+      <FileNumber>38</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -698,7 +710,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>38</FileNumber>
+      <FileNumber>39</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -710,7 +722,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>39</FileNumber>
+      <FileNumber>40</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -722,7 +734,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>40</FileNumber>
+      <FileNumber>41</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -734,7 +746,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>41</FileNumber>
+      <FileNumber>42</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -746,7 +758,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>42</FileNumber>
+      <FileNumber>43</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -758,7 +770,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>43</FileNumber>
+      <FileNumber>44</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -770,7 +782,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>44</FileNumber>
+      <FileNumber>45</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -782,7 +794,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>45</FileNumber>
+      <FileNumber>46</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -794,7 +806,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>46</FileNumber>
+      <FileNumber>47</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -806,7 +818,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>47</FileNumber>
+      <FileNumber>48</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -818,7 +830,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>48</FileNumber>
+      <FileNumber>49</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -830,7 +842,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>49</FileNumber>
+      <FileNumber>50</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -842,7 +854,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>50</FileNumber>
+      <FileNumber>51</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -854,7 +866,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>51</FileNumber>
+      <FileNumber>52</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -866,7 +878,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>52</FileNumber>
+      <FileNumber>53</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -878,7 +890,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>53</FileNumber>
+      <FileNumber>54</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -890,7 +902,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>54</FileNumber>
+      <FileNumber>55</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -902,7 +914,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>55</FileNumber>
+      <FileNumber>56</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -914,7 +926,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>56</FileNumber>
+      <FileNumber>57</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -926,7 +938,7 @@
     </File>
     <File>
       <GroupNumber>5</GroupNumber>
-      <FileNumber>57</FileNumber>
+      <FileNumber>58</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -946,7 +958,7 @@
     <RteFlg>0</RteFlg>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>58</FileNumber>
+      <FileNumber>59</FileNumber>
       <FileType>2</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>
@@ -958,7 +970,7 @@
     </File>
     <File>
       <GroupNumber>6</GroupNumber>
-      <FileNumber>59</FileNumber>
+      <FileNumber>60</FileNumber>
       <FileType>1</FileType>
       <tvExp>0</tvExp>
       <tvExpOptDlg>0</tvExpOptDlg>

+ 5 - 0
Project/SP700.uvprojx

@@ -463,6 +463,11 @@
               <FileType>1</FileType>
               <FilePath>..\Application\app\sox\Least_Square.c</FilePath>
             </File>
+            <File>
+              <FileName>soft_current_protect.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\Application\app\sox\soft_current_protect.c</FilePath>
+            </File>
           </Files>
         </Group>
         <Group>