X2UWaterWmbusEEI/app/UWater_power_app.c

249 lines
6.7 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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; // 初始化,电源电压正常
static u8 s_g_power_machine_state_num = POWER_SYS_S0; // 电源电压检测处理机状态号
static u8 s_power_adc_done = 0; // AD装换结果完成标志
static u32 s_power_adc_result = 0; // AD转换后结果存放
static u8 s_power_reset=0;
u8 s_power_sleep_sum = 0;
u8 s_power_sleep_flag = FALSE; // 电源管理之休眠
u32 temp_value;
/*------------------------------ Function Define -------------------------------------*/
/***********************电池电压检测使能***************************
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; ///< 端口方向配置
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置:关闭开漏,使用推挽输出
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->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; ///< 端口方向配置
stcGpioCfg.enDrv = GpioDrvL; ///< 端口驱动能力配置->低驱动能力
stcGpioCfg.enPu = GpioPuDisable; ///< 端口上下拉配置->无
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable; ///< 端口开漏输出配置:关闭开漏,使用推挽输出
stcGpioCfg.enCtrlMode = GpioAHB; ///< 端口输入/输出值寄存器总线控制模式配置->AHB
Gpio_Init(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, &stcGpioCfg);
Gpio_WriteOutputIO(BAT_CHECK_ENPORT, BAT_CHECK_ENPIN, FALSE);
}
/***********************上电初始化***************************
Function: void PowerManageInitSys(void)
Description:
Input:
Return:
Others:
****************************************************************/
void PowerManageInitSys(void)
{
s_g_voltage_stat = NORMAL_POWER; // 初始化,电源电压正常
s_g_power_machine_state_num = POWER_SYS_S0; // 电源电压检测处理机状态号
RtccSetTimer(RTCC_TIMER_BAT_NUM, 30); //上电30s后检测电池电压
PowerADCDisable();
}
/***********************查询欠压信息***************************
Function: u8 PowerCheckStatusSys(void)
Description: 查询当前电池是否欠压
Input:
Return: LOW_POWER :电池电压低 NORMAL_POWER电压正常
Others:
****************************************************************/
u8 PowerCheckStatusSys (void)
{
return (s_g_voltage_stat);
}
/***********************查询电压值信息***************************
Function: u16 PowerCheckValueSys(void)
Description: 查询当前电池值,采样处的值
Input:
Return: 放大100倍的 u16,16进制
Others:
****************************************************************/
u16 PowerCheckValueSys(void)
{
return ((u16)temp_value);
}
/***********************任务建立接口***************************
Function: void PowerMachineSys (void)
Description: 应用层建立任务接口
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); //存SOE
s_g_voltage_stat = LOW_POWER;
low_power_sum = 0;
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL); //定时12h
}
}
else
{
s_g_voltage_stat = NORMAL_POWER;
low_power_sum = 0;
RtccSetTimer(RTCC_TIMER_BAT_NUM, VOLTAGE_TEST_INTERVAL); //定时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)//法拉电容充电
{
s_power_reset =1;
if(temp_value<360)
{
RtccSetTimer(RTCC_TIMER_BAT_NUM, 10);//10秒后重新测试
}
}
s_g_power_machine_state_num = POWER_SYS_S0;
}
}
break;
default:
break;
}
}
/***********************休眠处理函数***************************
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(); //管脚控制
}
//长时间不休眠处理函数2017-7-21/////////////////////////////////////
/***********************数据清零***************************
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