forked from SZV10X_Software/SZV103_FM33A0xxEV_SiZhu

jinlicong
2024-05-30 a1810b89e66f184c62a0588ae7d57c91d0c376e8
Function/POWER_MANAGE/power_manage.c
@@ -12,22 +12,23 @@
#include "system_mem_para.h"
#include "sizhu_ctrl_word.h"
#include "linked_list.h"
#include "upper_com.h"
PWR_VOL_T pwr_vol_g = {.lith_flag = LMS_PERIOD, .alka_flag = AMS_PERIOD, .mcu_temp_flag = SET,.lith_vcc_per = 100}; // Ä¬ÈÏÉϵç²É¼¯Ò»´ÎµçÁ¿ºÍMCUζÈ
uint8_t first_power_get_cnt_g = 0;
LIMIT_TRIGGER_RECORD_PARA_T limit_trigger_record_para_g;
void Power_IO_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   OutputIO(LITHIUM_DETECTION_PORT,LITHIUM_DETECTION_PIN,OUT_PUSHPULL);
   OutputIO(LITH_DETECTION_PORT,LITH_DETECTION_PIN,OUT_PUSHPULL);
   InputtIO( LITH_PWR_LOSE_PORT, LITH_PWR_LOSE_PIN, IN_NORMAL);
   
   OutputIO(ALKALI_DETECTION_PORT,ALKALI_DETECTION_PIN,OUT_PUSHPULL);
   InputtIO_H(  ALKALI_PWR_LOSE_PIN, IN_NORMAL);
   OutputIO(ALKA_DETECTION_PORT,ALKA_DETECTION_PIN,OUT_PUSHPULL);
   InputtIO_H( ALKA_PWR_LOSE_PIN, IN_NORMAL);
      
   ALK_DEC_OFF;
   LIT_DEC_OFF;
@@ -36,14 +37,17 @@
   OutputIO(EX_PWR_EN_PORT,EX_PWR_EN_PIN,OUT_PUSHPULL);
   BORROW_PWR_OFF;
   EX_PWR_OFF;
   InputtIO( LIMIT_TRIGGER_PORT, LIMIT_TRIGGER_PIN, IN_NORMAL);
}
void Lith_Battery_GPIO_Clk_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   AnalogIO(LIT_ADC_PORT,LIT_ADC_PIN);//ADC_IN4
   OutputIO(LITHIUM_DETECTION_PORT,LITHIUM_DETECTION_PIN,OUT_PUSHPULL);
//   AnalogIO(LIT_PWR_UNDER_PORT,LIT_PWR_UNDER_PIN);//ADC_5
   AnalogIO(LIT_ADC_PORT,LIT_ADC_PIN);//
   GPIOx_ANEN_Setable(LIT_ADC_PORT,LIT_ADC_PIN,ENABLE);
   OutputIO(LITH_DETECTION_PORT,LITH_DETECTION_PIN,OUT_PUSHPULL);
//   AnalogIO(LIT_PWR_UNDER_PORT,LIT_PWR_UNDER_PIN);
   
}
@@ -51,8 +55,23 @@
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   AnalogIO_H(ALK_ADC_PIN);
   OutputIO(ALKALI_DETECTION_PORT,ALKALI_DETECTION_PIN,OUT_PUSHPULL);
