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