Files
CHJ/user/Compute/GasAnalysis.c

177 lines
5.5 KiB
C
Raw Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
static s16 GasAnalysisCNT;
u16 ATypeNode[CURVE_DATA_MAX], ATypeVal[CURVE_DATA_MAX], curveATypeNum;
bool isCurrentGas;
/******************************************************************************/
void GasAnalysisParameterInit(void)
{
2026-03-20 21:19:53 +08:00
airFactor = (u16)ReadShortParameterFromMemory(AIR_FACTOR, AIR_FACTOR_DEFAULT);
factorVth = (u16)ReadShortParameterFromMemory(FACTOR_VTH, 1000);
2026-03-20 21:16:58 +08:00
//------------------------------------------------------------------------------
#ifndef ENABLE_GAS_RECOGNITION_TABLE
#pragma message("[undefined] ENABLE_GAS_RECOGNITION_TABLE")
#elif(ENABLE_GAS_RECOGNITION_TABLE)
ReadVHHCurveFromMemory();
#endif
//------------------------------------------------------------------------------
#ifndef ENABLE_DENSITY_DETECT
#pragma message("[undefined] ENABLE_DENSITY_DETECT")
#elif(ENABLE_DENSITY_DETECT)
2026-03-20 21:19:53 +08:00
// densityFSParameter = (u16)ReadParameterFromMemory(DENSITY_FS_PARA, DENSITY_FS_PARA_WIDTH, DENSITY_FS_PARA_DEFAULT);
2026-03-20 21:16:58 +08:00
#endif
}
/******************************************************************************/
2026-03-20 21:19:53 +08:00
u16 ComputeZeroVHH(void)
2026-03-20 21:16:58 +08:00
{
2026-03-20 21:19:53 +08:00
tmpSLA = (u32)voltageDetected[RRRES];
tmpSLA -= (u32)RRRoom;
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:53 +08:00
tmpSLB = (u32)VHHHigh;
tmpSLB -= (u32)VHHLow;
2026-03-20 21:16:58 +08:00
tmpSLA *= tmpSLB;
2026-03-20 21:19:53 +08:00
tmpSLB = (u32)RRHigh;
tmpSLB -= (u32)RRLow;
2026-03-20 21:16:58 +08:00
tmpSLA /= tmpSLB;
2026-03-20 21:19:53 +08:00
tmpSLA += (u32)VHHRoom;
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:53 +08:00
return (u16)tmpSLA;
2026-03-20 21:16:58 +08:00
}
/******************************************************************************/
bool GasAnasisOneTime(void)
{
2026-03-20 21:19:53 +08:00
s16 valueTemp;
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:53 +08:00
valueTemp = (s16)(voltageDetected[VHPA] - airFactor);
if(abs(valueTemp) < factorVth) return 1;
else return 0;
2026-03-20 21:16:58 +08:00
}
/******************************************************************************/
void GasAnasisCompute(void)//
{
//===========================================================================
voltageDetected[CVHHX] = ComputeZeroVHH();
voltageDetected[DVHHX] = WordSubFunction(voltageDetected[IVHDX], voltageDetected[CVHHX]);
//===========================================================================
#ifndef ENABLE_GAS_RECOGNITION_TABLE
#pragma message("[undefined] ENABLE_GAS_RECOGNITION_TABLE")
#elif(ENABLE_GAS_RECOGNITION_TABLE)
voltageDetected[VHPA] = FindVHHInCalibCurve(voltageDetected[RGIDX]);
#else
2026-03-20 21:19:53 +08:00
voltageDetected[VHPA] = (u16)GetFlowRate(voltageDetected[REG_INDEX], ATYPE_VH);
2026-03-20 21:16:58 +08:00
#endif
voltageDetected[VHPA] = WordSubFunction(voltageDetected[DVHHX], voltageDetected[VHPA]);
voltageDetected[VHPA] = MovingAverage(voltageDetected[VHPA], 5, VHPA);
VHHParameter = voltageDetected[VHPA];
if((VHHParameter < 32780) & (VHHParameter > 32700)) //32700-32780
{
GasAnalysisCNT--;
return;
}
//===========================================================================
if(GasAnasisOneTime()) GasAnalysisCNT--;
else GasAnalysisCNT++;
if(GasAnalysisCNT > 3)
{
systemAlarm.Bit.GasChange = 1; //<2F><><EFBFBD>ʸı<CAB8>
GasAnalysisCNT = 0;
}
else if(GasAnalysisCNT < -3)
{
systemAlarm.Bit.GasChange = 0;
GasAnalysisCNT = 0;
}
}
/******************************************************************************/
void ReadVHHCurveFromMemory(void)
{
2026-03-20 21:19:53 +08:00
u16 I;
2026-03-20 21:16:58 +08:00
2026-03-20 21:19:53 +08:00
curveATypeNum = ReadShortParameterFromMemory(ATYPECURVE_NUM, ATYPECURVE_NUM_DEFAULT);
2026-03-20 21:16:58 +08:00
for(I=0; I<curveATypeNum; I++)
{
ReadMultiByteFromEEPROM(ATYPECURVE_DATA_BASE + I * ATYPECURVE_DATA_WIDTH, tempDev.Byte, ATYPECURVE_DATA_WIDTH, PARA_EEPROM);
if(tempDev.Byte[ATYPECURVE_DATA_CRC] == CRC8(tempDev.Byte, ATYPECURVE_DATA_CRC))
{
tempDev.Byte[ATYPECURVE_DATA_CRC] = 0;
ATypeNode[I] = tempDev.Word[1];
ATypeVal[I] = tempDev.Word[0];
}
else
{
ATypeVal[I] = 0;
ATypeVal[I] = 0;
}
}
}
/******************************************************************************/
2026-03-20 21:19:53 +08:00
u16 FindVHHInCalibCurve(u16 calibIndex)
2026-03-20 21:16:58 +08:00
{
2026-03-20 21:19:53 +08:00
u16 I;
2026-03-20 21:16:58 +08:00
if((curveATypeNum < 3) || (curveATypeNum > CURVE_DATA_MAX))
{
return 0;
}
//----------------------------------------------------------------------------
if(calibIndex > 32767) calibIndex = 0;
//----------------------------------------------------------------------------
for(I = 0; I < curveATypeNum - 1; I++)
{
2026-03-20 21:19:53 +08:00
if(ATypeNode[I] > 32767) continue;
2026-03-20 21:16:58 +08:00
if(ATypeNode[I] > calibIndex) break;
}
//----------------------------------------------------------------------------
if(I == 0) return ATypeVal[0];
//----------------------------------------------------------------------------
Secondary.NodeX = calibIndex;
2026-03-20 21:19:53 +08:00
if(ATypeNode[I] > 32767) Secondary.NodeH = 0;
else Secondary.NodeH = ATypeNode[I];
2026-03-20 21:16:58 +08:00
if(ATypeNode[I-1] > 32767) Secondary.NodeL = 0;
else Secondary.NodeL = ATypeNode[I-1];
Secondary.ValueH = ATypeVal[I];
Secondary.ValueL = ATypeVal[I-1];
return SecondaryCompute();
}
/******************************************************************************/
#ifndef ENABLE_DENSITY_DETECT
#pragma message("[undefined] ENABLE_DENSITY_DETECT")
#elif(ENABLE_DENSITY_DETECT)
void GasDensityCompute(void)
{
Secondary.NodeH = densityFSParameter;
Secondary.NodeL = VHHParameterAir;
Secondary.NodeX = voltageDetected[VHPA];
Secondary.ValueH = DENSITY_FS;
Secondary.ValueL = DENSITY_ZERO;
density = SecondaryCompute();
if(density > Secondary.ValueH) density = Secondary.ValueH;
}
#endif