Stran 1 od 1

Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 11:11
Napisal/-a Kroko
Recimo, da imam tabelo petih meritev:

0% = 0.05
25% = 0.56
50% = 0.77
75% = 0.9
100% = 1

Kako bi naredil funkcijo, s katero bi lahko poljubno preračunaval vrednosti naprej in nazaj?

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 11:15
Napisal/-a Kroko
A je to tole:
http://mathworld.wolfram.com/LagrangeIn ... omial.html

Ali pa se v praksi uporablja kaj drugega?

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 11:41
Napisal/-a S53DZ
Jap, če ti linearna interpolacija ni dovolj.
Vedeti je treba, da so višjega reda bolj divje in lahko odstopajo na ozkih segmentih.
Glede na podano pohlevno tabelo ni pričakovati večjega divjanja tudi pri polinomu tretjega reda.
Moje mnenje.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 11:48
Napisal/-a marko
Mislim, da je to to ja.
Poglej si tule malo bolj "življenjski" opis raznih interpolacij :) Mi je že prišlo prav nekajkrat..

http://paulbourke.net/miscellaneous/interpolation/

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 12:29
Napisal/-a Kroko
Odlično, Hvala. Že dela.
Untitled-1.png
Untitled-1.png (4.48 KiB) Videno 423 krat

Modro so dejanske vrednosti, rdeče pa interpolacija na osnovi zgornje tabele.

Uporabljeno bo pa tole za nastavljanje PWM signala glede na S parameter v g-kodi. Na primer za laser.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 13:22
Napisal/-a s54mtb
Priporocam, da ne uporabljas polinomov. Na prvi pogled je videti zelo dobro, samo hitro pobegne. Priporocam PWL metodo, kjer uporabis daljice znotraj merilnega podrocja. Druga moznost je, da vzames po tri tocke iz intervala in cez napnes kvadratno funkcijo. S tem zmanjsas nelinearnost, malo vec je racunanja, koliko pridobis, si moras pa sam preracunat. Stvari postanejo zanimive, ko imas vec kot en parameter.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 13:37
Napisal/-a MitjaN

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 16:55
Napisal/-a zanka
s54mtb je napisal/-a:Priporocam, da ne uporabljas polinomov. Na prvi pogled je videti zelo dobro, samo hitro pobegne. Priporocam PWL metodo, kjer uporabis daljice znotraj merilnega podrocja. Druga moznost je, da vzames po tri tocke iz intervala in cez napnes kvadratno funkcijo. S tem zmanjsas nelinearnost, malo vec je racunanja, koliko pridobis, si moras pa sam preracunat. Stvari postanejo zanimive, ko imas vec kot en parameter.

Tako je, dejansko se uporabljajo zlepki največ kubičnih polinomov, kajti večanje stopnje vodi v katastrofo.

Ti Lagrangeovi polinomi so dobri samo za teorijo. Seveda je "kakovost" odvisna tudi od izbora točk.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 18 Sep 2019, 17:11
Napisal/-a s54mtb
Se to... kubni so v primeru enega parametra y=f(x). Pri vec kot enem je vsota stopenj 3/ Npr. pri y=f(x1,x2) je korekcija kombinacija kvadratne in linearne. Eden od vplivov je ponavadi ali zelo majhen ali linearen. Ce to ni, je nekaj narobe ze v osnovnem principu (kot bi npr. s senzorjem vlage meril temperaturo kot glavno velicino).

Re: Kalibracijska funkcija

OdgovorObjavljeno: 19 Sep 2019, 18:05
Napisal/-a Kroko
Se sicer strinjam. Le v mojem primeru ima Lagrange največ četrto stopnjo, pa tudi vrednosti v tabeli so lepo naraščujoče. Mislim, da ni za pričakovati, da bo pobegnil. Ko imaš koeficiente se ga tudi hitro računa.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 19 Sep 2019, 19:33
Napisal/-a zanka
Glede na to, da imaš ravno 5 točk, bo polinom 4. stopnje točen v teh točkah. Višje stopnje lahko dobiš le če imaš več točk.

