Browse Source

解决deepsleep重启的问题

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 years ago
parent
commit
1572b0c888

+ 4 - 0
Application/app/bms_message.c

@@ -195,6 +195,10 @@ void process_bms_message(can_frame_t *frame, int len){
 			}
 			protocol_send_ack(frame->head.can_addr, frame->key, result);
 			break;
+		case CAN_KEY_START_CALI:
+			//measure_start_cali();
+			protocol_send_ack(frame->head.can_addr, frame->key, 1);
+			break;
 	}
 }
 

+ 2 - 0
Application/app/protocol.h

@@ -126,6 +126,8 @@ typedef struct {
 #define CAN_KEY_SET_SN      0x06 //string
 #define CAN_KEY_GET_SN      0x05 //return string
 
+#define CAN_KEY_START_CALI  0xa8
+
 #define CAN_KEY_IAP_ENTER   0xF0
 #define CAN_KEY_IAP_BEGIN   0xF1
 #define CAN_KEY_IAP_CHECK   0xF2

+ 40 - 0
Application/app/sox/Least_Square.c

@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include "libs/logger.h"
+
+//y = ax + b
+typedef struct {
+	double x;
+	double y;
+}smaple_t;
+
+static smaple_t samples[5];
+static int sample_count;
+static float AA, BB;
+
+
+void Least_square_method(void)
+{
+	int i=0;
+	double K = 0, A = 0, B = 0, C = 0, D = 0;	
+	for(i=0;i<sample_count;i++) {
+		A += samples[i].x * samples[i].y;
+		B += samples[i].x;
+		C += samples[i].y;
+		D += samples[i].x * samples[i].x;
+	}
+	AA = (sample_count * A - B * C) / ( sample_count * D - B * B);
+	BB = C / sample_count - K * B / sample_count;
+	sys_debug("Gain = %f, zero Off = %f\n", AA, BB);
+}
+
+void add_smaple(float x, float y){
+	if (sample_count < 5){
+		samples[sample_count].x = x;
+		samples[sample_count].y = y;
+		sample_count ++;
+		sys_debug("add x = %f, y = %f\n", x, y);
+	}
+	if (sample_count == 5){
+		Least_square_method();
+	}
+}

+ 11 - 6
Application/app/sox/health.c

@@ -72,7 +72,7 @@ static void init_detect_timer(void){
 	_load_detect_timer.interval = 10;
 
 	_charger_detect_timer._timer.handler = charger_detect_handler;
-	_charger_detect_timer.max_count = 100;
+	_charger_detect_timer.max_count = 500;
 	_charger_detect_timer.interval = 10;	
 }
 
@@ -92,13 +92,15 @@ static void load_delect_handler(shark_timer_t *timer){
 }
 
 static void charger_detect_handler(shark_timer_t *timer){
-	if (!io_state()->charger_detect) {
+	if (!io_state()->charger_detect || !bms_state_get()->charging) {
 		_charger_detect_timer.count ++;
 	}else {
 		_charger_detect_timer.count = 0;
 	}
 	if (_charger_detect_timer.count >= _charger_detect_timer.max_count){
 		_health.charger_over_current = 0;
+		_charger_detect_timer.count = 0;
+		health_warning("clear charger over current\n");
 	}else {
 		shark_timer_post(&_charger_detect_timer._timer, _charger_detect_timer.interval);
 	}
@@ -127,11 +129,15 @@ static void debug_health(void){
 /* 检测电流情况,看是否过流等 */
 static debounce_t _charger_over_current = {
 	.count = 0,
-	.max_count = 10
+	.max_count = 70
 };
 void check_current_state(void){
 	//判断是否过流充电,放电过流通过5238来检测
-	if (bms_state_get()->charging && !_health.charger_over_current) {
+	if (!bms_state_get()->charging){
+		_charger_over_current.count = 0;
+		return;
+	}
+	if (!_health.charger_over_current) {
 		float current = measure_value()->load_current;
 		if (current > MAX_CURRENT_FOR_CHARGER) {
 			_charger_over_current.count ++;
@@ -141,11 +147,10 @@ void check_current_state(void){
 		if (_charger_over_current.count >= _charger_over_current.max_count){
 			_health.charger_over_current = 1;
 			_charger_over_current.count = 0;
+			health_warning("charger over current\n");
 			shark_timer_post(&_charger_detect_timer._timer, _charger_detect_timer.interval);
 		}
 	}
-	
-	debug_health();
 }
 
 /* 检测pack电压,cell电压,pack电压过低触发powerdown*/

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

@@ -3,7 +3,7 @@
 #include <stdint.h>
 #include "bsp/shark_bsp.h"
 
-#define MAX_CURRENT_FOR_CHARGER (20*1000) //最大充电电流20A
+#define MAX_CURRENT_FOR_CHARGER (30*1000) //最大充电电流20A
 #define SIGLE_CELL_MAX_CHARGER_VOLTAGE (3800)//最大允许充电电压,3.9v,考虑到采样的误差取 3.88
 /* 
  * xxx_over_temp: 表示过高温(温度过高)

+ 2 - 3
Application/app/sox/measure.c

@@ -117,7 +117,6 @@ static float get_pack_current_by_gd(void){
 		select_gain_10x(0); 
 		adc = adc_sample_avg(ADC_CHAN_IMON, GD32_ADC_READ_TIMES);		
 	}
-	
 	float cali_adc = ML5238_V_RSENSER(adc, vim0_now, imon_gain_now);
 
 	return (int)((cali_adc / max_gd_adc) * v_gd_ref / r_sense * 1000);
@@ -125,10 +124,10 @@ static float get_pack_current_by_gd(void){
 
 static float get_pack_current_by_cs1180(int *valid){
 	float adc = cs1180_adc_sample(valid);
-	return (adc / max_cs1180_adc) * v_cs1180_ref / r_sense * 1000 - 5.0f;//板子固定5MA,cs1180无法测量到
+	float vol = (adc / max_cs1180_adc) * v_cs1180_ref;
+	return (vol / r_sense) * 1000 - 5.0f;//板子固定5MA,cs1180无法测量到
 }
 
-
 float get_pack_current(void){
 	float current = get_pack_current_by_gd();
 	if (cs1180_change_gain(current) == 0) {

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

@@ -10,6 +10,7 @@ int get_pack_temperature(int index);
 void current_calibrate(void);
 float get_ml5238_gain(void);
 float get_ml5238_vos(void);
+void measure_start_cali(void);
 
 #endif /* _IV_Measure_H__ */
 

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

@@ -49,7 +49,7 @@ 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.delay = 15;
 	_current_voltage_task.index = 0;
 	_measure_value.load_current = get_pack_current();
 	for (int i = 0; i < CELLS_NUM; i++){

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

@@ -28,4 +28,5 @@ uint32_t soc_get_cycle(void);
 uint32_t soc_get_charger_remain_time(void);
 soc_t *get_soc(void);
 void soc_log(void);
+void soc_update_for_deepsleep(float sleep_time);
 

+ 5 - 4
Application/app/sox/state.c

@@ -12,7 +12,7 @@
 #include "state.h"
 #include "iostate.h"
 
-#define ALLOW_DEEP_SLEEP 0
+#define ALLOW_DEEP_SLEEP 1
 #define SLEEP_IGNORE_UNHEALTH 0
 #define ALLOW_POWER_DOWN 0 //disable power down for debug
 #define ALLOW_5238_BALANCE 0
@@ -226,6 +226,7 @@ static void _process_power_down(void){
 		u64 wait_start = shark_get_mseconds();
 		while(!ml5238_charger_is_disconnect(AUX_VOL_IS_OPEN())){
 			shark_uart_flush();
+			wdog_reload();
 			if (shark_get_mseconds() - wait_start >= 2000){
 				bms_health()->powerdown_lower_voltage = 0;
 				ml5238_enable_charger_detect(AUX_VOL_IS_OPEN(), 0);
@@ -263,7 +264,7 @@ static void _process_deepsleep(s32 health){
 	if (io_state()->aux_lock_detect){
 		return;
 	}
-	if (shark_get_mseconds() < (_sleep_time + 10 * 1000)){
+	if (shark_get_mseconds() < (_sleep_time + 3 * 1000)){
 		return;
 	}
 	
@@ -292,7 +293,7 @@ static void _process_iostate_changed(s32 unhealth){
 		}
 	}
 	if (io_state()->charger_detect && ((unhealth & Health_charger_Fault) == 0) && (_bms_state.cell_max_vol < SIGLE_CELL_MAX_CHARGER_VOLTAGE)) {
-		if (!ml5238_is_charging()){
+		if (!ml5238_is_charging() && shark_uart_timeout()){//不在车上,底座上,充电柜上,检测到充电器插入,自动打开充电,否则的话,只能通过指令来打开充电mos
 			charger_open(1);
 		}
 	}
@@ -365,8 +366,8 @@ static void _check_mos_stat(void){
 }
 
 static void _current_notify(void){
-	check_current_state(); //check health of current
 	check_charging();
+	check_current_state(); //check health of current
 	_check_mos_stat();
 	soc_update(); //计算soc
 }

+ 4 - 0
Application/bsp/bsp.c

@@ -21,6 +21,10 @@ extern void system_clock_config(void);
 extern void SystemCoreClockUpdate(void);
 #define ALARM_TEST 1
 
+#ifndef CONFIG_DEBUG
+#define CONFIG_DEBUG 0
+#endif
+
 #if 0
 void test_fmc_flash(void){
 	uint8_t data[128];

+ 1 - 1
Application/bsp/gd32_adc.c

@@ -19,7 +19,7 @@ void gd32_adc_init(void){
 	gpio_mode_analog_input(GPIOB, GPIO_PIN_1|GPIO_PIN_0);
 
     /* config ADC clock */
-    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV8); //adc clock:7M 
+    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6); //adc clock:7M 
 
 	rcu_periph_clock_enable(RCU_ADC);
 	adc_deinit();

+ 17 - 1
Application/bsp/mcu_power_sleep.c

@@ -51,6 +51,12 @@ void mcu_sleep_set_wakeup_source(uint32_t source){
 	_wakeup_source |= source;
 }
 
+/* 在reload命令及deepsleep/standby模式命令中间插入(3个以上)IRC40K时钟间隔 */
+static void wait_for_enter_dsleep(void){
+	volatile uint32_t wait = 1000 * 30;
+	while(wait--> 0);
+}
+
 static void pre_deepsleep(void){
 	CS1180_PWR_ENABLE(0);
 	shark_uart_deinit(SHARK_UART0);
@@ -77,6 +83,7 @@ static void pre_deepsleep(void){
 	}
 	
 	wdog_set_timeout(WDOG_TIME_FOR_SLEEP);
+	wait_for_enter_dsleep();
 }
 
 static void post_deepsleep(void){
@@ -113,7 +120,16 @@ void mcu_enter_deepsleep(void){
 		}else { //rtc second wrap
 			_sleep_second_time_now += 60 - start_time + end_time;
 		}
-		wdog_reload();
+		if (_wakeup_source & WAKEUP_SOURCE_RTC) {
+			wdog_reload();
+			while (shark_rtc_start_alarm(RTC_ALARM_FOR_SLEEP) < 0){
+				wdog_reload();
+				if (_is_wakeup_source()){
+					break;
+				}
+			}
+			wait_for_enter_dsleep();
+		}
 	}while(!_is_wakeup_source());
 	_sleep_second_time += _sleep_second_time_now;
 	disable_wakeup_irq();

+ 16 - 2
Application/bsp/shark_rtc.c

@@ -1,6 +1,7 @@
 #include <string.h>
 #include "gd32f3x0_rtc.h"
 #include "shark_rtc.h"
+#include "bsp/mcu_power_sleep.h"
 
 void shark_rtc_init(void){
 	/* enable PMU and BKPI clocks */
@@ -69,7 +70,12 @@ static int set_rtc_alarm(uint32_t sencod){
 
 
 int shark_rtc_start_alarm(uint32_t second){
-	rtc_alarm_disable();
+	if (rtc_register_sync_wait() != SUCCESS){
+		return -1;
+	}	
+	if (rtc_alarm_disable() != SUCCESS){
+		return -1;
+	}
 	set_rtc_alarm(second);
 	rtc_interrupt_enable(RTC_INT_ALARM);
 	rtc_alarm_enable();
@@ -84,10 +90,17 @@ void shark_rtc_stop_alarm(void){
 	rtc_flag_clear(RTC_STAT_ALRM0F);
 	rtc_interrupt_disable(RTC_INT_ALARM);
 }
-void shark_rtc_update_alarm(uint32_t sencod){
+int shark_rtc_update_alarm(uint32_t sencod){
+	if (rtc_register_sync_wait() != SUCCESS){
+		return -1;
+	}
+	if (rtc_alarm_disable() != SUCCESS){
+		return -1;
+	}
 	rtc_alarm_disable();
 	set_rtc_alarm(sencod);
 	rtc_alarm_enable();
+	return 0;
 }
 
 
@@ -95,5 +108,6 @@ void RTC_IRQHandler(void){
     if(RESET != rtc_flag_get(RTC_STAT_ALRM0F)){
 		rtc_flag_clear(RTC_STAT_ALRM0F);
 		exti_flag_clear(EXTI_17);
+		mcu_sleep_set_wakeup_source(WAKEUP_SOURCE_RTC);
     }
 }

+ 1 - 0
Application/bsp/shark_rtc.h

@@ -11,5 +11,6 @@ extern int shark_rtc_start_alarm(uint32_t sencod);
 extern void shark_update_alarm(uint32_t sencod);
 extern void shark_rtc_stop_alarm(void);
 extern int shark_rtc_get_second(void);
+extern int shark_rtc_update_alarm(uint32_t sencod);
 
 #endif /* _Shark_Rtc_h__ */

+ 1 - 1
Project/SP700.uvoptx

@@ -175,7 +175,7 @@
       <DebugFlag>
         <trace>0</trace>
         <periodic>1</periodic>
-        <aLwin>1</aLwin>
+        <aLwin>0</aLwin>
         <aCover>0</aCover>
         <aSer1>0</aSer1>
         <aSer2>0</aSer2>