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

Pavel Hudeček edizon na seznam.cz
Středa Prosinec 25 14:38:42 CET 2024


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
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241225/469cf3f6/attachment.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/469cf3f6/attachment.png>


Další informace o konferenci Hw-list