Verjetno ima tvoj polinom koeficiente pri sodih potencah manjše kot koeficiente pri lihih potencah neznanke.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 19 Sep 2019, 22:13
Napisal/-a Kroko
Za tole gre:
CNC kontroler generira PWM signal. Duty cycle lahko šofiram v G-kodi s S parametrom. S tem PWM-jem nastavljam moč laserju. G-koda je generirana iz fotografije.
Želim, da mi laser "ujame" vse odtenke sivine vendar še zdaleč ni linearen. Zato sem si zamislil "kalibracijo". Uporabnik bo vnesel, koliko laser naredi "sivne" pri 0%, 25%, 50%, 75% in 100% duty ciklu.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 19 Sep 2019, 22:17
Napisal/-a Kroko
Kot "pobeg" je verjetno mišljeno tole:
Untitled-1.png
Untitled-1.png (20.76 KiB) Videno 248 krat

Slika je iz fotošopa.

Re: Kalibracijska funkcija

OdgovorObjavljeno: 19 Sep 2019, 23:27
Napisal/-a xfce
Kroko je napisal/-a:Za tole gre:
CNC kontroler generira PWM signal. Duty cycle lahko šofiram v G-kodi s S parametrom. S tem PWM-jem nastavljam moč laserju. G-koda je generirana iz fotografije.
Želim, da mi laser "ujame" vse odtenke sivine vendar še zdaleč ni linearen. Zato sem si zamislil "kalibracijo". Uporabnik bo vnesel, koliko laser naredi "sivne" pri 0%, 25%, 50%, 75% in 100% duty ciklu.


Bo to uporabnik ocenjeval na oko? Verjetno se nikakor ne spača preveč komplicirati z metodo interpolacije, ker je veliko večja težava dobit dobre podatke :)

Mogoče bi dal prednost rešitvi, kako uporabnik kalibrira stoj. Mogoče bi naredil g kodo, ki nariše kvadratke in jih potem uporabnik sortira .. oz mu daš 20 primerjav, kjer primerja ali je enako, bolj sivo, manj sivo in potem s svojim algoritmom generiraš funkcijo, ki določa moč.

Sicer se mi pa zdi pa kakor vem je pri laserju tako, da praktično nič ne žge, ko pa povpršino rahlo ožge, da je črna gre pa naprej blazno hitro. Tako, da je vse skupaj bolj loterija :) Da ne govorim o kakšnih letnicah na lesu :D


Ena moja stara koda za linearno intepolacijo na podhranjenem 8 bitniku :)

Koda: Izberi vse
static uint16_t harray[50] = {
2300,468,
2350,519,
2400,571,
2450,622,
2500,672,
2550,721,
2600,769,
2650,815,
2700,860,
2750,904,
2800,945,
2850,985,
2900,1022,
2950,1058,
3000,1091,
3050,1122,
3100,1151,
3150,1178,
3200,1202,
3250,1225,
3300,1245,
3350,1264,
3400,1281,
3450,1296,
3500,1310,
};

 uint16_t interpolate(uint16_t *arrptr,uint16_t size, uint16_t inX){

    uint16_t calcres = 0;
    uint8_t          x = 0;
    int16_t a,b,c,d;
    int16_t midres1, midres2;

            while(x<=size){
            if ((inX >=arrptr[x]) && (inX <=arrptr[x+2])){
                calcres = arrptr[x+1];
                a = (arrptr[x]-inX);
                b = (arrptr[x+3]-arrptr[x+1]);
                c = (arrptr[x]-arrptr[x+2]);
             
                midres1 = a*b;
                midres2 = c;
                calcres += (uint16_t)(midres1/midres2);
               
             x=size+1;
           
             
            }
            x=x+2;
        }
   
return (uint16_t)calcres;
   
}


hi_inp = interpolate(harray,50,voltage)