//   GPIOx_ANEN_Setable(ALK_ADC_PORT,ALK_ADC_PIN,ENABLE);
   OutputIO(ALKA_DETECTION_PORT,ALKA_DETECTION_PIN,OUT_PUSHPULL);
}
void EX_Pwr_GPIO_Clk_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   InputtIO( HWIDO_EX_PWR_PORT, HWIDO_EX_PWR_PIN, IN_NORMAL);
   OutputIO(EX_PWR_EN_PORT,EX_PWR_EN_PIN,OUT_PUSHPULL);
}
void borrow_Pwr_GPIO_Clk_Init(void)
{
   CMU_PERCLK_SetableEx(PADCLK, ENABLE);  //PADʱÖÓ£¨GPIO£©Ê¹Äܺ¯Êý
   InputtIO( BORROW_PWR_PORT, BORROW_PWR_PIN, IN_NORMAL);
}
/******************************************
 * func:    Get_vol_Average
@@ -109,7 +128,7 @@
  float battery_vol = 0;
  ad_data_s *data_ins;
   Alka_Battery_GPIO_Clk_Init();
   ADC_IN8_Init();
   ADC_IN10_Init();
  ALK_DEC_ON;
  delay_ms(5);
  // ÉêÇëÈáÐÔÊý×éÄÚ´æ¿Õ¼ä
@@ -143,7 +162,7 @@
  float battery_vol = 0;
  ad_data_s *data_ins;
   Lith_Battery_GPIO_Clk_Init();
   ADC_IN4_Init();
   ADC_IN5_Init();
  LIT_DEC_ON;
  delay_ms(5);
  if ((data_ins = (ad_data_s *)malloc(sizeof(data_ins) + sizeof(uint16_t) * AD_LITH_BAT_CNT)) != NULL)
@@ -206,9 +225,11 @@
}
#define   LITH_BAT_VCC_MAX   7.2f
/*µç³Øµçѹ״̬ÅжÏ,״̬ÍùÉϱä¸üÐèÒª´óÓÚãÐÖµ+0.2V£¬·Àֹ״̬ÔÚãÐÖµÉÏÏÂÌø¶¯*/
void Lith_Bat_Voltage_Status(float lith_vcc,PWR_VOL_T *pwr_vol_p)
{
   float fTemp;
   if(lith_vcc < bat_para_g.lith_bat_under_v*0.1){
      pwr_vol_p->lith_vcc_status = BAT_V_DOWN;
   }else if(lith_vcc < bat_para_g.lith_bat_under_v*0.1 + 0.2){
@@ -228,9 +249,41 @@
   }else{
      pwr_vol_p->lith_vcc_status = BAT_V_NONE;
   }
   /*****¸ù¾Ýµçѹֵ¼ÆËã°Ù·Ö±È£¬Âúµç°´LITH_BAT_VCC_MAXËã***/
   if(pwr_vol_p->lith_vcc_status == BAT_V_DOWN){
      pwr_vol_p->lith_vcc_per = 0;
   }else if(pwr_vol_p->lith_vcc_status == BAT_V_LOW){
      if(bat_para_g.lith_bat_low_v > bat_para_g.lith_bat_under_v){
         fTemp = BAT_PERSENT_LEVEL_1*(lith_vcc - bat_para_g.lith_bat_low_v*0.1) /(0.1*(bat_para_g.lith_bat_low_v - bat_para_g.lith_bat_under_v));
         if(fTemp > 20.0)
            fTemp = 20;
         else if(fTemp <0)
            fTemp = 0;
         pwr_vol_p->lith_vcc_per = fTemp;
      }else
      {
         pwr_vol_p->lith_vcc_per = 0;
      }
   }else
   {
      if(LITH_BAT_VCC_MAX>bat_para_g.lith_bat_low_v*0.1){
         fTemp = (100-BAT_PERSENT_LEVEL_1)*(lith_vcc - bat_para_g.lith_bat_low_v*0.1) /(LITH_BAT_VCC_MAX - bat_para_g.lith_bat_low_v*0.1);
         if(fTemp > 80.0)
            fTemp = 80;
         else if(fTemp <0.0)
            fTemp = 0.0;
         pwr_vol_p->lith_vcc_per = fTemp + 20.0;
      }else{
         pwr_vol_p->lith_vcc_per = 20;
      }
   }
    
}
#define   ALKA_BAT_VCC_MAX   6.4f
void Alka_Bat_Voltage_Status(float alka_vcc,PWR_VOL_T *pwr_vol_p)
{
   float fTemp;
@@ -254,15 +307,33 @@
      pwr_vol_p->alka_vcc_status = BAT_V_NONE;
   }
   
   /*****¸ù¾Ýµçѹֵ¼ÆËã°Ù·Ö±È£¬Âúµç°´ALKA_BAT_VCC_MAXËã***/
   if(pwr_vol_p->alka_vcc_status == BAT_V_DOWN){
      pwr_vol_p->lith_vcc_per = 0;
      pwr_vol_p->alka_vcc_per = 0;
   }else if(pwr_vol_p->alka_vcc_status == BAT_V_LOW){
      if(bat_para_g.alka_bat_low_v > bat_para_g.alka_bat_under_v){
         fTemp = BAT_PERSENT_LEVEL_1*(alka_vcc - bat_para_g.alka_bat_low_v*0.1) /(0.1*(bat_para_g.alka_bat_low_v - bat_para_g.alka_bat_under_v));
         if
         if(fTemp > 20.0)
            fTemp = 20;
         else if(fTemp <0)
            fTemp = 0;
         pwr_vol_p->alka_vcc_per = fTemp;
      }else
      {
         pwr_vol_p->lith_vcc_per = 0;
         pwr_vol_p->alka_vcc_per = 0;
      }
   }else
   {
      if(ALKA_BAT_VCC_MAX>bat_para_g.alka_bat_low_v*0.1){
         fTemp = (100-BAT_PERSENT_LEVEL_1)*(alka_vcc - bat_para_g.alka_bat_low_v*0.1) /(ALKA_BAT_VCC_MAX - bat_para_g.alka_bat_low_v*0.1);
         if(fTemp > 80.0)
            fTemp = 80;
         else if(fTemp <0.0)
            fTemp = 0.0;
         pwr_vol_p->alka_vcc_per = fTemp + 20.0;
      }else{
         pwr_vol_p->alka_vcc_per = 20;
      }
      
   }
