Kalibracija

Excel-tabela koja služi za kalibraciju, to jest: izračunava koeficijente korektivnih linearnih izraza za softver koji obrađuje sirove rezultate merenja, bilo da je u pitanju SWR-metar, vatmetar, voltmetar, merač kapacitivnosti itd. Može se uneti do 21 par idealnih i izmerenih vrednosti, a brojevi imaju do pet decimala. Sve se to može i menjati po želji.

Podrazumevamo da su greške merenja približno konstantne za svaki deo mernog opsega. Dobijeni koeficijenti mogu se u softver uneti direktno upisivanjem u kod, ili preko serijskog porta mikrokontrolera, na primer.

Verzija je super-taze, otprilike 0.50β, nadam se da nema makar velikih grešaka u samoj tabeli.

Skinuti tabelu:
https://app.box.com/s/ikzag9w0vbwuscws54lc355bq1c5mlkn

.

.

Grafička ilustracija:
kontrolnim merenjem dobijaju se zelene tačke, čije se koordinate unose u tabelu. Excel onda pomaže da se dobije niz linearnih izraza koji mapiraju zelene duži na odgovarajuće sive duži, tj. transformišu i “navlače” zelene duži na sivu idealnu pravu. Račun se bavi samo krajnjim tačkama svake zelene duži, ali one jednoznačno određuju duž, tako da su i sve tačke između njih – na isti način mapirane u tačke na odgovarajućoj sivoj duži.

Moglo bi se računati i “peške”, bez upotrebe funkcije LINEST(): ako su, na primer, dve uzastopne idealne vrednosti w’ i w” (kolona B u Excel tabeli), a njima odgovarajuće izmerene vrednosti x’ i x” (kolona C), mogli bismo izračunati a i b za korektivni izraz u obliku y = (a * x) + b, u koloni F:
a = (w”-w’) / (x”-x’)
b = w’ – (a * x’)

Arduino funkcija:

#define LINCORR_ENABLED 1 // Bice 0 samo tokom kontrolnog merenja, inace 1
#define ARRAY_LENGTH 11 // Broj vrednosti u nizu (tri ili vise)        


float LinCorr(float raw_value) {

    const float ideal[ARRAY_LENGTH] = {-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6};
    const float found[ARRAY_LENGTH] = {-5.333, -4.222, -3.00, -1.5, 0.21, 0.6, 1.2, 2.3, 3.5, 4.4, 5.4};

    #if (LINCORR_ENABLED)
        for (int i = 1; i < ARRAY_LENGTH; i++) {
            if ((raw_value <= found[i]) || (i == (ARRAY_LENGTH - 1))) {
                float a = (ideal[i] - ideal[i-1]) / (found[i] - found[i-1]);
                float b = ideal[i] - (a * found[i]);
                return (a * raw_value) + b;
            }
        }
    #else 
        return raw_value;
    #endif

    
}

U niz ideal[] unete su poznate-idealne vrednosti, a u niz found[] odgovarajuće vrednosti dobijene kontrolnim merenjem, bez ikakve korekcije. Broj unetih vrednosti ARRAY_LENGTH za oba niza je isti (i veći od dva), a vrednosti moraju biti poređane od najmanje do najveće. Raspon unetih vrednosti trebalo bi da pokriva ŠTO VEĆI deo mernog opsega. (Vrednosti koje se vide unete ovde samo su slučajan primer, za probu, uneto ih je po 11.)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s