#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); }