Files
CHJ/user/Compute/GasAnalysis.c
2026-03-20 21:19:04 +08:00

177 lines
5.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "../main/SystemInclude.h"
static s16 GasAnalysisCNT;
u16 ATypeNode[CURVE_DATA_MAX], ATypeVal[CURVE_DATA_MAX], curveATypeNum;
bool isCurrentGas;
/******************************************************************************/
void GasAnalysisParameterInit(void)
{
VHHParameterAir = (u16)ReadParameterFromMemory(VHH_AIR_PARA, VHH_AIR_PARA_WIDTH, RH_PARA_DEFAULT);
VHHParameterScale = (u16)ReadParameterFromMemory(VHH_PARA_SCALE, VHH_PARA_SCALE_WIDTH, 1000);
//------------------------------------------------------------------------------
#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)
densityFSParameter = (u16)ReadParameterFromMemory(DENSITY_FS_PARA, DENSITY_FS_PARA_WIDTH, DENSITY_FS_PARA_DEFAULT);
#endif
}
/******************************************************************************/
unsigned int ComputeZeroVHH(void)
{
tmpSLA = (unsigned long int)voltageDetected[RRRES];
tmpSLA -= (unsigned long int)NRHRoom;
tmpSLB = (unsigned long int)VHHHigh;
tmpSLB -= (unsigned long int)VHHLow;
tmpSLA *= tmpSLB;
tmpSLB = (unsigned long int)NRHHigh;
tmpSLB -= (unsigned long int)NRHLow;
tmpSLA /= tmpSLB;
tmpSLA += (unsigned long int)VHHRoom;
return (unsigned int)tmpSLA;
}
/******************************************************************************/
bool GasAnasisOneTime(void)
{
signed int valueTemp;
valueTemp = (signed int)(voltageDetected[VHPA] - VHHParameterAir);
if(abs(valueTemp) < VHHParameterScale) return 1;
else return 0;
}
/******************************************************************************/
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
voltageDetected[VHPA] = (unsigned int)GetFlowRate(voltageDetected[REG_INDEX], ATYPE_VH);
#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)
{
unsigned int I;
curveATypeNum = (unsigned int)ReadParameterFromMemory(ATYPECURVE_NUM, ATYPECURVE_NUM_WIDTH, ATYPECURVE_NUM_DEFAULT);
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;
}
}
}
/******************************************************************************/
unsigned int FindVHHInCalibCurve(unsigned int calibIndex)
{
unsigned int I;
if((curveATypeNum < 3) || (curveATypeNum > CURVE_DATA_MAX))
{
return 0;
}
//----------------------------------------------------------------------------
if(calibIndex > 32767) calibIndex = 0;
//----------------------------------------------------------------------------
for(I = 0; I < curveATypeNum - 1; I++)
{
if(ATypeNode[I] > 32767) continue;
if(ATypeNode[I] > calibIndex) break;
}
//----------------------------------------------------------------------------
if(I == 0) return ATypeVal[0];
//----------------------------------------------------------------------------
Secondary.NodeX = calibIndex;
if(ATypeNode[I] > 32767) Secondary.NodeH = 0;
else Secondary.NodeH = ATypeNode[I];
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