<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    No, to je docela důležitej postřeh:-)<br>
    <br>
    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í.<br>
    <br>
    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:-)<br>
    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:-)<br>
    <br>
    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.<br>
    <br>
    PH<br>
    <br>
    <div class="moz-cite-prefix">Dne 26.12.2024 v 0:58 Lukas Burda
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:KLs.eNhV.22q3iGkKIyC.1dR9mL@seznam.cz">
      <meta http-equiv="content-type" content="text/html; charset=UTF-8">
      Pěkný večer,
      <div>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ě. </div>
      <div><br>
      </div>
      <div>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 :)</div>
      <div><br>
      </div>
      <div>LB</div>
      <div><br>
        <aside>---------- Původní e-mail ----------<br>
          Od: Pavel Hudeček <a class="moz-txt-link-rfc2396E" href="mailto:edizon@seznam.cz"><edizon@seznam.cz></a><br>
          Komu: <a class="moz-txt-link-abbreviated" href="mailto:hw-list@list.hw.cz">hw-list@list.hw.cz</a><br>
          Datum: 25. 12. 2024 14:38:54<br>
          Předmět: Re: Peripetie s termočlánky (Vianocna list..</aside>
        <br>
        <blockquote data-email="edizon@seznam.cz"> Díky za zajímavé
          čtení.<br>
          Potvrdili mi podezření, že není moc horších možností než právě
          K.<br>
          Příjemné je, že hodnoty v tabulkách neobsahují mezery a tak se
          dají přímo kopírovat do programu.<br>
          <br>
          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.<br>
          <br>
          PH<br>
          <br>
          <div class="-wm-moz-cite-prefix">Dne 25.12.2024 v 13:58 Daniel
            Valuch napsal(a):<br>
          </div>
          <blockquote>
            <p>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...</p>
            <p><a
                class="-wm-moz-txt-link-freetext moz-txt-link-freetext"
href="https://www.bipm.org/en/committees/cc/cct/guides-to-thermometry"
                moz-do-not-send="true">https://www.bipm.org/en/committees/cc/cct/guides-to-thermometry</a><br>
            </p>
            <p>tam si najdi Guide on Secondary Thermometry Thermocouple
              Thermometry: 1. General Usage<br>
            </p>
            <p><a class="-wm-moz-txt-link-freetext"
href="https://www.bipm.org/documents/20126/41773843/Thermocouple_Thermometry_Part1.pdf/d23088f8-3bab-bacc-0cae-7358eb2666b4?version=1.4&t=1700233754743&download=true"
                moz-do-not-send="true">https://www.bipm.org/documents/20126/41773843/Thermocouple_Thermometry_Part1.pdf/d23088f8-3bab-bacc-0cae-7358eb2666b4?version=1.4&t=1700233754743&download=true</a></p>
            <p>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. <br>
            </p>
            <p>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)<br>
            </p>
            <p>Dokonca je tam rozvedene aj spominane zatvorkovanie...</p>
            <p><br>
            </p>
            <p><br>
            </p>
            <p><br>
            </p>
            <div class="-wm-moz-cite-prefix">On 25/12/2024 13:10, Pavel
              Hudeček wrote:<br>
            </div>
            <blockquote> Jsem si říkal, proč má ten týpek na gitu
              hromady závorek, tak díky za vysvětlení.<br>
              <br>
              Nejvíc se mi samozřejmě líbí varianta s forem.<br>
              <br>
              Pak je ještě otázka, zda je nějaká optimalizace na to,
              když přibudou ještě ty další věci:<br>
              <img src="cid:part1.wfXogfay.NQuU3pVV@seznam.cz" alt=""
                class="" moz-do-not-send="true"><br>
              <a class="-wm-moz-txt-link-freetext moz-txt-link-freetext"
