#include "electricity.h" #include "uart.h" #include "common.h" #include "board_cfg.h" #include "Hlw8110.h" #include "relay.h" #include "ADC.h" static board_t *board = 0; static void read_ele(uint8_t channel); static void check_wanning(uint8_t in_out,uint8_t channel); static void opt_over_func(uint8_t channel); extern float F_AC_V; extern float F_AC_I; extern float F_AC_P; extern float F_AC_LINE_Freq; extern float F_AC_E; extern float F_AC_PF; extern uint8_t flag_value; extern uint32_t adc_Avg_value[ADC_CH_N]; float elec[RelaySlaveChaNum] = {0.0}; void electricity_init(void) { board = get_board(); uart1_config(9600); ch448f_config(); for(int i = 0 ; i < RelaySlaveChaNum;i++) { select_channel(i); Init_HLW8110(); } board->read_ele = read_ele; board->check_wanning = check_wanning; board->opt_overfunc = opt_over_func; } static void read_ele(uint8_t channel) { if(channel < RelaySlaveChaNum) { #if SURPPORT_2_PT if( channel >= PT_SUB_COUNT) { flag_value = 1; }else { flag_value = 0; } #else flag_value = 0; #endif select_channel(channel); Calculate_HLW8110_MeterData(); if(F_AC_V > 20 && F_AC_LINE_Freq < 1.0) { reinit_hlw8110(); Calculate_HLW8110_MeterData(); } if(F_AC_V < 1.0) { F_AC_V = 0.0; F_AC_I = 0.0; F_AC_P = 0.0; F_AC_LINE_Freq = 0.0; F_AC_PF = 0.0; }else if(F_AC_PF < 0.1 || F_AC_PF > 1 || F_AC_P < 1) { F_AC_I = 0.0; F_AC_P = 0.0; F_AC_PF = 0.0; } board->md_data.r_data.ac_ele.ele_info[channel].voltage = F_AC_V * 1000; board->md_data.r_data.ac_ele.ele_info[channel].current = F_AC_I * 1000; board->md_data.r_data.ac_ele.ele_info[channel].power = F_AC_P * 1000; board->md_data.r_data.ac_ele.ele_info[channel].freq = F_AC_LINE_Freq * 1000; board->md_data.r_data.ac_ele.ele_info[channel].factor = F_AC_PF * 1000; elec[channel] += F_AC_E; board->md_data.r_data.ac_ele.ele_info[channel].consumer = board->ele_restore[channel] + (uint32_t)(elec[channel] * 1000); } } static void check_wanning(uint8_t in_out,uint8_t channel) { if(in_out == ELE_INPUT) { }else { if(channel < RelaySlaveChaNum) { if(IS_VOLTAGE_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].voltage > board->md_data.rw_data.thr.th[channel].v_top) { board->md_data.r_data.state.state[channel].v_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].v_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].v_top_wanning = 0; } if(IS_VOLTAGE_MIN_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].voltage < board->md_data.rw_data.thr.th[channel].v_down) { board->md_data.r_data.state.state[channel].v_down_wanning = 1; if(board->md_data.rw_data.over_func[channel].v_min_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].v_down_wanning = 0; } if(IS_CURRENT_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].current > board->md_data.rw_data.thr.th[channel].i_top) { board->md_data.r_data.state.state[channel].c_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].i_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].c_top_wanning = 0; } if(IS_POWER_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].power > board->md_data.rw_data.thr.th[channel].p_top) { board->md_data.r_data.state.state[channel].p_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].p_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].p_top_wanning = 0; } if(IS_CONSUMER_MAX_EN(board->out_wanning_en[channel]) && board->md_data.r_data.ac_ele.ele_info[channel].consumer > board->md_data.rw_data.thr.th[channel].e_top) { board->md_data.r_data.state.state[channel].e_top_wanning = 1; if(board->md_data.rw_data.over_func[channel].c_max_func) { board->over_func[channel] = 1; } }else { board->md_data.r_data.state.state[channel].e_top_wanning = 0; } } } } static void opt_over_func(uint8_t channel) { if(board->over_func[channel]) { board->over_func[channel] = 0; #if SUPPORT_CTRL2_LOCK2 if(channel >= AVALIABLE_RELAY) return; #endif #ifndef SUPPORT_MON if(board->md_data.r_data.state.state[channel].state == RELAY_OPEN) { async_data da = {0}; da.channel = channel; da.fire_or_zero = _FIRE; da.method = PROMPT_CTRL; da.reg = &board->relay_staging_staus[channel]; da.status = RELAY_CLOSE; da.w_eep_flag = FLAG_N_W_EEP; set_relay_sta_async(&da); } #endif } }