/*
***************************************************************************
* @L_N_GND.c
***************************************************************************
*/
/*
****************************************************************************
* Includes
****************************************************************************
*/
#include "AdcIntf_Cfg.h"
#include "AdcIntf.h"
#include "L_N_GND.h"
#include "L_N_GND_Cfg.h"
#include "CURRENT.h"
#include "math.h"
#include "UartIntf.h"
#include "lpuart_hw_access.h"
#include "lpuart1.h"
typedef struct
{
PRESSURE_TYPE uc_ErrorSt;
UINT8 uc_NG_DebValidCNT;
UINT8 uc_OK_DebValidCNT;
}AC_ST;
static AC_ST st_V_L;
static AC_ST st_V_N;
static UINT16 a_Save_L_Value[VALUE_SUM] = {0u};
static UINT16 a_Save_N_Value[VALUE_SUM] = {0u};
static UINT16 L_RMSValue = 0u;
static UINT16 N_RMSValue = 0u;
static UINT8 acChangeSt = 0u;
static UINT8 acOneMsCnt = 0u;
static UINT8 acOneMsCnt1 = 0u;
static UINT8 acTenMsCnt = 0u;
static UINT16 L_Value_tmp = 0u;
static UINT16 N_Value_tmp = 0u;
static UINT8 AC_Check_fg = 0u;
static UINT8 change_fg = 0u;
void AC_Voltage_INIT(void)
{
st_V_L.uc_ErrorSt = POWER_OK_MODE;
st_V_L.uc_NG_DebValidCNT = 0u;
st_V_L.uc_OK_DebValidCNT = 0u;
st_V_N.uc_ErrorSt = POWER_OK_MODE;
st_V_N.uc_NG_DebValidCNT = 0u;
st_V_N.uc_OK_DebValidCNT = 0u;
L_Value_tmp = 0u;
N_Value_tmp = 0u;
AC_Check_fg = 0u;
change_fg = 0u;
for(UINT8 i = 0u;i <= VALUE_SUM;i++)
{
a_Save_L_Value[i] = 0u;
a_Save_N_Value[i] = 0u;
}
}
void AC_GetADValue(void)/* 1ms Task */
{
#ifdef EUROPEAN_STANDARD
if(acOneMsCnt < 2u)
{
acOneMsCnt++;
}
else
{
acOneMsCnt1 = acOneMsCnt1 % VALUE_SUM;
if(0u == AC_Check_fg)
{
a_Save_L_Value[acOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_V_L_DET_AD);
a_Save_N_Value[acOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_V_N_DET_AD);
}
else
{
a_Save_N_Value[acOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_V_L_DET_AD);
a_Save_L_Value[acOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_V_N_DET_AD);
}
acOneMsCnt1++;
if(change_fg == 0u)
{
if(acOneMsCnt1 < VALUE_SUM)
{
if(a_Save_L_Value[acOneMsCnt1 - 1u] > L_Value_tmp)
{
L_Value_tmp = a_Save_L_Value[acOneMsCnt1 - 1u];
}
if(a_Save_N_Value[acOneMsCnt1 - 1u] > N_Value_tmp)
{
N_Value_tmp = a_Save_N_Value[acOneMsCnt1 - 1u];
}
}
else
{
if(L_Value_tmp < N_Value_tmp)
{
AC_Check_fg = 1u;
}
else
{
AC_Check_fg = 0u;
}
change_fg = 1u;
}
}
}
#else
if(acOneMsCnt < 2u)
{
acOneMsCnt++;
}
else
{
acOneMsCnt1 = acOneMsCnt1 % VALUE_SUM;
a_Save_L_Value[acOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_V_L_DET_AD);
a_Save_N_Value[acOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_V_N_DET_AD);
acOneMsCnt1++;
}
#endif
}
void AC_Voltage_TASK(void)
{
if(acTenMsCnt < 2u)
{
acTenMsCnt++;
}
else
{
acChangeSt ^= 1u;
if(acChangeSt == 0u)
{
L_StatusCheck();
L_ErrorCheck();
}
else
{
N_StatusCheck();
N_ErrorCheck();
}
}
}
void L_StatusCheck(void)
{
UINT32 L_RMSValueTmp = 0u;
UINT16 a_L_VoltValue[VALUE_SUM] = {0u};
UINT16 a_N_VoltValue[VALUE_SUM] = {0u};
for(UINT8 i = 0u;i < VALUE_SUM;i++)
{
a_L_VoltValue[i] = (a_Save_L_Value[i] * AC_ADC_VREF * 100u) / AC_ADC_MAX;//detected Voltage value unit:v
a_N_VoltValue[i] = (a_Save_N_Value[i] * AC_ADC_VREF * 100u) / AC_ADC_MAX;//detected Voltage value unit:v
if(a_L_VoltValue[i] >= a_N_VoltValue[i])
{
a_L_VoltValue[i] = a_L_VoltValue[i] - a_N_VoltValue[i];
}
else
{
a_L_VoltValue[i] = a_N_VoltValue[i] - a_L_VoltValue[i];
}
L_RMSValueTmp = L_RMSValueTmp + (a_L_VoltValue[i] * a_L_VoltValue[i]);
}
L_RMSValueTmp = L_RMSValueTmp * 5u; /* L_RMSValueTmp * 100u / VALUE_SUM; */ /* x² expansion 100 times, RMS expansion 10 times */
//L_RMSValueTmp = L_RMSValueTmp / VALUE_SUM;
L_RMSValue = ((float)sqrt(L_RMSValueTmp)) * 250u / 100u; /* direct = alternating * 0.004*/
}
void N_StatusCheck(void)
{
UINT32 N_RMSValueTmp = 0u;
UINT16 a_N_VoltValue[VALUE_SUM] = {0};
for(UINT8 i = 0u;i < VALUE_SUM;++i)
{
a_N_VoltValue[i] = (a_Save_N_Value[i] * AC_ADC_VREF * 100u) / AC_ADC_MAX;//detected Voltage value unit:v
if(a_N_VoltValue[i] >= VOLT_VREF)
{
a_N_VoltValue[i] = a_N_VoltValue[i] - VOLT_VREF;
}
else
{
a_N_VoltValue[i] = VOLT_VREF - a_N_VoltValue[i];
}
N_RMSValueTmp = N_RMSValueTmp + (a_N_VoltValue[i] * a_N_VoltValue[i]);
}
N_RMSValueTmp = N_RMSValueTmp * 5u;//N_RMSValueTmp * 100u / VALUE_SUM;
//N_RMSValueTmp = N_RMSValueTmp / VALUE_SUM;
N_RMSValue = ((float)sqrt(N_RMSValueTmp)) * 250u / 100u;
}
void L_ErrorCheck(void)
{
switch (st_V_L.uc_ErrorSt)
{
case POWER_OK_MODE:
st_V_L.uc_OK_DebValidCNT = 0u;
if((L_RMSValue >= L_VOLTAGE_MAX_OUT) || (L_RMSValue <= L_VOLTAGE_MIN_OUT))
{
st_V_L.uc_NG_DebValidCNT++;
}
else
{
st_V_L.uc_NG_DebValidCNT = 0u;
}
if(st_V_L.uc_NG_DebValidCNT >= L_N_GND_DEBOUNCE_VALID_NUM)
{
st_V_L.uc_NG_DebValidCNT = 0u;
st_V_L.uc_ErrorSt = POWER_NG_MODE;
}
break;
case POWER_NG_MODE:
st_V_L.uc_NG_DebValidCNT = 0u;
if((L_RMSValue <= L_VOLTAGE_MAX) && (L_RMSValue >= L_VOLTAGE_MIN))
{
st_V_L.uc_OK_DebValidCNT++;
}
else
{
st_V_L.uc_OK_DebValidCNT = 0u;
}
if(st_V_L.uc_OK_DebValidCNT >= L_N_GND_DEBOUNCE_VALID_NUM)
{
st_V_L.uc_OK_DebValidCNT = 0u;
st_V_L.uc_ErrorSt = POWER_OK_MODE;
}
break;
default:
break;
}
}
void N_ErrorCheck(void)
{
switch (st_V_N.uc_ErrorSt)
{
case POWER_OK_MODE:
st_V_N.uc_OK_DebValidCNT = 0u;
if(N_RMSValue >= N_VOLTAGE_MAX_OUT)
{
st_V_N.uc_NG_DebValidCNT++;
}
else
{
st_V_N.uc_NG_DebValidCNT = 0u;
}
if(st_V_N.uc_NG_DebValidCNT >= L_N_GND_DEBOUNCE_VALID_NUM)
{
st_V_N.uc_NG_DebValidCNT = 0u;
st_V_N.uc_ErrorSt = POWER_NG_MODE;
}
break;
case POWER_NG_MODE:
st_V_N.uc_NG_DebValidCNT = 0u;
if(N_RMSValue <= N_VOLTAGE_MAX)
{
st_V_N.uc_OK_DebValidCNT++;
}
else
{
st_V_N.uc_OK_DebValidCNT = 0u;
}
if(st_V_N.uc_OK_DebValidCNT >= L_N_GND_DEBOUNCE_VALID_NUM)
{
st_V_N.uc_OK_DebValidCNT = 0u;
st_V_N.uc_ErrorSt = POWER_OK_MODE;
}
break;
default:
break;
}
#if 0
if(((st_V_N.uc_ErrorSt == POWER_OK_MODE)&&(N_RMSValue >= N_VOLTAGE_MAX_OUT))||\
((st_V_N.uc_ErrorSt == POWER_NG_MODE)&&(N_RMSValue >= N_VOLTAGE_MAX)))
{
st_V_N.uc_NG_DebValidCNT++;
st_V_N.uc_OK_DebValidCNT = 0u;
}
else if(((st_V_N.uc_ErrorSt == POWER_OK_MODE)&&(N_RMSValue <= N_VOLTAGE_MAX_OUT))||\
((st_V_N.uc_ErrorSt == POWER_NG_MODE)&&(N_RMSValue <= N_VOLTAGE_MAX)))
{
st_V_N.uc_OK_DebValidCNT++;
st_V_N.uc_NG_DebValidCNT = 0u;
}
else
{
}
if(st_V_N.uc_NG_DebValidCNT >= L_N_GND_DEBOUNCE_VALID_NUM)
{
st_V_N.uc_NG_DebValidCNT = 0u;
st_V_N.uc_ErrorSt = POWER_NG_MODE;
}
if(st_V_N.uc_OK_DebValidCNT >= L_N_GND_DEBOUNCE_VALID_NUM)
{
st_V_N.uc_OK_DebValidCNT = 0u;
st_V_N.uc_ErrorSt = POWER_OK_MODE;
}
#endif
}
PRESSURE_TYPE Get_L_Voltage_ErrorSt(void)
{
return st_V_L.uc_ErrorSt;
}
UINT16 Get_L_Voltage_Value(void)
{
return L_RMSValue;
}
PRESSURE_TYPE Get_N_Voltage_ErrorSt(void)
{
return st_V_N.uc_ErrorSt;
}
UINT16 Get_N_Voltage_Value(void)
{
return N_RMSValue;
}
220v交流电采集算法
需积分: 5 187 浏览量
2023-12-19
15:58:39
上传
评论
收藏 2KB 7Z 举报
RZ612
- 粉丝: 6
- 资源: 3