href="https://www.omega.co.uk/temperature/z/pdf/z198-201.pdf"
                moz-do-not-send="true">https://www.omega.co.uk/temperature/z/pdf/z198-201.pdf</a><br>
              <br>
              A vlastně proč je to takhle a není prostě jen jiná sada
              koeficientů polynomu tak, aby se docílilo stejného tvaru
              funkce?<br>
              <br>
              PH<br>
              <br>
              <div class="-wm-moz-cite-prefix">Dne 25.12.2024 v 11:34
                Miroslav Mraz napsal(a):<br>
              </div>
              <blockquote>Koukal jsem na to a trochu si hrál s
                překladačem a jak definovat polynomy. Zkusil jsem 3
                způsoby <br>
                <br>
                static constexpr int coeff [] = {1,2,3,4,5}; <br>
                // default optimize -Os <br>
                int poly_a (const int x) { <br>
                  int y = coeff[4]; <br>
                  int t = x; <br>
                  y += coeff[3] * t;  t *= x; <br>
                  y += coeff[2] * t;  t *= x; <br>
                  y += coeff[1] * t;  t *= x; <br>
                  y += coeff[0] * t; <br>
                  return y; <br>
                } <br>
                int poly_b (const int x) { <br>
                  return  ((((coeff[0]  * x) <br>
                            + coeff[1]) * x <br>
                            + coeff[2]) * x <br>
                            + coeff[3]) * x <br>
                            + coeff[4]; <br>
                } <br>
                [[using gnu: optimize("O3")]] // unroll loop <br>
                int poly_c (const int x) { <br>
                  int y = 0; <br>
                  for (auto c : coeff) { y *= x; y += c; } <br>
                  return y; <br>
                } <br>
                <br>
                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. <br>
                <br>
                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. <br>
                <br>
                Mrazík <br>
                <br>
                On 24. 12. 24 16:13, Daniel Valuch wrote: <br>
                <blockquote>poslane sukromne... <br>
                  <br>
                  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. <br>
                  <br>
                  Prikladam vycuc z kodu <br>
                  <br>
                     if (MeasureTC1) { <br>
                         // measure cold junction temperature first <br>
                         RColdJunction = (float)ADCavrgCJ /
                  (float)ADCavrgRef * R0; // scaling of cold junction
                  and reference cancels out <br>
                         TemperatureCJ =
                  RTDpolynomial(WCorrection(RColdJunction/R0nominal));
                  // calculate cold junction temperature <br>
                  <br>
                         VCJ = ThermoCoupleK_TtoE(TemperatureCJ -
                  273.16); // equivalent Cold Junction voltage <br>
                         VTC1raw = (float)ADCavrgTC1 * QueueBitShift *
                  LSBmV * TC1InvGain;  // convert measured ADC number to
                  voltage in mV <br>
                         VTC1raw = VTC1raw -
                  TC1offsetVoltage;                              //
                  suppress analogue offset (e.g. from the op-amp) <br>
                         VTC1comp = VTC1raw +
                  VCJ;                                          // cold
                  junction voltage added to measured voltage <br>
                         TemperatureTC1 = ThermoCoupleK_EtoT(VTC1comp);
                  <br>
                         // 0=Celsius, 1=Kelvin, 2=Farenheit, 3=Ohm,
                  4=microVolt <br>
                         if (unit == 0) { <br>
                           PrepareText(TemperatureTC1, 0); <br>
                         } else if (unit == 1) { <br>
                           PrepareText(TemperatureTC1 + 273.15, 1); <br>
                         } else if (unit == 2) { <br>
                           PrepareText(TemperatureTC1 * 1.8 + 32.0, 2);
                  <br>
                         } else if (unit == 3) { <br>
                           PrepareText(VTC1raw, 4); <br>
                         } <br>
                       } <br>
                  <br>
                  <br>
                  float ThermoCoupleK_EtoT(float e) { <br>
                     // type K ITS-90 polynomial <br>
                     // <a
class="-wm-moz-txt-link-freetext moz-txt-link-freetext"
href="https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html"
                    moz-do-not-send="true">https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html</a>
                  <br>
                     const float d0m = 0.0e0; <br>
                     const float d1m = 2.5173462e1; <br>
                     const float d2m = -1.1662878e0; <br>
                     const float d3m = -1.0833638e0; <br>
                     const float d4m = -8.9773540e-1; <br>
                     const float d5m = -3.7342377e-1; <br>
                     const float d6m = -8.6632643e-2; <br>
                     const float d7m = -1.0450598e-2; <br>
                     const float d8m = -5.1920577e-4; <br>
                  <br>
                     const float d0p = 0.000000e0; <br>
                     const float d1p = 2.508355e1; <br>
                     const float d2p = 7.860106e-2; <br>
                     const float d3p = -2.503131e-1; <br>
                     const float d4p = 8.315270e-2; <br>
                     const float d5p = -1.228034e-2; <br>
                     const float d6p = 9.804036e-4; <br>
                     const float d7p = -4.413030e-5; <br>
                     const float d8p = 1.057734e-6; <br>
                     const float d9p = -1.052755e-8; <br>
                  <br>
                     float E = 0.0; <br>
                     float t90 = 0.0; <br>
                  <br>
                     E = e; <br>
                  <br>
                     if (e < 0.00) {  // negative temperature <br>
                       t90 = t90 + d1m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d2m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d3m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d4m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d5m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d6m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d7m * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d8m * E; <br>
                     } else if (e >= 0 && e < 20.644) { 
                  // positive temperature <500 C <br>
                       t90 = t90 + d1p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d2p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d3p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d4p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d5p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d6p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d7p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d8p * E; <br>
                       E = E * e; <br>
                       t90 = t90 + d9p * E; <br>
                     } else { <br>
                       t90 = -273.0; <br>
                     } <br>
                  <br>
                     return t90; <br>
                  } <br>
                </blockquote>
              </blockquote>
            </blockquote>
          </blockquote>
        </blockquote>
      </div>
    </blockquote>
  </body>
</html>