Puoi usare una super media, leggi 85 volte i tre sensori + 1 volta uno a caso e ottinei 256 letture che vanno sommate tra di loro, shifti a destra di 8 volte e sommi uno al volore ottenuto, cosi hai una bassisima media di errore.
questo è un codice che simula un adc che cresce di valori casuali e ritorna un valore letto tramite la funzione di gaus.
Leggendo 256 volte l'adc e ricavata la media + 1 allora si ottengono basse percentuali di errori, 0.0001% con errore a 1 e 25% con errore a 5:
#define DELTA 12
#define ERR 1
#define COUNT 10000
int val;
int adcRead(int teoricvalue, int err)
{
return mth_randomgauss(teoricvalue,err);
}
int adcPrec(int nl, int po)
{
int i,r;
for ( i = 0, r = 0; i < nl; ++i )
r += adcRead(val,ERR);
return (r >> po) + 1;
}
int main()
{
mth_initrandom();
printf("Test\n");
int i,adc=0;
int ok = 0;
int ap = 0;
val = 0;
for ( i = 0; i < COUNT; ++i )
{
con_cls();
adc = adcPrec(256,8);
if ( adc == val )
++ok;
else if ( adc + 1 == val || adc -1 == val )
++ap;
printf("read:%5d err:(%5d) ok:%5d/%5d/%5d err:%.5f%% l:%5d/%5d\n",adc,val - adc,ok,ap,(i+1),(100.0 * (double)((i+1) - ok)) / COUNT,i+1,COUNT );
if ( mth_random(1) || val <= 0 )
val += mth_random(DELTA);
else
val -= mth_random(DELTA);
con_flush();
thr_sleep(0.001);
}
return 0;
}