Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Уравнение Стейнхарта — Харта

Tip

В нашем упражнении мы не будем использовать это уравнение, потому что найти константы A, B и C сложнее. B-уравнения достаточно для наших целей, так что, если хотите, можете пропустить эту главу.

Уравнение Стейнхарта — Харта даёт более точную зависимость между температурой и сопротивлением в широком диапазоне температур. \[ \frac{1}{T} = A + B \ln R + C (\ln R)^3 \]

Где:

  • T — температура в кельвинах. (Формула для перевода градусов Цельсия в кельвины: K = °C + 273.15)
  • R — сопротивление при температуре T в омах.
  • A, B и C — константы, специфичные для материала термистора; их часто указывает производитель. Для лучшей точности, возможно, придётся откалибровать эти значения и определить их самостоятельно. Некоторые даташиты приводят значения сопротивления при разных температурах, по ним тоже можно это рассчитать.

Калибровка

Чтобы определить точные значения A, B и C, поместите термистор в три температурных условия: комнатная температура, ледяная вода и горячая вода. В каждом случае измерьте сопротивление термистора по значению АЦП и с помощью надёжного термометра запишите фактическую температуру. По значениям сопротивления и соответствующим температурам вычислите коэффициенты:

  • A соответствует температуре ледяной воды,
  • B соответствует комнатной температуре, и
  • C соответствует температуре горячей воды.

Расчёт коэффициентов Стейнхарта — Харта

По трём точкам «сопротивление — температура» можно найти A, B и C.

$$ \begin{bmatrix} 1 & \ln R_1 & \ln^3 R_1 \\ 1 & \ln R_2 & \ln^3 R_2 \\ 1 & \ln R_3 & \ln^3 R_3 \end{bmatrix}\begin{bmatrix} A \\ B \\ C \end{bmatrix} = \begin{bmatrix} \frac{1}{T_1} \\ \frac{1}{T_2} \\ \frac{1}{T_3} \end{bmatrix} $$

Где:

  • \( R_1, R_2, R_3 \) — значения сопротивления при температурах \( T_1, T_2, T_3 \).

Посчитаем коэффициенты

Вычислим натуральные логарифмы сопротивлений: $$ L_1 = \ln R_1, \quad L_2 = \ln R_2, \quad L_3 = \ln R_3 $$

Промежуточные вычисления: $$ Y_1 = \frac{1}{T_1}, \quad Y_2 = \frac{1}{T_2}, \quad Y_3 = \frac{1}{T_3} $$

$$ \gamma_2 = \frac{Y_2 - Y_1}{L_2 - L_1}, \quad \gamma_3 = \frac{Y_3 - Y_1}{L_3 - L_1} $$

Итак, окончательно: $$ C = \left( \frac{ \gamma_3 - \gamma_2 }{ L_3 - L_2} \right) \left(L_1 + L_2 + L_3\right)^{-1} \ $$ $$ B = \gamma_2 - C \left(L_1^2 + L_1 L_2 + L_2^2\right) \ $$ $$ A = Y_1 - \left(B + L_1^2 C\right) L_1 $$

Хорошая новость! Не нужно вычислять коэффициенты вручную. Просто введите значения сопротивления и температуры для холодной, комнатной и горячей среды, а затем с помощью формы ниже определите A, B и C

Значение АЦП и расчёт сопротивления

Примечание: если у вас уже есть температура и соответствующее сопротивление, можно сразу ввести эти значения во вторую таблицу.

Если у вас есть значение АЦП и вы хотите вычислить сопротивление, используйте эту таблицу, чтобы найти соответствующее сопротивление при разных температурах. Когда вы вводите значение АЦП для каждой температуры, рассчитанное сопротивление автоматически обновится во второй таблице.

Для расчёта понадобится базовое сопротивление термистора: оно нужно, чтобы по значению АЦП определить сопротивление при заданной температуре.

Обратите внимание: разрядность АЦП может потребовать корректировки, если вы используете другой микроконтроллер. В нашем случае для ESP32 разрешение АЦП составляет 12 бит.




Среда Значение АЦП
Холодная вода
Комнатная температура
Горячая вода

Поиск коэффициентов

Задайте температуру, введя значение в градусах Фаренгейта или Цельсия: форма автоматически пересчитает его в другой формат. Укажите сопротивление для каждой температуры и нажмите кнопку «Вычислить коэффициенты».

Среда Сопротивление (Ом) Температура (°F) Температура (°C) Температура (K)
Холодная вода
Комнатная температура
Горячая вода

Результаты

A:

B:

C:

Расчёт температуры по сопротивлению

Теперь с помощью этих коэффициентов можно вычислить температуру для любого сопротивления:

Функция на Rust

fn steinhart_temp_calc(
    resistance: f64, // Сопротивление в омах
    a: f64,          // Коэффициент A
    b: f64,          // Коэффициент B
    c: f64,          // Коэффициент C
) -> Result<(f64, f64), String> {
    if resistance <= 0.0 {
        return Err("Resistance must be a positive number.".to_string());
    }

    // Вычисляем температуру в кельвинах по уравнению Стейнхарта — Харта:
    // 1/T = A + B*ln(R) + C*(ln(R))^3
    let ln_r = resistance.ln();
    let inverse_temperature = a + b * ln_r + c * ln_r.powi(3);

    if inverse_temperature == 0.0 {
        return Err("Invalid coefficients or resistance leading to division by zero.".to_string());
    }

    let temperature_kelvin = 1.0 / inverse_temperature;

    let temperature_celsius = temperature_kelvin - 273.15;
    let temperature_fahrenheit = (temperature_celsius * 9.0 / 5.0) + 32.0;

    Ok((temperature_celsius, temperature_fahrenheit))
}

fn main() {
    // Пример входных данных
     let a = 2.10850817e-3;
    let b = 7.97920473e-5;
    let c = 6.53507631e-7;
    let resistance = 10000.0;


    match steinhart_temp_calc(resistance, a, b, c) {
        Ok((celsius, fahrenheit)) => {
            println!("Temperature in Celsius: {:.2}", celsius);
            println!("Temperature in Fahrenheit: {:.2}", fahrenheit);
        }
        Err(e) => println!("Error: {}", e),
    }
}

Ссылки