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

Daniel Valuch balu na k-net.fr
Středa Prosinec 25 13:58:16 CET 2024


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


Další informace o konferenci Hw-list