Re: Peripetie s termočlánky (Vianocna list..
Pavel Hudeček
edizon na seznam.cz
Středa Prosinec 25 13:10:48 CET 2024
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
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20241225/5615a7ab/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/5615a7ab/attachment.png>
Další informace o konferenci Hw-list