forked from M-Labs/thermostat
steinhart_hart: fix calculation, rename parameters
This commit is contained in:
parent
0f4442b124
commit
cee0a1fcab
|
@ -3,28 +3,39 @@ use lexical_core::Float;
|
||||||
/// Steinhart-Hart equation parameters
|
/// Steinhart-Hart equation parameters
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Parameters {
|
pub struct Parameters {
|
||||||
pub a: f64,
|
pub t0: f64,
|
||||||
pub b: f64,
|
pub r: f64,
|
||||||
pub c: f64,
|
pub r0: f64,
|
||||||
/// Parallel resistance
|
|
||||||
///
|
r_fact: f64,
|
||||||
/// Not truly part of the equation but required to calculate
|
|
||||||
/// resistance from voltage.
|
|
||||||
pub parallel_r: f64,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Parameters {
|
impl Parameters {
|
||||||
|
/// Update the cached r_fact
|
||||||
|
pub fn update(&mut self) {
|
||||||
|
self.r_fact = (self.r / self.r0).ln();
|
||||||
|
}
|
||||||
|
|
||||||
/// Perform the voltage to temperature conversion.
|
/// Perform the voltage to temperature conversion.
|
||||||
///
|
///
|
||||||
/// Result unit: Kelvin
|
/// Result unit: Kelvin
|
||||||
///
|
///
|
||||||
/// TODO: verify
|
/// TODO: verify
|
||||||
pub fn get_temperature(&self, voltage: f64) -> f64 {
|
pub fn get_temperature(&self, b: f64) -> f64 {
|
||||||
let r = self.parallel_r * voltage;
|
let inv_temp = 1.0 / self.t0 + self.r_fact / b;
|
||||||
let ln_r = r.abs().ln();
|
|
||||||
let inv_temp = self.a +
|
|
||||||
self.b * ln_r +
|
|
||||||
self.c * ln_r * ln_r * ln_r;
|
|
||||||
1.0 / inv_temp
|
1.0 / inv_temp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Parameters {
|
||||||
|
fn default() -> Self {
|
||||||
|
let mut p = Parameters {
|
||||||
|
t0: 0.001_4,
|
||||||
|
r: 0.000_000_099,
|
||||||
|
r0: 5_110.0,
|
||||||
|
r_fact: 0.0,
|
||||||
|
};
|
||||||
|
p.update();
|
||||||
|
p
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue