Уравнение Стейнхарта — Харта
Уравнение Стейнхарта — Харта — более точный метод перевода сопротивления термистора в температуру по сравнению с простым уравнением B. Оно использует три коэффициента, чтобы моделировать нелинейное поведение термистора в более широком диапазоне температур с большей точностью.
Tip
В нашей программе мы не будем использовать эту формулу. Для простоты будем использовать уравнение B.
Формула Стейнхарта — Харта
\[ \frac{1}{T} = A + B \ln R + C (\ln R)^3 \]
В этом уравнении T — искомая температура в кельвинах. R — измеренное сопротивление в омах. A, B и C — коэффициенты Стейнхарта — Харта, которые индивидуальны для каждого термистора. ln — натуральный логарифм.
Калибровка
Чтобы определить точные значения 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.
Расчёт значения АЦП и сопротивления
Примечание: если у вас уже есть температура и соответствующее сопротивление, можно сразу ввести эти значения во вторую таблицу.
Если у вас есть значение АЦП и вы хотите вычислить сопротивление, используйте эту таблицу, чтобы найти соответствующее сопротивление при разных температурах. Когда вы вводите значение АЦП для каждой температуры, рассчитанное сопротивление автоматически обновляется во второй таблице.
Для этого расчёта понадобится базовое сопротивление термистора, которое необходимо для определения сопротивления при заданной температуре по значению АЦП.
Учтите, что количество бит АЦП может потребоваться изменить, если вы используете другой микроконтроллер. В нашем случае, для Raspberry Pi Pico, разрешение АЦП составляет 12 бит.
Поиск коэффициентов
Измените температуру, введя значение в градусах Фаренгейта или Цельсия: форма автоматически переведёт его в другой формат. Укажите сопротивление для каждой температуры, а затем нажмите кнопку «Рассчитать коэффициенты».
Расчёт температуры по сопротивлению
Теперь с этими коэффициентами можно вычислить температуру для любого сопротивления:
Функция на 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),
}
}
Ссылки
- Калькулятор термисторов (на английском языке)
- Коэффициенты Стейнхарта — Харта для расчёта температуры двигателя (на английском языке)
- Калибровка коэффициентов Стейнхарта — Харта для термисторов (на английском языке)
- Кулинарный термометр с коррекцией Стейнхарта — Харта (на английском языке)