Re: Peripetie s termočlánky (Vianocna list..
Pavel Hudeček
edizon na seznam.cz
Čtvrtek Prosinec 26 12:59:53 CET 2024
No, to je docela důležitej postřeh:-)
Takže optimalizovaná varianta s kubickými splajny bude mít na sdudenej
konec třeba 3 body, kde tabulka rovnou převádí ADC hodnotu U čidla na µV
TČ k odečtení.
Ale vlastně při mém použití bude nejjednodušší si ustříhnout ještě jeden
minitermočláneček navíc a zapojit antisériově k ostatním:-)
Jeho hodnota se sice bude taky měřit, ale jen jako údaj kolik má měřák,
ve výpočtu venku změřených hodnot figurovat nebude:-)
Nebo, kdybych chtěl bejt hodně precizní a navíc nedůvěřoval číňanovi co
do homogenity složení drátů (případně sobě co do změny složení při
svařování), můžu tohle udělat u každýho čidla zvlášť a stříhat vždy 1-2
cm z toho konce kde se pak bude měřit.
PH
Dne 26.12.2024 v 0:58 Lukas Burda napsal(a):
> 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_Part1.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;
> }
>
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241226/50faedc8/attachment.htm>
Další informace o konferenci Hw-list