diff --git a/Cargo.toml b/Cargo.toml index fd9fb6f..9064c91 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,7 +41,7 @@ version = "0.3.*" version = "0.4.*" # Serialization [workspace.dependencies.parity-scale-codec] -version = "3.5.*" +version = "3.6.*" default-features = false # Embedded-HAL [workspace.dependencies.embedded-hal] @@ -132,6 +132,7 @@ thermocouple_k = [] [dependencies] uom = { workspace = true } parity-scale-codec = { workspace = true } +libm = { workspace = true } #--------------------------------------------------------------------------------------------------------------------- #----- Profiles ------------------------ diff --git a/src/transducer/conversion/thermocouples/type_k.rs b/src/transducer/conversion/thermocouples/type_k.rs index 8bc742e..7356d1d 100644 --- a/src/transducer/conversion/thermocouples/type_k.rs +++ b/src/transducer/conversion/thermocouples/type_k.rs @@ -1,4 +1,5 @@ use crate::transducer::InvalidValue; +use libm::powf; use uom::si::electric_potential::{millivolt, volt}; use uom::si::f32; use uom::si::thermodynamic_temperature::degree_celsius; @@ -26,8 +27,7 @@ pub fn convert( let mv_pow7 = mv_pow6 * mv; let mv_pow8 = mv_pow7 * mv; - let celsius = 1.0 - + 2.5173462E+1 * mv + let celsius = 2.5173462E+1 * mv + -1.1662878 * mv_pow2 + -1.0833638 * mv_pow3 + -8.9773540E-1 * mv_pow4 @@ -42,8 +42,7 @@ pub fn convert( let mv_pow8 = mv_pow7 * mv; let mv_pow9 = mv_pow8 * mv; - let celsius = 1.0 - + 2.508355E+1 * mv + let celsius = 2.508355E+1 * mv + 7.860106E-2 * mv_pow2 + -2.503131E-1 * mv_pow3 + 8.315270E-2 * mv_pow4 @@ -72,21 +71,47 @@ pub fn convert( pub fn r_junction_offset_poly( temperature: f32::ThermodynamicTemperature, ) -> Result { - const T0: f32 = 2.5000000E+01; - const V0: f32 = 1.0003453E+00; - const P1: f32 = 4.0514854E-02; - const P2: f32 = -3.8789638E-05; - const P3: f32 = -2.8608478E-06; - const P4: f32 = -9.5367041E-10; - const Q1: f32 = -1.3948675E-03; - const Q2: f32 = -6.7976627E-05; - let celsius = temperature.get::(); - if celsius >= -20.0 && celsius <= 70.0 { - let offset_tcj = celsius - T0; - let numerator = offset_tcj + (P1 + offset_tcj * (P2 + offset_tcj * (P3 + P4 * offset_tcj))); - let denominator = 1.0 + offset_tcj * (Q1 + Q2 * offset_tcj); - let mv = V0 + numerator / denominator; + let cel_pow2 = celsius * celsius; + let cel_pow3 = cel_pow2 * celsius; + let cel_pow4 = cel_pow3 * celsius; + let cel_pow5 = cel_pow4 * celsius; + let cel_pow6 = cel_pow5 * celsius; + let cel_pow7 = cel_pow6 * celsius; + let cel_pow8 = cel_pow7 * celsius; + let cel_pow9 = cel_pow8 * celsius; + + if celsius >= -270.0 && celsius < 0.0 { + let cel_pow10 = cel_pow9 * celsius; + + let mv = 0.394501280250E-01 * celsius + + 0.236223735980E-04 * cel_pow2 + + -0.328589067840E-06 * cel_pow3 + + -0.499048287770E-08 * cel_pow4 + + -0.675090591730E-10 * cel_pow5 + + -0.574103274280E-12 * cel_pow6 + + -0.310888728940E-14 * cel_pow7 + + -0.104516093650E-16 * cel_pow8 + + -0.198892668780E-19 * cel_pow9 + + -0.163226974860E-22 * cel_pow10; + + Ok(f32::ElectricPotential::new::(mv)) + } else if celsius >= 0.0 && celsius <= 1372.0 { + let base = celsius - 0.126968600000E+03; + let exp = -0.118343200000E-03 * (base * base); + let addition = powf(0.1185976, exp); + + let mv = -0.176004136860E-01 + + 0.389212049750E-01 * celsius + + 0.185587700320E-04 * cel_pow2 + + -0.994575928740E-07 * cel_pow3 + + 0.318409457190E-09 * cel_pow4 + + -0.560728448890E-12 * cel_pow5 + + 0.560750590590E-15 * cel_pow6 + + -0.320207200030E-18 * cel_pow7 + + 0.971511471520E-22 * cel_pow8 + + -0.121047212750E-25 * cel_pow9 + + addition; Ok(f32::ElectricPotential::new::(mv)) } else { @@ -94,11 +119,12 @@ pub fn r_junction_offset_poly( } } +#[inline] pub fn r_junction_offset_lin( temperature: f32::ThermodynamicTemperature, ) -> Result { let celsius = temperature.get::(); - if celsius >= -2.0 && celsius <= 1000.0 { + if celsius >= -2.0 && celsius <= 800.0 { let mv = 0.041 * celsius; Ok(f32::ElectricPotential::new::(mv)) } else {