@@ -283,15 +354,15 @@
   if(bat_para_p->lith_bat_used_sec >=3600){
      bat_para_p->lith_bat_used_sec = 0;
      
      bat_para_p->lith_bat_used_hour ++;
      if(bat_para_p->lith_bat_used_hour < 87600) //24Сʱ*365Ìì*10Äê
         bat_para_p->lith_bat_used_hour ++;
      //? ´æ´¢£¬Ôݶ¨Ã¿Ð¡Ê±´æ´¢Ò»´Î
   }
   
}
#define   EX_PWR_CONTINUE_TIME   5     //Íâµç³ÖÐøÊ±¼ä£¬³ÖÐøXÃëËãÓÐЧ
/*»ñµÃµçԴ״̬¡£ï®µç¡¢¼îµç¡¢Íâµç¡¢MCUζÈ*/
void GetPwrStatusPro(PWR_VOL_T *pwr_vol_p)
{
@@ -315,6 +386,25 @@
   if((sys_clockBCD_g.min == 57)&&(sys_clockBCD_g.sec == 58))
      pwr_vol_p->mcu_temp_flag = SET;
   
   //﮵çµôµçÈ·ÈÏ
   if(pwr_vol_p->lith_lose_check_flag == SET){
      pwr_vol_p->lith_lose_check_flag = RESET;
      if(LITH_PWR_LOSE_IO_READ == Bit_RESET){
         //È·ÈÏ﮵çµôµç
         __SYS_STATUS_ALARM_BYTES_SET(lith_remove,ALARM_ID_LITH_BAT_REMOVAL); //?﮵çµôµçÖ®ºóÐèҪһЩ½ô¼±´¦Àí£¬±ÈÈçʵʱÊý¾ÝÁ¢Âí´æ´¢Ò»´Î
      }
   }
   //¼îµçµôµçÈ·ÈÏ
   if(pwr_vol_p->alka_lose_check_flag == SET){
      pwr_vol_p->alka_lose_check_flag = RESET;
      if(ALKA_PWR_LOSE_IO_READ == Bit_RESET){
         //È·ÈÏ﮵çµôµç
         __SYS_STATUS_ALARM_BYTES_SET(alka_remove,ALARM_ID_ALKA_BAT_REMOVAL);
      }
   }
   
   if(pwr_vol_p->lith_flag != LMS_NONE ){
      pwr_vol_p->lith_flag = LMS_NONE;
@@ -322,8 +412,8 @@
      Lith_Bat_Voltage_Status(pwr_vol_p->lith_vcc,pwr_vol_p);
   }
   
   if((pwr_vol_p->alka_flag != LMS_NONE)&&(delay_time_cnt >= DELAY_TIME) ){
      pwr_vol_p->alka_flag = AMS_PERIOD;
   if((pwr_vol_p->alka_flag != AMS_NONE)&&(delay_time_cnt >= DELAY_TIME) ){
      pwr_vol_p->alka_flag = AMS_NONE;
      pwr_vol_p->alka_vcc = Get_Alka_Bat_Voltage();//¼îµç¼ì²â
      Alka_Bat_Voltage_Status(pwr_vol_p->alka_vcc,pwr_vol_p);
   } 
@@ -336,13 +426,118 @@
   
   
   /*µç³ØÊ¹ÓÃʱ¼ä¼ÆË㣬ÔÙ¸ù¾Ýµçѹ״̬ºÍʹÓÃʱ¼ä״̬×ۺϵóö×îÖÕµÄµç³Ø×´Ì¬*/
   /*﮵çµçѹǷѹ£¬ÔòºÏ³ÉǷѹ£¬°Ù·Ö±È0£»ï®µçµçѹµÍµç£¬ÔòºÏ³ÉµÍµç£¬°Ù·Ö±È°´µçѹֵÏÔʾ0-20£» ·ñÔò£¬ºÏ³É=ʹÓÃʱ¼äÊ£Ó࣬ºÏ³ÉСÓÚ20ÅжÏΪµÍµç£¬20-100ΪÕý³£*/
   if(__SYS_STATUS_BYTES_GET(power_state) ==RESET)
      LithBatUseTimeCalculate(&bat_para_g);
   
   if(bat_para_g.lith_bat_used_hour >= bat_para_g.lith_bat_max_hour){
      pwr_vol_p->lith_remain_use_time_per = 0;
   }else{
      pwr_vol_p->lith_remain_use_time_per = 100*(bat_para_g.lith_bat_max_hour - bat_para_g.lith_bat_used_hour)/bat_para_g.lith_bat_max_hour;
   }
   
   /****Íâµçʵʱ¼à²â******/
   if(pwr_vol_p->lith_vcc_status == BAT_V_DOWN){
      __SYS_STATUS_ALARM_BYTES_SET(lith_down, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_ALARM_BYTES_SET(lith_low, ALARM_ID_LITH_BAT_LOW);
      pwr_vol_p->lith_synthesize_per = 0;
   }else if(pwr_vol_p->lith_vcc_status == BAT_V_LOW){
      __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
      __SYS_STATUS_ALARM_BYTES_SET(lith_low, ALARM_ID_LITH_BAT_LOW);
      pwr_vol_p->lith_synthesize_per = pwr_vol_p->alka_vcc_per;
   }else{
      pwr_vol_p->lith_synthesize_per = (pwr_vol_p->lith_remain_use_time_per ==100)? 100:pwr_vol_p->lith_remain_use_time_per + 1;  //ΪÁË100%Äܹ»Î¬³ÖÒ»¶Îʱ¼ä£¬µçѹÕý³£×´Ì¬Ê±°Ù·Ö±È²»ÄÜΪ0£¬Îª0¾ÍÒªÏÔʾ¿ÕÁË£¬±£³Ö1¸ñÖÁµçѹ״̬±äΪǷѹ
      if(pwr_vol_p->lith_synthesize_per < 20){
         __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
         __SYS_STATUS_ALARM_BYTES_SET(lith_low, ALARM_ID_LITH_BAT_LOW);
      }else{
         __SYS_STATUS_BYTES_STATUS(lith_down, RESET, ALARM_ID_LITH_BAT_DOWN);
         __SYS_STATUS_BYTES_STATUS(lith_low, RESET, ALARM_ID_LITH_BAT_LOW);
      }
   }
   /*¼îµç³Ø¿ÉÄܸù¾ÝʹÓôÎÊý£¬¶ø²»ÊÇʱ¼ä£¬×îÖÕ״̬ÅжϷ½Ê½´ý¶¨£¿ÔÝʱ»¹Ö»ÊǸù¾Ýµçѹֵ*/
   if(pwr_vol_p->alka_vcc_status == BAT_V_DOWN){
      __SYS_STATUS_ALARM_BYTES_SET(alka_down, ALARM_ID_ALKA_BAT_DOWN);
      __SYS_STATUS_ALARM_BYTES_SET(alka_low, ALARM_ID_ALKA_BAT_LOW);
   }else if(pwr_vol_p->alka_vcc_status == BAT_V_LOW){
      __SYS_STATUS_BYTES_STATUS(alka_down, RESET, ALARM_ID_ALKA_BAT_DOWN);
      __SYS_STATUS_ALARM_BYTES_SET(alka_low, ALARM_ID_ALKA_BAT_LOW);
   }else{
      __SYS_STATUS_BYTES_STATUS(alka_down, RESET, ALARM_ID_ALKA_BAT_DOWN);
      __SYS_STATUS_BYTES_STATUS(alka_low, RESET, ALARM_ID_ALKA_BAT_LOW);
   }
   /****Íâµçʵʱ¼à²â,Íâµç½ÓÈëÑÓ³Ù£¬ÍâµçÒÆ³ýҪ˲¼äÇл»»Øµç³Ø¹©µç******/
   EX_Pwr_GPIO_Clk_Init();
   if(HWIDO_EX_PWR_IO_READ == Bit_RESET){
      if((pwr_vol_p->ex_pwr_out_cnt!=0)&&(pwr_vol_p->ex_pwr_out_cnt!=EX_PWR_CONTINUE_TIME)){
         //³ÖÐøÖÐ;״̬¸Ä±ä£¬¿ÉÄÜ´ú±íÍâµç²»Îȶ¨£¬Æµ·±³öÏÖÔò±¨¾¯
      }
      pwr_vol_p->ex_pwr_out_cnt = 0;
      if(pwr_vol_p->ex_pwr_in_cnt < EX_PWR_CONTINUE_TIME )
         pwr_vol_p->ex_pwr_in_cnt++;
      if(pwr_vol_p->ex_pwr_in_cnt >=EX_PWR_CONTINUE_TIME){
         if(__SYS_STATUS_BYTES_GET(power_state) != SET){
            EX_PWR_ON;
            __SYS_STATUS_BYTES_STATUS(power_state, SET, ALARM_ID_NORMAL); //¸Ã״̬²»²ÎÓ뱨¾¯ÏÔʾ
            //Íâµç½ÓÈëÖ®ºó´ò¿ªÍâµçÒÆ³ýÖжϣ¬ÍâµçÒÆ³ýÒªÁ¢¼´Çл»µç³Ø¹©µç
            GPIO_EXTI_Init( HWIDO_EX_PWR_PORT, HWIDO_EX_PWR_PIN, EXTI_RISING, ENABLE);
            up_comm_uart_enable();//ÍâµçʱʹÄÜÉÏλ»ú´®¿Ú
            lcd_first_wake_up_flag_g = SET;  //Íâµç½ÓÈëµãÁÁÆÁÄ»²¢±£³Ö³£ÁÁ
            //?Ìí¼ÓÍâµç±ä»¯±¨¾¯£¬Íâµç±¨¾¯ÌØÊâ´¦Àí£¬½ÓÈëÖ»±¨¾¯£¬²»·§¿Ø£¬²»ÏÔʾ±¨¾¯Âë
            if(__SYS_ALARM_CTL_BYTES_GET(power_state)){
               if(__SYS_ALARM_REPORT_CTL_BYTES_GET(power_state) ==SET){
                  if(AlarmCntIncrease(ALARM_ID_EX_POWER_STATUS_CHANGE) ==SET){
                     system_alarm_word_g.alarm_word.power_state = SET;
                     AlarmTriggerWrcFlag = SET;
                  }
               }
            }
         }
      }
   }else
   {
      GPIO_EXTI_Init( HWIDO_EX_PWR_PORT, HWIDO_EX_PWR_PIN, EXTI_RISING, DISABLE);
      EX_PWR_OFF;
      //?Ìí¼ÓÍâµç±ä»¯±¨¾¯£¬Íâµç±¨¾¯ÌØÊâ´¦Àí£¬ÒÆ³ý±¨¾¯£¬²ÎÓë·§¿Ø£¬²»ÏÔʾ±¨¾¯Âë
      if(__SYS_STATUS_BYTES_GET(power_state) ==SET){
         __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);//¸Ã״̬²»²ÎÓ뱨¾¯ÏÔʾ
         if(__SYS_ALARM_CTL_BYTES_GET(power_state)){
               system_alarm_word_for_valve_g.alarm_word.power_state = SET;  //ÍâµçÒÆ³ý±¨¾¯Òª´¥·¢·§¿Ø
               if(__SYS_ALARM_REPORT_CTL_BYTES_GET(power_state) ==SET){
                  if(AlarmCntIncrease(ALARM_ID_EX_POWER_STATUS_CHANGE) ==SET){
                     system_alarm_word_g.alarm_word.power_state = SET;
                     AlarmTriggerWrcFlag = SET;
                  }
               }
            }
      }
      //ÍâµçÒÆ³ýºó´®¿Ú½ûÖ¹£¬Ò²¿ÉÒÔÔÚÐÝÃßǰ½ûÖ¹
//      if((pwr_vol_p->ex_pwr_in_cnt!=0)&&(pwr_vol_p->ex_pwr_in_cnt!=EX_PWR_CONTINUE_TIME)){
//         //³ÖÐøÖÐ;״̬¸Ä±ä£¬¿ÉÄÜ´ú±íÍâµç²»Îȶ¨£¬Æµ·±³öÏÖÔò±¨¾¯
//      }
//      pwr_vol_p->ex_pwr_in_cnt = 0;
//      if(pwr_vol_p->ex_pwr_out_cnt < EX_PWR_CONTINUE_TIME )
//         pwr_vol_p->ex_pwr_out_cnt++;
//
//      if(pwr_vol_p->ex_pwr_out_cnt >=EX_PWR_CONTINUE_TIME){
//         if(__SYS_STATUS_BYTES_GET(power_state) != RESET){
//            EX_PWR_OFF;
//            __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);
//         }
//      }
   }
}
@@ -374,16 +569,24 @@
   }
   
   //Íâµç¼ì²â,HWID0µÍλÓÐÍâµç
   EX_Pwr_GPIO_Clk_Init();
   if(HWIDO_EX_PWR_IO_READ == Bit_RESET){
      delay_ms(10);
      if(HWIDO_EX_PWR_IO_READ == Bit_RESET){
         EX_PWR_ON;
         __SYS_STATUS_BYTES_STATUS(power_state, SET, ALARM_ID_NORMAL);
      //Íâµç½ÓÈëÖ®ºó´ò¿ªÍâµçÒÆ³ýÖжϣ¬ÍâµçÒÆ³ýÒªÁ¢¼´Çл»µç³Ø¹©µç
         GPIO_EXTI_Init( HWIDO_EX_PWR_PORT, HWIDO_EX_PWR_PIN, EXTI_RISING, ENABLE);
         up_comm_uart_enable();//ÍâµçʱʹÄÜÉÏλ»ú´®¿Ú
      }else{
         EX_PWR_OFF;
      __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);
      }
   }else{
      EX_PWR_OFF;
      __SYS_STATUS_BYTES_STATUS(power_state, RESET, ALARM_ID_NORMAL);
   }
   
   
}
}