/*!
***************************************************************************
* @file CURRENT.c
* @brief This module implements input signals acquisition.
***************************************************************************
* @author liang008
* @version 0.1.0.0
* @date 07.06.2018
*
* @customer{ <Customer> }
* @project{ <Project> }
* @processor{ Any }
* @compiler{ Any }
* @copyright
*
* @history
* @revision{ 0.1.0.0 , 07.06.2018, liang008, Initial revision }
* @endhistory
***************************************************************************
*/
/*
****************************************************************************
* Includes
****************************************************************************
*/
#include "AdcIntf_Cfg.h"
#include "AdcIntf.h"
#include "CURRENT.h"
#include "CURRENT_Cfg.h"
#include "L_N_GND.h"
#include "math.h"
#include "UartIntf.h"
#include "lpuart_hw_access.h"
#include "lpuart1.h"
/*
****************************************************************************
* Internal types definition
****************************************************************************
*/
typedef struct
{
UINT16 uc_ADValue;
CURRENT_TYPE uc_ErrorSt;
UINT8 uc_NormalDebValidCnt;
UINT8 uc_HighDebValidCnt;
UINT8 uc_OverDebValidCnt;
}CURRENT_ST;
static CURRENT_ST st_CURRENT;
static UINT32 a_currentValue[CURRENT_SUM] = {0u};
static UINT16 a_save_CURRENT_ADValue[CURRENT_SUM] = {0u};
static UINT16 rmsCurrent = 0u;
static UINT8 currentOneMsCnt = 0u;
static UINT8 currentOneMsCnt1 = 0u;
static UINT8 currentTenMsCnt = 0u;
void Current_GetADValue(void) /* 1ms Task */
{
if(currentOneMsCnt < 2u)
{
currentOneMsCnt++;
}
else
{
currentOneMsCnt1 = currentOneMsCnt1 % CURRENT_SUM;
a_save_CURRENT_ADValue[currentOneMsCnt1] = AdcIntf_ReadChnResult(AdcIntf_Get_CURRENT_DET_AD);
currentOneMsCnt1++;
}
}
void CURRENT_Init(void)
{
st_CURRENT.uc_ADValue = 0u;
st_CURRENT.uc_ErrorSt = e_Current_normal;
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
void CURRENT_TASK(void)
{
if(currentTenMsCnt < 1u)
{
currentTenMsCnt++;
}
else
{
Current_StatusCheck();
Current_ErrorCheck();
}
}
void Current_StatusCheck(void)
{
UINT32 rmsCurrentTmp = 0u;
UINT16 Current_VoltValue[CURRENT_SUM] = {0};
for(UINT8 i = 0u;i < CURRENT_SUM;i++)
{
Current_VoltValue[i] = (a_save_CURRENT_ADValue[i] * CURRENT_ADC_VREF * 100u) / CURRENT_ADC_MAX;//voltage expansion 10 times unit:mv
if(Current_VoltValue[i] > CURRENT_VOLT_VREF)
{
Current_VoltValue[i] = Current_VoltValue[i] - CURRENT_VOLT_VREF;
}
else
{
Current_VoltValue[i] = CURRENT_VOLT_VREF - Current_VoltValue[i];
}
a_currentValue[i] = Current_VoltValue[i] * 10u / CURRENT_STANDARD; //detected current value unit:A 50mv/A
rmsCurrentTmp = rmsCurrentTmp + (a_currentValue[i] * a_currentValue[i]);
}
rmsCurrentTmp = rmsCurrentTmp * 5u; /* rmsCurrentTmp * 100u / CURRENT_SUM; */
//rmsCurrentTmp = rmsCurrentTmp / CURRENT_SUM;
rmsCurrent = ((float)sqrt(rmsCurrentTmp));
}
void Current_ErrorCheck(void)
{
switch (st_CURRENT.uc_ErrorSt)
{
case e_Current_normal:
if((rmsCurrent > CURRENT_NORMAL_OUT) && (rmsCurrent <= CURRENT_HIGH))
{
st_CURRENT.uc_HighDebValidCnt++;
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
else if(rmsCurrent > CURRENT_HIGH)
{
st_CURRENT.uc_OverDebValidCnt++;
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_HighDebValidCnt = 0u;
}
else
{
st_CURRENT.uc_NormalDebValidCnt++;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
break;
case e_Current_high:
if(rmsCurrent <= CURRENT_NORMAL)
{
st_CURRENT.uc_NormalDebValidCnt++;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
else if(rmsCurrent >= CURRENT_HIGH_OUT)
{
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt++;
}
else
{
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
break;
case e_Current_over:
if((rmsCurrent <= CURRENT_HIGH) && (rmsCurrent > CURRENT_NORMAL))
{
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_HighDebValidCnt++;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
else if(rmsCurrent <= CURRENT_NORMAL)
{
st_CURRENT.uc_NormalDebValidCnt++;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
else
{
st_CURRENT.uc_NormalDebValidCnt = 0u;
st_CURRENT.uc_HighDebValidCnt = 0u;
st_CURRENT.uc_OverDebValidCnt = 0u;
}
break;
default:
break;
}
if(CURRENT_DEBOUNCE_VALID_NUM == st_CURRENT.uc_NormalDebValidCnt)
{
st_CURRENT.uc_ErrorSt = e_Current_normal;
}
if(CURRENT_DEBOUNCE_VALID_NUM == st_CURRENT.uc_HighDebValidCnt)
{
st_CURRENT.uc_ErrorSt = e_Current_high;
}
if(CURRENT_DEBOUNCE_VALID_NUM == st_CURRENT.uc_OverDebValidCnt)
{
st_CURRENT.uc_ErrorSt = e_Current_over;
}
}
CURRENT_TYPE Get_CURRENT_ErrorSt(void)
{
return st_CURRENT.uc_ErrorSt;
}
UINT16 Get_CurrentValue(void)
{
return rmsCurrent;
}