Knowledge Base Nr: 00243 analognorm.cpp - http://www.swe-kaiser.de

cpp: analogwerte normieren

  
/*
analogwerte können über folgendes verfahren normiert werden:
dazu werden 2 punkte der kennlinie spezifiziert (mindestwert und oberwert)
diesen wird jeweils ein wert des ad-wandlers (16 oder 32 bit) und der
entsprechende analog-gleitpunktwert zugeordnet.
für einen dazwischenliegenden wert des ad-wandlers wird der entsprechende
analog-gleitpunktwert berechnet.
*/

struct SCALESTRUCT
{
int nP1; //punkt1: dezimalwert
float fP1; // gleitpunktwert
int nP2; //punkt2: dezimalwert
float fP2; // gleitpunktwert
} g_scale = { 30, 0.0, 12345, 33.3};
// beispiel: ad-wandlergrenze von 30 bis 12345 entsprechen analogwerte von 0.0 bis 33.3

....

int nData = 1234;
float fData = 0.0;

int nErr = doNormalize(nData, nValue, &fData);
if (nErr)
printf("ERROR: Normieren: Out of Range (%s)!\n", (nErr<0) ? "too small" : "too big");
else
printf("Normieren: %d=%g\n", nData, fData);

....

int doNormalize(int nDezValue, float* pfValue)
{
*pfValue = 0.0;

if (nDezValue < g_scale.nP1)
{
LOG("WARNING: Wert 'Out of Range' addr:%d value:%d<P1:%d!", nAddr, nDezValue, g_scale.nP1);
return -1;
}
if (nDezValue > g_scale.nP2)
{
LOG("WARNING: Wert 'Out of Range' addr:%d value:%d>P2:%d!", nAddr, nDezValue, g_scale.nP2);
return +1;
}

//convert/scale/normalize dez to float
double fVperBit = (g_scale.fP2 - g_scale.fP1) / (g_scale.nP2 - g_scale.nP1);
int nValue = nDezValue - g_scale.nP1;
*pfValue = (nValue * fVperBit) + g_scale.fP1;

TRACE("doNormalize(%d, %d) => %f", nAddr, nDezValue, *pfValue);
return 0;
}