#include "power_manage.h"
|
#include "adc.h"
|
#include "stdlib.h"
|
#include "low_pwr_test.h"
|
#include "uart.h"
|
#include "sundry.h"
|
#include "extern_rtc.h"
|
#include "lcd.h"
|
#include "system_parameter.h"
|
#include "low_pwr_test.h"
|
#include "gpio.h"
|
#include "gprs.h"
|
#include "master_slave_inter.h"
|
#include "lcd.h"
|
#include "working_time_calculate.h"
|
#include "tim.h"
|
#include "devicegpioinit.h"
|
PWR_VOL_T pwr_vol_g = {LMS_PERIOD, AMS_PERIOD, SET, .lith_vcc_per = 100}; // ĬÈÏÉϵç²É¼¯Ò»´ÎµçÁ¿ºÍMCUζÈ
|
|
uint8_t first_power_get_cnt_g = 0;
|
|
void Power_IO_Init(void)
|
{
|
CMU_PERCLK_SetableEx(PADCLK, ENABLE); // PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
|
OutputIO(LITHIUM_DETECTION_PORT, LITHIUM_DETECTION_PIN, OUT_PUSHPULL);
|
InputtIO(LITHIUM_PWR_DOWN_PORT, LITHIUM_PWR_DOWN_PIN, IN_NORMAL);
|
// InputtIO( LIT_PWR_UNDER_PORT, LIT_PWR_UNDER_PIN, IN_NORMAL);
|
|
// OutputIO(ALKALI_DETECTION_PORT, ALKALI_DETECTION_PIN, OUT_PUSHPULL);
|
InputtIO(ALKALI_PWR_DOWN_PORT, ALKALI_PWR_DOWN_PIN, IN_NORMAL);
|
|
// ALK_DEC_OFF;
|
LIT_DEC_OFF;
|
}
|
|
/******************************************
|
* func: Get_vol_Average
|
* desc:
|
* - sample total 100 data,list data from low to hign,get middle 64 data
|
* - calculation sample mean of 64 middle data
|
* input:
|
* ch - select sample channel of adc1
|
* vref_adc - Voltage reference of adc1 multiply by 1000. eg:3.3v ->33000
|
* output: none
|
* return: calculation sample mean of 64 middle data,multiply by 1000. eg:1.0v -> 1000
|
*****************************************/
|
uint32_t Get_vol_average(ad_data_s *data_p)
|
{
|
u32 i, j, t;
|
uint32_t temp;
|
uint32_t temp_vol = 0;
|
|
for (i = 0; i < data_p->ad_buffer_cnt; i++)
|
{
|
data_p->ad_get_buffer[i] = Get_AdcValue();
|
}
|
|
for (i = 0; i < data_p->ad_buffer_cnt; i++)
|
{
|
for (j = (i + 1); j < data_p->ad_buffer_cnt; j++)
|
if (data_p->ad_get_buffer[j] < data_p->ad_get_buffer[i])
|
{
|
temp = data_p->ad_get_buffer[j];
|
data_p->ad_get_buffer[j] = data_p->ad_get_buffer[i];
|
data_p->ad_get_buffer[i] = temp;
|
}
|
}
|
|
for (t = 1; t < (data_p->ad_buffer_cnt - 1); t++)
|
{
|
temp_vol += data_p->ad_get_buffer[t];
|
}
|
temp_vol = temp_vol / (data_p->ad_buffer_cnt - 2);
|
return temp_vol;
|
}
|
|
/******************************************
|
* func: get_alka_bat_voltage
|
* desc: Get alka ADC data
|
* input: none
|
* output: none
|
* return: none
|
*****************************************/
|
float Get_Alka_Bat_Voltage(void)
|
{
|
uint32_t volt_ret;
|
float sample_vol;
|
float battery_vol = 0;
|
ad_data_s *data_ins;
|
// Alka_Battery_GPIO_Clk_Init();
|
ADC_IN10_Init();
|
ALKA_TEST_ON; // ʹÄܼîµç¼ì²â
|
|
// delay_ms(10);
|
// ÉêÇëÈáÐÔÊý×éÄÚ´æ¿Õ¼ä
|
if ((data_ins = (ad_data_s *)malloc(sizeof(ad_data_s) + sizeof(uint16_t) * Ad_ALKA_BAT_CNT)) != NULL)
|
{
|
data_ins->ad_buffer_cnt = Ad_ALKA_BAT_CNT;
|
data_ins->ad_ch = Ad_ALKA_BAT_CH;
|
volt_ret = Get_vol_average(data_ins);
|
|
sample_vol = (float)volt_ret * 0.001;
|
battery_vol = sample_vol * ALKA_VOL_COE;
|
ALKA_TEST_OFF;
|
/*ÊÍ·ÅÄÚ´æ*/
|
free(data_ins);
|
data_ins = NULL;
|
}
|
ADC_CR_EN_Setable(DISABLE);
|
return battery_vol;
|
}
|
/******************************************
|
* func: get_lith_bat_voltage
|
* desc: Get lith_bat ADC data
|
* input: none
|
* output: none
|
* return: none
|
*****************************************/
|
float Get_Lith_Bat_Voltage(void)
|
{
|
uint32_t volt_ret;
|
float sample_vol;
|
float battery_vol = 0;
|
ad_data_s *data_ins;
|
// Lith_Battery_GPIO_Clk_Init();
|
ADC_IN5_Init();
|
LITH_TEST_ON; // ʹÄÜ﮵ç¼ì²â
|
// delay_ms(10);
|
if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * Ad_LITH_BAT_CNT)) != NULL)
|
{
|
data_ins->ad_buffer_cnt = Ad_LITH_BAT_CNT;
|
data_ins->ad_ch = Ad_LITH_BAT_CH;
|
volt_ret = Get_vol_average(data_ins);
|
sample_vol = (float)volt_ret * 0.001;
|
battery_vol = sample_vol * LITH_VOL_COE;
|
LITH_TEST_OFF;
|
/*ÊÍ·ÅÄÚ´æ*/
|
free(data_ins);
|
data_ins = NULL;
|
}
|
ADC_CR_EN_Setable(DISABLE);
|
return battery_vol;
|
}
|
|
// float Get_PF6_Bat_Voltage(void)
|
//{
|
// uint32_t volt_ret;
|
// float sample_vol;
|
// float battery_vol = 0;
|
// ad_data_s *data_ins;
|
// Lith_Battery_GPIO_Clk_Init();
|
// ADC_IN5_Init();
|
// if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * AD_LITH_PF6_BAT_CNT)) != NULL)
|
// {
|
// data_ins->ad_buffer_cnt = AD_LITH_PF6_BAT_CNT;
|
// data_ins->ad_ch = AD_LITH_PF6_BAT_CH;
|
// volt_ret = Get_vol_average(data_ins);
|
// sample_vol = (float)volt_ret * 0.001;
|
// battery_vol = sample_vol * LITH_PF6_VOL_COE;
|
// /*ÊÍ·ÅÄÚ´æ*/
|
// free(data_ins);
|
// data_ins = NULL;
|
// }
|
// ADC_CR_EN_Setable(DISABLE);
|
// return battery_vol;
|
// }
|
|
float Get_Mcu_Temp(void)
|
{
|
ad_data_s *data_ins_vtem;
|
float temperature;
|
ADC_Temp_Init();
|
|
if ((data_ins_vtem = (ad_data_s *)malloc(sizeof(ad_data_s) + sizeof(uint16_t) * AD_VTEM_CNT)) != NULL)
|
{
|
data_ins_vtem->ad_buffer_cnt = AD_VTEM_CNT;
|
// data_ins_vtem->ad_ch = AD_VTEM_CH; //ûÄñÓÃ
|
temperature = Get_AdcTempValue(); // »ñȡζȵçѹֵ,¿ªÆôζÈADC
|
/*ÊÍ·ÅÄÚ´æ*/
|
free(data_ins_vtem);
|
data_ins_vtem = NULL;
|
}
|
ADC_CR_EN_Setable(DISABLE);
|
return temperature;
|
}
|
/*McuζÈ״̬±¨¾¯´¦Àí*/
|
#define LCD_TEMPERATURE_LOW_VALUE (-15)
|
void Mcu_TempStateAlarmHandler(float mcu_temperature, SYS_TEMP_ALARM_CFG_T *sys_temp_alarm_p)
|
{
|
if (mcu_temperature < sys_temp_alarm_p->cpu_temp_up_scope &&
|
mcu_temperature > sys_temp_alarm_p->cpu_temp_down_scope) // Õý³£ÎÂ¶È cpu_temp_down < mcu_temp_now < cpu_temp_up
|
{
|
__SYS_STATUS_BYTES_STATUS(cpu_temp_up, RESET, AV_CPU_TEMP_UP);
|
__SYS_STATUS_BYTES_STATUS(cpu_temp_down, RESET, AV_CPU_TEMP_DOWN);
|
}
|
else if (mcu_temperature >= sys_temp_alarm_p->cpu_temp_up_scope)
|
__SYS_STATUS_ALARM_BYTES_SET(cpu_temp_up);
|
else if (mcu_temperature <= sys_temp_alarm_p->cpu_temp_down_scope)
|
__SYS_STATUS_ALARM_BYTES_SET(cpu_temp_down);
|
|
if (mcu_temperature <= LCD_TEMPERATURE_LOW_VALUE)
|
__SYS_STATUS_ALARM_BYTES_SET(lcd_temp_low);
|
else
|
__SYS_STATUS_BYTES_STATUS(lcd_temp_low, RESET, AV_LCD_TEMP_LOW);
|
}
|
/*µç³Øµçѹ״̬ÅжÏ*/
|
#define LITH_LOW_EFFECTIVE_VOLTAGE_VALUE (3.2f - 2.9f)
|
void Lith_Bat_Voltage_Status(float lith_vcc, int8_t *pLith_vcc_per)
|
{
|
if (lith_vcc < 3.2f)
|
{
|
if (__SYS_STATUS_BYTES_GET(lith_under) == RESET || __SYS_STATUS_BYTES_GET(lith_remove) == RESET)
|
{
|
*pLith_vcc_per = (float)(lith_vcc - 2.9f) / (float)LITH_LOW_EFFECTIVE_VOLTAGE_VALUE * 20;
|
if (*pLith_vcc_per < 0)
|
*pLith_vcc_per = 1;
|
}
|
}
|
else
|
*pLith_vcc_per = 100;
|
|
if (__SYS_STATUS_BYTES_GET(lith_low) == 0 && lith_vcc < 3.2f) // ﮵çµÍµç״̬×ÖδÖÃλ && ﮵ç < ijµçÁ¿ = ﮵çµÍµç
|
__SYS_STATUS_ALARM_BYTES_SET(lith_low);
|
else if (__SYS_STATUS_BYTES_GET(lith_low) && lith_vcc >= 3.25f)
|
__SYS_STATUS_BYTES_STATUS(lith_low, RESET, AV_LITH_LOW); // Çå³ý﮵çµÍµç״̬
|
|
if (__SYS_STATUS_BYTES_GET(lith_under) == 0 && lith_vcc < 2.9f)
|
{
|
pwr_vol_g.lith_vcc_per = 0;
|
__SYS_STATUS_ALARM_BYTES_SET(lith_under);
|
}
|
else if (__SYS_STATUS_BYTES_GET(lith_under) && lith_vcc >= 2.95f) // ﮵çǷѹÏû³ý
|
__SYS_STATUS_BYTES_STATUS(lith_under, RESET, AV_LITH_UNDER);
|
|
if (__SYS_STATUS_BYTES_GET(lith_remove) && lith_vcc >= 2.5f &&
|
GPIO_ReadInputDataBit(LITHIUM_PWR_DOWN_PORT, LITHIUM_PWR_DOWN_PIN) == Bit_SET) // ﮵çÒÆ³ý/µôµçÏû³ý
|
{
|
__SYS_STATUS_BYTES_STATUS(lith_remove, RESET, AV_LITH_REMOVE);
|
SLAVE_PWR_ON;
|
}
|
}
|
|
void Alka_Bat_Voltage_Status(float alka_vcc)
|
{
|
if (__SYS_STATUS_BYTES_GET(alka_low) == 0 && alka_vcc < 4.85f) // ¼îµçµÍµç
|
__SYS_STATUS_ALARM_BYTES_SET(alka_low);
|
else if (__SYS_STATUS_BYTES_GET(alka_low) && alka_vcc >= 4.95f)
|
{
|
__SYS_STATUS_BYTES_STATUS(alka_low, RESET, AV_ALKA_LOW);
|
}
|
|
if (__SYS_STATUS_BYTES_GET(alka_under) == 0 && alka_vcc < 4.5f) // ¼îµçǷѹ
|
__SYS_STATUS_ALARM_BYTES_SET(alka_under);
|
else if (__SYS_STATUS_BYTES_GET(alka_under) && alka_vcc >= 4.6f)
|
__SYS_STATUS_BYTES_STATUS(alka_under, RESET, AV_ALKA_UNDER);
|
|
if (__SYS_STATUS_BYTES_GET(alka_remove) && alka_vcc >= 3.0f &&
|
GPIO_ReadInputDataBit(ALKALI_PWR_DOWN_PORT, ALKALI_PWR_DOWN_PIN) == Bit_SET) // ¼îµçÒÆ³ý/µôµçÏû³ý
|
__SYS_STATUS_BYTES_STATUS(alka_remove, RESET, AV_ALKA_REMOVE);
|
|
if (GPIO_ReadOutputDataBit(LCD_PWR_GPIO_PORT, LCD_PWR_PIN))
|
LCD_BACKLIGHT_SELECT(__SYS_STATUS_BYTES_GET(alka_low));
|
}
|
|
/*µçÔ´ÖÜÆÚʱ¼äÉèÖÃ*/
|
void Power_PeriodTimeSet(PWR_VOL_T *pwr_vol_p_p, __IO SYS_STATUS_T *sys_state_p)
|
{
|
static uint8_t alka_last_state[3] = {0}, lith_last_state[3] = {0};
|
static uint16_t alka_get_power_period_time_set = 720, lith_get_power_period_time_set = 720;
|
/*¼îµç*/
|
if (alka_last_state[0] != sys_state_p->alka_low) // ¼îµçµÍµç
|
{
|
if (sys_state_p->alka_low)
|
alka_get_power_period_time_set = 360; // 6Сʱ
|
else
|
alka_get_power_period_time_set = 720;
|
alka_last_state[0] = sys_state_p->alka_low;
|
__PERIOD_FIRST_CALC_FLAG_SET(alka_get_power_period);
|
}
|
if (alka_last_state[1] != sys_state_p->alka_under)
|
{
|
if (sys_state_p->alka_under)
|
alka_get_power_period_time_set = 60; // 1Сʱ
|
else
|
alka_get_power_period_time_set = 720;
|
alka_last_state[1] = sys_state_p->alka_under;
|
__PERIOD_FIRST_CALC_FLAG_SET(alka_get_power_period);
|
}
|
if (alka_last_state[2] != sys_state_p->alka_remove)
|
{
|
if (sys_state_p->alka_remove)
|
alka_get_power_period_time_set = 10; // 1/6Сʱ
|
else
|
alka_get_power_period_time_set = 720;
|
alka_last_state[2] = sys_state_p->alka_remove;
|
__PERIOD_FIRST_CALC_FLAG_SET(alka_get_power_period);
|
}
|
/*﮵ç*/
|
if (lith_last_state[0] != sys_state_p->lith_low)
|
{
|
if (sys_state_p->lith_low)
|
lith_get_power_period_time_set = 360; // 6Сʱ
|
else
|
lith_get_power_period_time_set = 720;
|
lith_last_state[0] = sys_state_p->lith_low;
|
__PERIOD_FIRST_CALC_FLAG_SET(lith_get_power_period);
|
}
|
if (lith_last_state[1] != sys_state_p->lith_under)
|
{
|
if (sys_state_p->lith_under)
|
lith_get_power_period_time_set = 60; // 1Сʱ
|
else
|
lith_get_power_period_time_set = 720;
|
lith_last_state[1] = sys_state_p->lith_under;
|
__PERIOD_FIRST_CALC_FLAG_SET(lith_get_power_period);
|
}
|
if (lith_last_state[2] != sys_state_p->lith_remove)
|
{
|
if (sys_state_p->lith_remove)
|
lith_get_power_period_time_set = 10; // 1/6Сʱ
|
else
|
lith_get_power_period_time_set = 720;
|
lith_last_state[2] = sys_state_p->lith_remove;
|
__PERIOD_FIRST_CALC_FLAG_SET(lith_get_power_period);
|
}
|
if (calendar_g.Second == 0x10 &&
|
Func_PeriodStartHandler(0, alka_get_power_period_time_set, &period_para_g.alka_get_power_period.period_flag, &period_para_g.alka_get_power_period.last_time_m, &calendar_g))
|
pwr_vol_p_p->alka_flag = AMS_PERIOD;
|
if (
|
calendar_g.Second == 0x12 &&
|
Func_PeriodStartHandler(0, lith_get_power_period_time_set, &period_para_g.lith_get_power_period.period_flag, &period_para_g.lith_get_power_period.last_time_m, &calendar_g))
|
pwr_vol_p_p->lith_flag = LMS_PERIOD;
|
if (calendar_g.Second == 0x14 &&
|
Func_PeriodStartHandler(0, 30, &period_para_g.mcu_get_temperature_period.period_flag, &period_para_g.mcu_get_temperature_period.last_time_m, &calendar_g))
|
pwr_vol_p_p->mcu_temp_flag = SET;
|
}
|
|
uint8_t sys_bst_flag = 0;
|
void Sys_BST_LithStatus(float lith_vcc)
|
{
|
if (first_power_get_cnt_g >= FIRST_POWER_TIM_MAX)
|
{
|
if (lith_vcc >= 3.2f)
|
{
|
SYS_BST_DIS;
|
sys_bst_flag = 0;
|
}
|
else if (lith_vcc < /*3.1f*/ 3.0f)
|
{
|
SYS_BST_EN;
|
sys_bst_flag = 1;
|
}
|
}
|
}
|
|
/*»ñµÃË«µç³Øµçѹ*/
|
void Get_Double_Bat_Voltage(PWR_VOL_T *pwr_vol_p)
|
{
|
/*Ô¶´«·¢ËÍÖÐ*/
|
if ((gprs_soft_para_g.gprs_state != GPRS_IDLE) && (gprs_soft_para_g.gprs_state != GPRS_RESTART))
|
{
|
if (__SYS_STATUS_BYTES_GET(lith_under) || __SYS_STATUS_BYTES_GET(lith_remove))
|
{
|
__SYS_DELAY_SEC_TIME_SET_(gprs_timeout_para, 0); // ³¬Ê±Ê±¼äÇåÁ㣬²»²úÉú³¬Ê±flag
|
gprs_soft_para_g.gprs_state = GPRS_CLOSE_PWR; // ¹Ø±ÕGPRSµçÔ´
|
__SYS_DELAY_SEC_TIME_SET_(gprs_delay_para, 1);
|
}
|
}
|
/*ÖÜÆÚ²É¼¯µçѹ*/
|
Power_PeriodTimeSet(pwr_vol_p, &sys_admin_g.sys_admin.state_bytes);
|
if (LargeCurrent_LimitingProcess() == 3)
|
{
|
if (pwr_vol_p->alka_flag != AMS_NONE) // ²É¼¯¼îµç
|
{
|
pwr_vol_p->alka_vcc = Get_Alka_Bat_Voltage();
|
sys_realtime_data_g.state_para_s.alka_vcc = pwr_vol_p->alka_vcc * 10;
|
#ifdef RS232_PRINTF
|
printf("alka vcc = %.2f \r\n", pwr_vol_p->alka_vcc);
|
#endif
|
Alka_Bat_Voltage_Status(pwr_vol_p->alka_vcc); // µçÔ´µçÁ¿×´Ì¬ÅжÏ
|
if ((pwr_vol_p->alka_flag == AMS_GPRS_BEFORE) && (pwr_vol_p->alka_vcc >= 4.5f))
|
gprs_soft_para_g.gprs_state = GPRS_OPEN_PWR;
|
else if (pwr_vol_p->alka_flag == AMS_GPRS_BEFORE)
|
sys_mode_conversion_show_g = ERROR_1;
|
pwr_vol_p->alka_flag = AMS_NONE;
|
}
|
if (pwr_vol_p->lith_flag != LMS_NONE) // ²É¼¯ï®µç
|
{
|
pwr_vol_p->lith_vcc = Get_Lith_Bat_Voltage();
|
sys_realtime_data_g.state_para_s.lith_vcc = pwr_vol_p->lith_vcc * 10; // floatÀàÐÍ·Å´óÊ®±¶±ä³Éu8ÀàÐÍ
|
#ifdef RS232_PRINTF
|
printf("lith vcc = %.2f \r\n", pwr_vol_p->lith_vcc);
|
#endif
|
Lith_Bat_Voltage_Status(pwr_vol_p->lith_vcc, &pwr_vol_p->lith_vcc_per); // µçÔ´µçÁ¿×´Ì¬ÅжÏ
|
#ifdef CAL_TEST
|
Sys_BST_LithStatus(pwr_vol_p->lith_vcc);
|
#endif
|
if ((pwr_vol_p->lith_flag == LMS_OPEN_VALVE_BEFORE) && (pwr_vol_p->lith_vcc >= 2.9f))
|
sys_valve_ctl_id_g = V_KEY_OP;
|
else if (pwr_vol_p->lith_flag == LMS_OPEN_VALVE_BEFORE)
|
sys_mode_conversion_show_g = ERROR_1;
|
pwr_vol_p->lith_flag = LMS_NONE;
|
}
|
if (pwr_vol_p->mcu_temp_flag == SET) // ²É¼¯MCUζÈ
|
{
|
pwr_vol_p->mcu_temp_flag = RESET;
|
sys_realtime_data_g.state_para_s.cpu_temperature = pwr_vol_p->mcu_temperature = Get_Mcu_Temp();
|
Mcu_TempStateAlarmHandler(pwr_vol_p->mcu_temperature, &sys_temp_alarm_cfg_g);
|
}
|
}
|
Remaining_WorkingTime_CalculateProcess(pwr_vol_p->lith_vcc_per, pwr_vol_p->lith_vcc);
|
}
|