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

Lukas Burda burdal1 na post.cz
Čtvrtek Prosinec 26 00:58:13 CET 2024


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_Part
1.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; 
} 


" _______________________________________________ 
HW-list mailing list  -  sponsored by www.HW.cz(http://www.hw.cz) 
Hw-list na list.hw.cz(mailto:Hw-list na list.hw.cz) 
http://list.hw.cz/mailman/listinfo/hw-list
(http://list.hw.cz/mailman/listinfo/hw-list) 
" 




_______________________________________________
HW-list mailing list  -  sponsored by <a href='http://www.hw.cz' class='-wm-moz-txt-link-abbreviated'>www.HW.cz</a>
<a href='mailto:Hw-list na list.hw.cz' class='-wm-moz-txt-link-abbreviated -wm-moz-txt-link-freetext'>Hw-list na list.hw.cz</a>
<a href='http://list.hw.cz/mailman/listinfo/hw-list' class='-wm-moz-txt-link-freetext'>http://list.hw.cz/mailman/listinfo/hw-list</a>

" 



_______________________________________________
HW-list mailing list  -  sponsored by <a href='http://www.hw.cz' class='-wm-moz-txt-link-abbreviated'>www.HW.cz</a>
<a href='mailto:Hw-list na list.hw.cz' class='-wm-moz-txt-link-abbreviated'>Hw-list na list.hw.cz</a>
<a href='http://list.hw.cz/mailman/listinfo/hw-list' class='-wm-moz-txt-link-freetext'>http://list.hw.cz/mailman/listinfo/hw-list</a>

" 
_______________________________________________ 
HW-list mailing list - sponsored by www.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/20241226/8a5fda24/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/20241226/8a5fda24/attachment-0001.png>


Další informace o konferenci Hw-list