Re: Peripetie s termočlánky (Vianocna list..

Pavel Hudeček edizon na seznam.cz
Čtvrtek Prosinec 26 12:59:53 CET 2024


No, to je docela důležitej postřeh:-)

Takže optimalizovaná varianta s kubickými splajny bude mít na sdudenej 
konec třeba 3 body, kde tabulka rovnou převádí ADC hodnotu U čidla na µV 
TČ k odečtení.

Ale vlastně při mém použití bude nejjednodušší si ustříhnout ještě jeden 
minitermočláneček navíc a zapojit antisériově k ostatním:-)
Jeho hodnota se sice bude taky měřit, ale jen jako údaj kolik má měřák, 
ve výpočtu venku změřených hodnot figurovat nebude:-)

Nebo, kdybych chtěl bejt hodně precizní a navíc nedůvěřoval číňanovi co 
do homogenity složení drátů (případně sobě co do změny složení při 
svařování), můžu tohle udělat u každýho čidla zvlášť a stříhat vždy 1-2 
cm z toho konce kde se pak bude měřit.

PH

Dne 26.12.2024 v 0:58 Lukas Burda napsal(a):
> Pěkný večer,
> chápu to dobře, že exponenciální člen je jen při převodu t -> U, čili 
> v teploměru jen pro převody teploty studeného konce na napětí? Pokud 
> to nemá být nějaký outdoor přístroj, tak (pokud jsem neudělal chybu) 
> třeba pro studenej konec 10 °C - 50 °C jde ten exponenciální člen 
> nahradit lineárním +0,8864*t+13,3 (uV; °C) a odchylka oproti 
> exponenciálnímu je do 1,4 uV, což je do setin stupně.
>
> Nejlepší je teda asi udělat studenej konec termostatovanej a pak to 
> bude jen konstatnta :-) Oni nakonec i ti metrologove si nedaj u TC 
> pokoj se cpanim studenyho konce do nuly :)
>
> LB
>
> ---------- Původní e-mail ----------
> Od: Pavel Hudeček <edizon na seznam.cz>
> Komu: hw-list na list.hw.cz
> Datum: 25. 12. 2024 14:38:54
> Předmět: Re: Peripetie s termočlánky (Vianocna list..
>
>
>     Díky za zajímavé čtení.
>     Potvrdili mi podezření, že není moc horších možností než právě K.
>     Příjemné je, že hodnoty v tabulkách neobsahují mezery a tak se
>     dají přímo kopírovat do programu.
>
>     Ale odpověď na mojí otázku, zda/proč nejde pro K upravit hodnoty
>     koeficientů polynomu tak, aby tam nemusela bejt ta dodatečná část,
>     jsem nenašel.
>
>     PH
>
>     Dne 25.12.2024 v 13:58 Daniel Valuch napsal(a):
>
>         nechcem byt vlezly, ale naozaj stoji za precitanie
>         dokumentacia priamo od BIPM. Preco nepouzivat literaturu
>         priamo od zdroja? Metrologovia zarucene poznaju lepsie
>         vsetkych diablikov ako firma co zvara draty z roznych kovov...
>
>         https://www.bipm.org/en/committees/cc/cct/guides-to-thermometry
>         <https://www.bipm.org/en/committees/cc/cct/guides-to-thermometry>
>
>         tam si najdi Guide on Secondary Thermometry Thermocouple
>         Thermometry: 1. General Usage
>
>         https://www.bipm.org/documents/20126/41773843/Thermocouple_Thermometry_Part1.pdf/d23088f8-3bab-bacc-0cae-7358eb2666b4?version=1.4&t=1700233754743&download=true
>         <https://www.bipm.org/documents/20126/41773843/Thermocouple_Thermometry_Part1.pdf/d23088f8-3bab-bacc-0cae-7358eb2666b4?version=1.4&t=1700233754743&download=true>
>
>         Tam najdes popis kazdeho typu aj s vysvetlenim dolezitych
>         javov. Dokonca take veci, ze termoclanok typu K trpi
>         hysterezou v rozsahu 1-8 stupnov ked je vystaveny teplote nad
>         150 stupnov, alebo degradacia teplotneho koeficientu podla
>         toho ci je vystaveny redukcnej atmosfere, alebo nerezovej trubke.
>
>         A na konci je Appendix A: Thermocouple reference functions,
>         kde zistis, ze dodatocna exponencialna funkcia je pouzita len
>         pre typ K a len v smere teplota -> napatie. Pre opacny smer
>         (napatie -> teplota) su vypocitane koeficienty polynomov
>         (strany 44-56)
>
>         Dokonca je tam rozvedene aj spominane zatvorkovanie...
>
>
>
>
>         On 25/12/2024 13:10, Pavel Hudeček wrote:
>
>             Jsem si říkal, proč má ten týpek na gitu hromady závorek,
>             tak díky za vysvětlení.
>
>             Nejvíc se mi samozřejmě líbí varianta s forem.
>
>             Pak je ještě otázka, zda je nějaká optimalizace na to,
>             když přibudou ještě ty další věci:
>
>             https://www.omega.co.uk/temperature/z/pdf/z198-201.pdf
>             <https://www.omega.co.uk/temperature/z/pdf/z198-201.pdf>
>
>             A vlastně proč je to takhle a není prostě jen jiná sada
>             koeficientů polynomu tak, aby se docílilo stejného tvaru
>             funkce?
>
>             PH
>
>             Dne 25.12.2024 v 11:34 Miroslav Mraz napsal(a):
>
>                 Koukal jsem na to a trochu si hrál s překladačem a jak
>                 definovat polynomy. Zkusil jsem 3 způsoby
>
>                 static constexpr int coeff [] = {1,2,3,4,5};
>                 // default optimize -Os
>                 int poly_a (const int x) {
>                   int y = coeff[4];
>                   int t = x;
>                   y += coeff[3] * t;  t *= x;
>                   y += coeff[2] * t;  t *= x;
>                   y += coeff[1] * t;  t *= x;
>                   y += coeff[0] * t;
>                   return y;
>                 }
>                 int poly_b (const int x) {
>                   return  ((((coeff[0]  * x)
>                             + coeff[1]) * x
>                             + coeff[2]) * x
>                             + coeff[3]) * x
>                             + coeff[4];
>                 }
>                 [[using gnu: optimize("O3")]] // unroll loop
>                 int poly_c (const int x) {
>                   int y = 0;
>                   for (auto c : coeff) { y *= x; y += c; }
>                   return y;
>                 }
>
>                 Způsob a) je podobný kódu, co poslal balu, odděleně
>                 počítá mocninu argumentu, což není příliš efektivní.
>                 Způsob b) vyplyne z toho, pokud polynom napíšeme podle
>                 definice a uvědomíme si, že x je z toho možné
>                 povytýkat, ozávovorkovat to a je to jednodušší. A
>                 nakonec způsob c) jednoduchou smyčkou umožní to celé
>                 napsat jednodušeji.
>
>                 Ale proč to píšu. Uvědomil jsem si jak chytré jsou
>                 moderní překladače. Když donutím překladač, aby smyčku
>                 rozvinul, výsledný kód pro b) a c) jsou (pro RISC-V,
>                 ale zřejmě i jinde) naprosto stejné. Překladač pozná,
>                 že první násobení 0 je zbytečné a vyhodí ho. A nejen
>                 to - pozná i zbytečnost násobení 1 (1. koeficient, je
>                 konstatní), neprovádí ho.
>
>                 Mrazík
>
>                 On 24. 12. 24 16:13, Daniel Valuch wrote:
>
>                     poslane sukromne...
>
>                     Ano, ja som to tiez minuly rok studoval
>                     spracovanie signalov od RTD a termoclankov cele
>                     vianoce. Zaujimava problematika. Dokumenty priamo
>                     z BIPM na temu ITS-90 a tabulky koeficientov pre
>                     RTD aj termoclanky od NISTu su velmi dobry zaklad
>                     a su velmi informativne.
>
>                     Prikladam vycuc z kodu
>
>                        if (MeasureTC1) {
>                            // measure cold junction temperature first
>                            RColdJunction = (float)ADCavrgCJ /
>                     (float)ADCavrgRef * R0; // scaling of cold
>                     junction and reference cancels out
>                            TemperatureCJ =
>                     RTDpolynomial(WCorrection(RColdJunction/R0nominal));
>                     // calculate cold junction temperature
>
>                            VCJ = ThermoCoupleK_TtoE(TemperatureCJ -
>                     273.16); // equivalent Cold Junction voltage
>                            VTC1raw = (float)ADCavrgTC1 * QueueBitShift
>                     * LSBmV * TC1InvGain;  // convert measured ADC
>                     number to voltage in mV
>                            VTC1raw = VTC1raw -
>                     TC1offsetVoltage;                              //
>                     suppress analogue offset (e.g. from the op-amp)
>                            VTC1comp = VTC1raw +
>                     VCJ;                                          //
>                     cold junction voltage added to measured voltage
>                            TemperatureTC1 = ThermoCoupleK_EtoT(VTC1comp);
>                            // 0=Celsius, 1=Kelvin, 2=Farenheit, 3=Ohm,
>                     4=microVolt
>                            if (unit == 0) {
>                              PrepareText(TemperatureTC1, 0);
>                            } else if (unit == 1) {
>                              PrepareText(TemperatureTC1 + 273.15, 1);
>                            } else if (unit == 2) {
>                              PrepareText(TemperatureTC1 * 1.8 + 32.0, 2);
>                            } else if (unit == 3) {
>                              PrepareText(VTC1raw, 4);
>                            }
>                          }
>
>
>                     float ThermoCoupleK_EtoT(float e) {
>                        // type K ITS-90 polynomial
>                        //
>                     https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html
>                     <https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html>
>
>                        const float d0m = 0.0e0;
>                        const float d1m = 2.5173462e1;
>                        const float d2m = -1.1662878e0;
>                        const float d3m = -1.0833638e0;
>                        const float d4m = -8.9773540e-1;
>                        const float d5m = -3.7342377e-1;
>                        const float d6m = -8.6632643e-2;
>                        const float d7m = -1.0450598e-2;
>                        const float d8m = -5.1920577e-4;
>
>                        const float d0p = 0.000000e0;
>                        const float d1p = 2.508355e1;
>                        const float d2p = 7.860106e-2;
>                        const float d3p = -2.503131e-1;
>                        const float d4p = 8.315270e-2;
>                        const float d5p = -1.228034e-2;
>                        const float d6p = 9.804036e-4;
>                        const float d7p = -4.413030e-5;
>                        const float d8p = 1.057734e-6;
>                        const float d9p = -1.052755e-8;
>
>                        float E = 0.0;
>                        float t90 = 0.0;
>
>                        E = e;
>
>                        if (e < 0.00) {  // negative temperature
>                          t90 = t90 + d1m * E;
>                          E = E * e;
>                          t90 = t90 + d2m * E;
>                          E = E * e;
>                          t90 = t90 + d3m * E;
>                          E = E * e;
>                          t90 = t90 + d4m * E;
>                          E = E * e;
>                          t90 = t90 + d5m * E;
>                          E = E * e;
>                          t90 = t90 + d6m * E;
>                          E = E * e;
>                          t90 = t90 + d7m * E;
>                          E = E * e;
>                          t90 = t90 + d8m * E;
>                        } else if (e >= 0 && e < 20.644) { // positive
>                     temperature <500 C
>                          t90 = t90 + d1p * E;
>                          E = E * e;
>                          t90 = t90 + d2p * E;
>                          E = E * e;
>                          t90 = t90 + d3p * E;
>                          E = E * e;
>                          t90 = t90 + d4p * E;
>                          E = E * e;
>                          t90 = t90 + d5p * E;
>                          E = E * e;
>                          t90 = t90 + d6p * E;
>                          E = E * e;
>                          t90 = t90 + d7p * E;
>                          E = E * e;
>                          t90 = t90 + d8p * E;
>                          E = E * e;
>                          t90 = t90 + d9p * E;
>                        } else {
>                          t90 = -273.0;
>                        }
>
>                        return t90;
>                     }
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241226/50faedc8/attachment.htm>


Další informace o konferenci Hw-list