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