Files
CHJ/user/Compute/AdjustOffset.c

231 lines
7.2 KiB
C
Raw Permalink Normal View History

2026-03-20 21:16:58 +08:00
#include "../main/SystemInclude.h"
u16 ATypeWiper, CTypeWiper, MaxCTypeWiper, MinCTypeWiper, ATypeRC, actualRC, RRRHRatio;
u16 OffsetHigh, OffsetLow, MEMSRatio;
u16 MaxCTypeWiper, MinCTypeWiper;
u16 actualRC, RRRHRatio;
//==============================================================================
void ComputRRRHRatio(void)
{
float TempF;
//==============================================================================
#ifndef ENABLE_RATIO_HIGH
#pragma message("[undefined] ENABLE_RATIO_HIGH")
#elif(ENABLE_RATIO_HIGH)
TempF = (float)ATYPE_PER_POT;
TempF *= (float)ATypeWiper;
tmpLA = (unsigned long int)TempF;
tmpLA += (unsigned long int)ATYPE_RA;
tmpLA *= 10;
tmpLA /= (unsigned long int)VHH_R56;
RRRHRatio = (unsigned int)tmpLA;
actualRC = ATypeRC*10;
#else
TempF = (float)ATYPE_PER_POT;
TempF *= (float)ATypeWiper;
actualRC = (unsigned int)TempF;
RRRHRatio = ATYPE_ADJUST_RES - actualRC;
actualRC += ATypeRC*10;
RRRHRatio += ATYPE_RA;
tmpLA = (unsigned long int)RRRHRatio;
tmpLA *= 10;
tmpLA /= (unsigned long int)VHH_R56;
RRRHRatio = (unsigned int)tmpLA;
#endif
}
//==============================================================================
void AutoComputeATypeRC(void)
{
#ifndef ENABLE_USE_ATYPE_DCP
#pragma message("[undefined] ENABLE_USE_ATYPE_DCP")
#elif(ENABLE_USE_ATYPE_DCP)
unsigned int lastWiper;
currentMode.Bit.DigitOutput = 0;
lastWiper = ATypeWiper;
if(voltageDetected[NVOL] < 1600)
{
MaxCTypeWiper = ATypeWiper;
ATypeWiper = (ATypeWiper + MinCTypeWiper)>>1;
}
else if(voltageDetected[NVOL] > 1620)
{
MinCTypeWiper = ATypeWiper;
ATypeWiper = (ATypeWiper + MaxCTypeWiper)>>1;
}
if(lastWiper == ATypeWiper)
{
ComputRRRHRatio();
tmpLA = (unsigned long int)voltageDetected[NRH];
tmpLA *= (unsigned long int)RRRHRatio;
tmpLA -= (unsigned long int)actualRC*100;
tmpLA /= voltageDetected[LRH];
voltageDetected[RATO] = (unsigned int)tmpLA;
// compute Wiper step 1
tmpLA *= VHH_R56_X10; // RATO*112
tmpLA -= (unsigned long int)ATYPE_RA; // RATO*112 - 510
tmpLA = (unsigned long int)ATYPE_ADJUST_RES - tmpLA; // 100-(RATO*112 - 510)
// compute NEW RC
actualRC = (unsigned int)(ATYPE_ADJUST_RES - tmpLA);
tmpLB = voltageDetected[NRH] - voltageDetected[LRH];
tmpLB *= voltageDetected[RATO];
actualRC = (unsigned long int)(tmpLB - (unsigned int)actualRC);
// compute Wiper step 2
tmpLA *= 256;
tmpLA /= (unsigned long int)ATYPE_ADJUST_RES;
ATypeWiper = (unsigned int)tmpLA;
//tempL.Word[0] = ATypeWiper;
//ATypeWiper = (unsigned int)WriteShortParameterToEEPROM(ATYPE_WIPER, CTYPE_WIPER_WIDTH);
printf("RO= %5lu\n", (unsigned long int)voltageDetected[RATO]); //
printf("RC= %5lu\n", (unsigned long int)actualRC);
printf("WP= %5lu\n", (unsigned long int)ATypeWiper);
printf("\n\n");
StartDMAForTxdData();
calibType = 0;
return;
}
#endif
}
//==============================================================================
void AdjustOffsetInit(void)
{
//=====================================================================
#ifndef ENABLE_USE_CTYPE_DCP
#pragma message("[undefined] ENABLE_USE_CTYPE_DCP")
#elif(ENABLE_USE_CTYPE_DCP)
CTypeWiper = (u16)ReadParameterFromMemory(CTYPE_WIPER, CTYPE_WIPER_WIDTH, CTYPE_WIPER_DEFAULT);
#endif
//=====================================================================
#ifndef ENABLE_USE_ATYPE_DCP
#pragma message("[undefined] ENABLE_USE_ATYPE_DCP")
#elif(ENABLE_USE_ATYPE_DCP)
ATypeWiper = (u16)ReadParameterFromMemory(ATYPE_WIPER, ATYPE_WIPER_WIDTH, ATYPE_WIPER_DEFAULT);
ATypeRC = (u16)ReadParameterFromMemory(ATYPE_RC, ATYPE_RC_WIDTH, ATYPE_RC_DEFAULT);
MEMSRatio = (u16)ReadParameterFromMemory(MEMS_RATIO, MEMS_RATIO_WIDTH, 0);
ComputRRRHRatio();
#endif
OffsetLow = (u16)ReadParameterFromMemory(OFFSET_00, OFFSET_00_WIDTH, 32768);
OffsetHigh = (u16)ReadParameterFromMemory(OFFSET_50, OFFSET_50_WIDTH, 32768);
}
//==============================================================================
signed int ComputeOffsetDrift(void)
{
tmpSLA = (unsigned long int)voltageDetected[TGAS];
tmpSLA -= (unsigned long int)calibTemperature;
tmpSLB = (unsigned long int)OffsetHigh;
tmpSLB -= (unsigned long int)OffsetLow;
tmpSLA *= tmpSLB;
tmpSLB = (unsigned long int)staticHighTemperature;
tmpSLB -= (unsigned long int)staticLowTemperature;
tmpSLA /= tmpSLB;
return (signed int)tmpSLA;
}
//==============================================================================
signed int ComputeOffsetCorrectValue(unsigned int offsetHigh, unsigned int offsetLow)
{
tmpSLA = (unsigned long int)voltageDetected[TGAS];
tmpSLA -= (unsigned long int)calibTemperature;
tmpSLB = (unsigned long int)offsetHigh;
tmpSLB -= (unsigned long int)offsetLow;
tmpSLA *= tmpSLB;
tmpSLB = (unsigned long int)staticHighTemperature;
tmpSLB -= (unsigned long int)staticLowTemperature;
tmpSLA /= tmpSLB;
return (signed int)tmpSLA;
}
//==============================================================================
void ComputeOffsetDriftInit(void)
{
voltageDetected[TGAS] = calibTemperature;
}
//==============================================================================
void AutoAdjustCTypeWiper(void)
{
unsigned int lastWiper;
//------------------------------------------------------------------------------
#ifndef POT_INC_AND_VALUE_DEC
#pragma message("[undefined] POT_INC_AND_VALUE_DEC")
#elif(POT_INC_AND_VALUE_DEC)
//------------------------------------------------------------------------------
lastWiper = CTypeWiper;
if(voltageDetected[NVDU] > 32788)
{
MinCTypeWiper = CTypeWiper;
CTypeWiper = (CTypeWiper + MaxCTypeWiper)>>1;
}
else if(voltageDetected[NVDU] < 32748)
{
MaxCTypeWiper = CTypeWiper;
CTypeWiper = (CTypeWiper + MinCTypeWiper)>>1;
}
if(lastWiper == CTypeWiper)
{
tempL.Word[0] = CTypeWiper;
CTypeWiper = (unsigned int)WriteShortParameterToEEPROM(CTYPE_WIPER, CTYPE_WIPER_WIDTH);
calibType = 0;
}
//------------------------------------------------------------------------------
#else
//------------------------------------------------------------------------------
lastWiper = CTypeWiper;
if(voltageDetected[VDUX] > 32788)
{
MaxCTypeWiper = CTypeWiper;
CTypeWiper = (CTypeWiper + MinCTypeWiper)>>1;
}
else if(voltageDetected[VDUX] < 32748)
{
MinCTypeWiper = CTypeWiper;
CTypeWiper = (CTypeWiper + MaxCTypeWiper)>>1;
}
if(lastWiper == CTypeWiper)
{
tempL.Word[0] = CTypeWiper;
CTypeWiper = (unsigned int)WriteShortParameterToEEPROM(CTYPE_WIPER, CTYPE_WIPER_WIDTH);
calibType = 0;
}
//------------------------------------------------------------------------------
#endif
//------------------------------------------------------------------------------
}