Просмотр исходного кода

update func for mcu sleep/wakeup

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 лет назад
Родитель
Сommit
7e503bbe66

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

@@ -59,7 +59,7 @@ void health_init(void){
 	for (int i = 0; i < CELLS_NUM; i++){
 	for (int i = 0; i < CELLS_NUM; i++){
 		_health.internal_resistance[i] = 5;//毫欧,暂时用一个固定数据,后期需要计算R0=(U2-U1)/(I1-I2) - R1(R1为电路上的等效电阻+采样电阻)
 		_health.internal_resistance[i] = 5;//毫欧,暂时用一个固定数据,后期需要计算R0=(U2-U1)/(I1-I2) - R1(R1为电路上的等效电阻+采样电阻)
 	}
 	}
-	_health.is_work_temp_lower = 1;
+	_health.is_work_temp_lower = 0;
 }
 }
 
 
 bms_health_t *bms_health(){
 bms_health_t *bms_health(){

+ 4 - 4
Application/app/sox/iostate.c

@@ -1,4 +1,5 @@
 #include "bsp/gpio.h"
 #include "bsp/gpio.h"
+#include "bsp/mcu_power_sleep.h"
 #include "libs/shark_task.h"
 #include "libs/shark_task.h"
 #include "libs/logger.h"
 #include "libs/logger.h"
 #include "state.h"
 #include "state.h"
@@ -157,16 +158,15 @@ void small_current_short_irq_handler(void){
 
 
 
 
 void charger_detect_irq_handler(void){
 void charger_detect_irq_handler(void){
-
-	//io_debug("charger irq\n");
+	mcu_sleep_set_wakeup_source(WAKEUP_SOURCE_CHARGER);
 }
 }
 void hall1_detect_irq_handler(void){
 void hall1_detect_irq_handler(void){
 
 
-	//io_debug("hall 1 irq\n");
+	mcu_sleep_set_wakeup_source(WAKEUP_SOURCE_HALL1);
 }
 }
 void hall2_detect_irq_handler(void){
 void hall2_detect_irq_handler(void){
 
 
-	//io_debug("hall 2 irq\n");
+	mcu_sleep_set_wakeup_source(WAKEUP_SOURCE_HALL2);
 }
 }
 
 
 #if 0
 #if 0

+ 29 - 16
Application/app/sox/soc.c

@@ -144,22 +144,9 @@ uint32_t soc_get_charger_remain_time(void){
 	return charger_remain_time;
 	return charger_remain_time;
 }
 }
 
 
-void soc_update(void){
-	if (!chargering && bms_state_get()->charging){
-		_soc.pre_charger_coulomb = _soc.charger_coulomb;
-		_soc.charger_coulomb = 0;//clear charing
-		_soc.total_coulomb += _soc.pre_charger_coulomb / 3600.0f;
-		chargering = 1;
-		soc_warning("changed to chargering, current = %d\n", measure_value()->load_current);
-	}else if (chargering && !bms_state_get()->charging){
-		_soc.pre_discharger_coulomb = _soc.dischrger_coulomb;
-		_soc.dischrger_coulomb = 0; //clear discharger
-		_soc.total_coulomb += _soc.pre_discharger_coulomb / 3600.0f;
-		chargering = 0;
-		soc_warning("changed to dischargering, current = %d\n", measure_value()->load_current);
-	}
-	double current = measure_value()->load_current / 1000.0f; //A
-	double delta_q = current * _delta_time();
+static void soc_update_by_current_and_time(float current_now, float delta_time){
+	double current = current_now / 1000.0f; //A
+	double delta_q = current * delta_time;
 	if (chargering){
 	if (chargering){
 		delta_q = delta_q * _charger_coefficient;
 		delta_q = delta_q * _charger_coefficient;
 		_soc.charger_coulomb += abs(delta_q);
 		_soc.charger_coulomb += abs(delta_q);
@@ -206,6 +193,32 @@ void soc_update(void){
 		nv_save_soc();
 		nv_save_soc();
 	}
 	}
 
 
+}
+
+void soc_update_for_deepsleep(float sleep_time){
+	soc_update_by_current_and_time(-1.0f, sleep_time);
+}
+
+void soc_update(void){
+	if (!chargering && bms_state_get()->charging){
+		_soc.pre_charger_coulomb = _soc.charger_coulomb;
+		_soc.charger_coulomb = 0;//clear charing
+		_soc.total_coulomb += _soc.pre_charger_coulomb / 3600.0f;
+		chargering = 1;
+		soc_warning("changed to chargering, current = %d\n", measure_value()->load_current);
+	}else if (chargering && !bms_state_get()->charging){
+		_soc.pre_discharger_coulomb = _soc.dischrger_coulomb;
+		_soc.dischrger_coulomb = 0; //clear discharger
+		_soc.total_coulomb += _soc.pre_discharger_coulomb / 3600.0f;
+		chargering = 0;
+		soc_warning("changed to dischargering, current = %d\n", measure_value()->load_current);
+	}
+	double current = measure_value()->load_current / 1000.0f; //A
+	double delta_q = current * _delta_time();
+
+	soc_update_by_current_and_time(measure_value()->load_current, _delta_time());
+
+
 	soc_update_charger_remain_time();
 	soc_update_charger_remain_time();
 	
 	
 }
 }

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

@@ -269,6 +269,7 @@ static void _process_deepsleep(s32 health){
 	
 	
 	nv_save_soc();
 	nv_save_soc();
 	mcu_enter_deepsleep();
 	mcu_enter_deepsleep();
+	soc_update_for_deepsleep(mcu_get_sleeptime());//²¹³¥ÐÝÃߵŦºÄ
 	_sleep_time = shark_get_mseconds();
 	_sleep_time = shark_get_mseconds();
 #endif	
 #endif	
 }
 }

+ 26 - 8
Application/bsp/mcu_power_sleep.c

@@ -19,6 +19,8 @@ extern void adc_init(void);
 extern void adc_deinit(void);
 extern void adc_deinit(void);
 static uint32_t _sleep_second_time = 0;
 static uint32_t _sleep_second_time = 0;
 static uint32_t _sleep_second_time_now = 0;
 static uint32_t _sleep_second_time_now = 0;
+static uint32_t _wakeup_source = 0;
+
 static void post_deepsleep(void);
 static void post_deepsleep(void);
 
 
 #define WDOG_TIME_FOR_SLEEP 15
 #define WDOG_TIME_FOR_SLEEP 15
@@ -41,6 +43,13 @@ static void disable_wakeup_irq(void){
 	hall_2_detect_irq_enable(0);
 	hall_2_detect_irq_enable(0);
 }
 }
 
 
+static int _is_wakeup_source(void){
+	return (_wakeup_source & (~WAKEUP_SOURCE_RTC)) != 0;
+}
+
+void mcu_sleep_set_wakeup_source(uint32_t source){
+	_wakeup_source |= source;
+}
 
 
 static void pre_deepsleep(void){
 static void pre_deepsleep(void){
 	CS1180_PWR_ENABLE(0);
 	CS1180_PWR_ENABLE(0);
@@ -93,16 +102,25 @@ void mcu_enter_deepsleep(void){
 
 
 	pre_deepsleep();
 	pre_deepsleep();
 	enable_wakeup_irq();
 	enable_wakeup_irq();
-	u32 start_time = shark_rtc_get_second();
-	pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
-	u32 end_time = shark_rtc_get_second();
-	if (end_time >= start_time) {
-		_sleep_second_time_now = end_time - start_time;
-	}else { //rtc second wrap
-		_sleep_second_time_now = 60 - start_time + end_time;
-	}
+	_sleep_second_time_now = 0;
+	_wakeup_source = 0;
+	do {
+		u32 start_time = shark_rtc_get_second();
+		pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD);
+		u32 end_time = shark_rtc_get_second();
+		if (end_time >= start_time) {
+			_sleep_second_time_now += end_time - start_time;
+		}else { //rtc second wrap
+			_sleep_second_time_now += 60 - start_time + end_time;
+		}
+		wdog_reload();
+	}while(!_is_wakeup_source());
 	_sleep_second_time += _sleep_second_time_now;
 	_sleep_second_time += _sleep_second_time_now;
 	disable_wakeup_irq();
 	disable_wakeup_irq();
 	post_deepsleep();
 	post_deepsleep();
 }
 }
 
 
+uint32_t mcu_get_sleeptime(void){
+	return _sleep_second_time_now;
+}
+

+ 9 - 0
Application/bsp/mcu_power_sleep.h

@@ -1,7 +1,16 @@
 #ifndef _Mcu_Power_Sleep_H__
 #ifndef _Mcu_Power_Sleep_H__
 #define _Mcu_Power_Sleep_H__
 #define _Mcu_Power_Sleep_H__
+#include <stdint.h>
+#define WAKEUP_SOURCE_RTC 0x1
+#define WAKEUP_SOURCE_HALL1 0x2
+#define WAKEUP_SOURCE_HALL2 0x4
+#define WAKEUP_SOURCE_CHARGER 0x8
+#define WAKEUP_SOURCE_IR1   0x10
+#define WAKEUP_SOURCE_IR2   0x20
 
 
 void mcu_enter_deepsleep(void);
 void mcu_enter_deepsleep(void);
+uint32_t mcu_get_sleeptime(void);
+void mcu_sleep_set_wakeup_source(uint32_t source);
 
 
 #endif /* _Mcu_Power_Sleep_H__ */
 #endif /* _Mcu_Power_Sleep_H__ */