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

Daniel Valuch balu na k-net.fr
Středa Prosinec 25 15:36:12 CET 2024


NIST pise ze "For Type K thermocouples above 0 °C, there is an 
additional term to account for a magnetic ordering effect:"


On 25/12/2024 14:38, Pavel Hudeček wrote:
> 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
>>
>> 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
>>
>> 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
>>>
>>> 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
>>>>>    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;
>>>>> }
>>>>>
>>>>>
>>>> _______________________________________________
>>>> HW-list mailing list  -  sponsored by www.HW.cz
>>>> Hw-list na list.hw.cz
>>>> http://list.hw.cz/mailman/listinfo/hw-list
>>>
>>>
>>> _______________________________________________
>>> HW-list mailing list  -  sponsored bywww.HW.cz
>>> Hw-list na list.hw.cz
>>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored bywww.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241225/9c78388e/attachment-0001.htm>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: ByqB9hi65iGxOJdj.png
Type: image/png
Size: 11213 bytes
Desc: [žádný popis není k dispozici]
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241225/9c78388e/attachment-0001.png>


Další informace o konferenci Hw-list