B-уравнение
B-уравнение проще, но менее точно. \[ \frac{1}{T} = \frac{1}{T_0} + \frac{1}{B} \ln \left( \frac{R}{R_0} \right) \]
Где:
- T — температура в кельвинах.
- \( T_0 \) — опорная температура (обычно 298,15 K, или 25°C), при которой известно сопротивление термистора (обычно 10 кОм).
- R — сопротивление при температуре T.
- \( R_0 \) — сопротивление при опорной температуре \( T_0 \) (часто 10 кОм).
- B — B-значение термистора.
B-значение — это константа, которую обычно указывает производитель. Оно зависит от материала и конструкции термистора и описывает, как меняется его сопротивление с температурой на заданном диапазоне. Вы также можете вычислить B-значение сами, измерив сопротивление термистора при двух известных температурах.
Пример расчёта:
Дано:
- Опорная температура \( T_0 = 298.15K \) (то есть 25°C + 273,15 для перевода в кельвины)
- Опорное сопротивление \( R_0 = 10k\Omega \)
- B-значение B = 3950 (типично для многих термисторов)
- Измеренное сопротивление при температуре T: 10475 Ом
Шаг 1: применяем B-уравнение
Подставляем заданные значения:
\[ \frac{1}{T} = \frac{1}{298.15} + \frac{1}{3950} \ln \left( \frac{10,475}{10,000} \right) \]
\[ \frac{1}{T} = 0.003354016 + \frac{1}{3950} \ln(1.0475) \]
\[ \frac{1}{T} = 0.003354016 + (0.000011748) \]
\[ \frac{1}{T} = 0.003365764 \]
Шаг 2: вычисляем температуру (T)
\[ T = \frac{1}{0.003365764} = 297.10936358 (Kelvin) \]
Переведём в градусы Цельсия:
\[ T_{Celsius} = 297.10936358 - 273.15 \approx 23.95936358°C \]
Результат:
Температура, соответствующая сопротивлению 10475 Ом, примерно равна 23,96°C.
Функция на Rust
const fn kelvin_to_celsius(kelvin: f64) -> f64 {
kelvin - 273.15
}
const fn celsius_to_kelvin(celsius: f64) -> f64 {
celsius + 273.15
}
const REF_RES: f64 = 10_000.0; // Опорное сопротивление в омах (10 кОм)
const REF_TEMP: f64 = 25.0; // Опорная температура 25°C
const REF_TEMP_K: f64 = celsius_to_kelvin(REF_TEMP); // T0
fn calculate_temperature(current_res: f64, b_val: f64) -> f64 {
let ln_value = (current_res/REF_RES).ln();
// let ln_value = libm::log(current_res / ref_res); // используйте этот крейт для no_std
let inv_t = (1.0 / REF_TEMP_K) + ((1.0 / b_val) * ln_value);
1.0 / inv_t
}
const B_VALUE: f64 = 3950.0;
const V_IN: f64 = 3.3; // Входное напряжение
fn main() {
let r = 9546.0; // Измеренное сопротивление в омах
let temperature_kelvin = calculate_temperature(r, B_VALUE);
let temperature_celsius = kelvin_to_celsius(temperature_kelvin);
println!("Temperature: {:.2} °C", temperature_celsius);
}