R2UWaterRS485UW500/app/UWater_power_app.c

249 lines
6.7 KiB
C
Raw Normal View History

2024-06-03 15:49:39 +08:00
#ifdef __cplusplus
extern "C"
{
#endif
#include "UWater_power_app.h"
#include "UWater_adc_driver.h"
#include "UWater_rtcc_driver.h"
#include "soe.h"
/*------------------------------ Variable Define -------------------------------------*/
static u8 s_g_voltage_stat = NORMAL_POWER; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
static u8 s_g_power_machine_state_num = POWER_SYS_S0; // <20><>Դ<EFBFBD><D4B4>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><E2B4A6><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
static u8 s_power_adc_done = 0; // ADװ<44><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɱ<EFBFBD>־
static u32 s_power_adc_result = 0; // ADת<44><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static u8 s_power_reset=0;
u8 s_power_sleep_sum = 0;
u8 s_power_sleep_flag = FALSE; // <20><>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>
u32 temp_value;
/*------------------------------ Function Define -------------------------------------*/
/***********************<2A><><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>***************************
Function: void PowerADCEnable(void) void PowerADCDisable(void)
Description:
Input:
Return:
Others:
****************************************************************/
void PowerADCEnable(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
stcGpioCfg.enDir = GpioDirOut; ///< <20>˿ڷ<CBBF><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enDrv = GpioDrvL; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enPu = GpioPuDisable; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><>
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; ///< <20>˿ڿ<CBBF>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A>رտ<D8B1>©,ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enCtrlMode = GpioAHB; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>->AHB
Gpio_Init(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, &stcGpioCfg);
Gpio_WriteOutputIO(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, TRUE);
}
void PowerADCDisable(void)
{
stc_gpio_cfg_t stcGpioCfg;
DDL_ZERO_STRUCT(stcGpioCfg);
stcGpioCfg.enDir = GpioDirOut; ///< <20>˿ڷ<CBBF><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enDrv = GpioDrvL; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enPu = GpioPuDisable; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-><3E><>
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; ///< <20>˿ڿ<CBBF>©<EFBFBD><C2A9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<3A>رտ<D8B1>©,ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stcGpioCfg.enCtrlMode = GpioAHB; ///< <20>˿<EFBFBD><CBBF><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>ֵ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߿<EFBFBD><DFBF><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>->AHB
Gpio_Init(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, &stcGpioCfg);
Gpio_WriteOutputIO(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, FALSE);
}
/***********************<2A>ϵ<EFBFBD><CFB5><EFBFBD>ʼ<EFBFBD><CABC>***************************
Function: void PowerManageInitSys(void)
Description:
Input:
Return:
Others:
****************************************************************/
void PowerManageInitSys(void)
{
s_g_voltage_stat = NORMAL_POWER; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>
s_g_power_machine_state_num = POWER_SYS_S0; // <20><>Դ<EFBFBD><D4B4>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><E2B4A6><EFBFBD><EFBFBD>״̬<D7B4><CCAC>
RtccSetTimer(RTCC_TIMER_BAT_NUM, 30); //<2F>ϵ<EFBFBD>30s<30><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ
PowerADCDisable();
}
/***********************<2A><>ѯǷѹ<C7B7><D1B9>Ϣ***************************
Function: u8 PowerCheckStatusSys(void)
Description: <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ƿѹ
Input:
Return: LOW_POWER <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><EFBFBD> NORMAL_POWER<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Others:
****************************************************************/
u8 PowerCheckStatusSys (void)
{
return (s_g_voltage_stat);
}
/***********************<2A><>ѯ<EFBFBD><D1AF>ѹֵ<D1B9><D6B5>Ϣ***************************
Function: u16 PowerCheckValueSys(void)
Description: <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
Input:
Return: <EFBFBD>Ŵ<EFBFBD>100<EFBFBD><EFBFBD><EFBFBD><EFBFBD> u16,16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Others:
****************************************************************/
u16 PowerCheckValueSys(void)
{
return ((u16)temp_value);
}
/***********************<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>***************************
Function: void PowerMachineSys (void)
Description: Ӧ<EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӿ<EFBFBD>
Input:
Return:
Others:
*****************************************************************/
void PowerMachineSys(void)
{
static u8 low_power_sum = 0;
switch (s_g_power_machine_state_num)
{
case POWER_SYS_S0:
if (0 == RtccCheckTimer(RTCC_TIMER_BAT_NUM))
{
if(TASK_IDLE == AdcIfIdle())
{
PowerADCEnable();
AdcStartConvert(POWER_CHECK_CHANNEL, POWER_CHECK_NUM, POWER_CHECK_INTERVAL, &s_power_adc_result, &s_power_adc_done);
s_g_power_machine_state_num = POWER_SYS_S1;
}
}
break;
case POWER_SYS_S1:
if (TRUE == s_power_adc_done)
{
PowerADCDisable();
if (ADC_OK == AdcGetStatus())
{
if(s_power_adc_result <= LOW_POWER_ADC_VALUE) //Ƿѹ
{
low_power_sum ++;
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL);
if(low_power_sum >=6)
{
SaveNewSoe(SOE_BAT_LOW_LEVEL,SOE_REMARK_NOR); //<2F><>SOE
s_g_voltage_stat = LOW_POWER;
low_power_sum = 0;
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL); //<2F><>ʱ12h
}
}
else
{
s_g_voltage_stat = NORMAL_POWER;
low_power_sum = 0;
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL); //<2F><>ʱ12h
}
temp_value = s_power_adc_result * 500; //((v/2)/2.5)*4096 = s_power_adc_result
temp_value = temp_value/4096;
if(s_power_reset==0)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
{
s_power_reset =1;
if(temp_value<360)
{
RtccSetTimer(RTCC_TIMER_BAT_NUM, 10);//10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD>
}
}
s_g_power_machine_state_num = POWER_SYS_S0;
}
}
break;
default:
break;
}
}
/***********************<2A><><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>***************************
Function: u8 PowerIfSleepSys(void)
Description:
Input:
Return:
Others:
*****************************************************************/
u8 PowerIfSleepSys(void)
{
if (s_g_power_machine_state_num == POWER_SYS_S0)
{
return TRUE;
}
return FALSE;
}
void PowerPreSleepSys(void)
{
// PowerADCDisable(); //<2F>ܽſ<DCBD><C5BF><EFBFBD>
}
//<2F><>ʱ<EFBFBD><EFBFBD><E4B2BB><EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2017-7-21/////////////////////////////////////
/***********************<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>***************************
Function: void PowerUnSleepClearSumSys (void)
Description:
Input:
Return:
Others:
*****************************************************************/
void PowerUnSleepClearSumSys(void)
{
s_power_sleep_sum = 0;
}
/**************************************************
Function: u8 PowerUnSleepSaveDataMsgSys (void)
Description:
Input:
Return:
Others:
*****************************************************************/
u8 PowerUnSleepSaveDataMsgSys(void)
{
return s_power_sleep_flag;
}
/**************************************************
Function: void PowerUnSleepSaveDataClearMsgSys (void)
Description:
Input:
Return:
Others:
*****************************************************************/
void PowerUnSleepSaveDataClearMsgSys(void)
{
s_power_sleep_flag = FALSE;
}
void PowerUnSleepSumAddSys(void)
{
s_power_sleep_sum++;
if (s_power_sleep_sum >= 10)//10min
{
s_power_sleep_sum = 0;
s_power_sleep_flag = TRUE;
}
}
#ifdef __cplusplus
}
#endif