Разобрался с пересчётом сопротивления термистора в Цельсии без использования длинной таблицы.
Метод не очень точный (бо аппроксимация по формуле с одним коэффициентом), зато будет работать с любым NTC-термистором, включая "беспородные" -- нужно лишь измерить сопротивление пациента при двух температурах, например, при 0 и при 100 Ц, хотя традиционно используют пару 25Ц/100Ц.
Код для Ардуины (вход -- усреднённые показания АЦП, выход -- тем-ра в Ц):
#include
#include
float adc2celsius( float adc) {
// Коэффициент B25/100 NTC-термистора:
// B = ln(R25/R100) / (1/T25 - 1/T100),
// где Rxx -- сопр. термистора при 25 и 100 Ц,
// Txx -- тем-ры 25 и 100 Ц в Кельвинах.
// Тогда температура в Кельвинах:
// T = 1 / (ln(Rx/R25)/B + 1/T25),
// где Rx -- текущее сопр. термистора.
const float B = 4106.55; // для моих термисторов
const float T25inv = 0.003354; // 1/T25[K]
const float ADCscale = 1023; // шкала АЦП
const float K0 = -273.15; // абсол. нуль в Ц
if( adc <= 0.0) // обрыв термистора
return K0;
else if( adc >= ADCscale) // КЗ термистора
return FLT_MAX;
float rrel = ADCscale / adc - 1.0; // Rx/Rref
return 1.0 / (log(rrel)/B + T25inv) + K0;
}
Rref - сопротивление постоянного (нижнего) резистора в делителе, Rref = R25. Термистор образует верхнее плечо делителя напряжения, "натянутого" между "плюсом" питания (точнее: "опорой" АЦП, но в Ардуине это одно и то же) и общим проводом (точнее: "нулём" АЦП, но опять же...). АЦП измеряет напряжение на нижнем резисторе.
+5V
|
[ ] Rx
|
+--> к АЦП
|
[ ] Rref
|
GND
Для уменьшения влияния саморазогрева термистора протекающим током следует выбирать его сопротивление побольше, хотя бы с десяток килоом. У меня Rref = R25 = 47 кОм.
[
original post ] [
comments ]