W elektronice dość szeroko wykorzystuje się rezystancyjne czujniki temperatury zwane termistorami. W praktyce rozróżnia się dwie podstawowe grupy termistorów: NTC i PTC, które mają odmienne własności fizyczne i zastosowania.
Definicja
Rezystancja maleje wraz ze wzrostem temperatury.
Charakterystyka R(T)
\[ R(T) = R_0 \cdot \exp\!\left[B\left(\frac{1}{T}-\frac{1}{T_0}\right)\right] \]
gdzie:
Typowe zakresy
Cechy praktyczne
Zastosowania
Definicja
Rezystancja rośnie wraz ze wzrostem temperatury.
Charakterystyka R(T)
Cechy praktyczne
Zastosowania
Dla termistora NTC w szerokim zakresie temperatur obowiązuje zależność:
\[ R(T) = R_0 \cdot \exp\!\left[B\left(\frac{1}{T}-\frac{1}{T_0}\right)\right] \]
gdzie:
Ta postać nie jest liniowa i wprost nie nadaje się do klasycznej regresji liniowej.
Logarytm naturalny po obu stronach równania:
\[ \ln R = \ln R_0 + B\left(\frac{1}{T}-\frac{1}{T_0}\right) \]
Po przekształceniu:
\[ \ln R = B \cdot \frac{1}{T} + \left(\ln R_0 - \frac{B}{T_0}\right) \]
I oto sedno:
\[ \boxed{ \ln R = a \cdot \frac{1}{T} + b } \]
czyli równanie prostej.
Elektronik:
\[ T_i[K] = T_i[°C] + 273.15 \]
\[ x_i = \frac{1}{T_i} \]
\[ y_i = \ln R_i \]
Wykorzystując model regresji liniowej wyznacza jego parametry gdzie:
Z regresji:
\[ y=\beta_1 x + \beta_0 \]
otrzymujemy:
Czyli z kilku pomiarów rezystancji:
Elektronik odnajduje w swoich zasobach trzy termistory. Niestety nie zna ich parametrów. Postanawia więc eksperymentalnie określić parametry tych elementów. Przygotowuje więc pojemnik z lodem, dokładny termometr oraz typowy multimetr do pomiaru rezystancji. Czujnik termometru wraz z termistorami zanurza w pojemniku z lodem (i oczywiście nieco wody). Następnie powoli podnosi temperaturę pojemnika co jakiś czas rejestrując temperaturę oraz wskazania multimetru przełączając go pomiędzy trzy badane termistory.
W wyniku przeprowadzonego eksperymentu uzyskał następujące dane
df
## # A tibble: 16 × 4
## T_C NTC_A NTC_B NTC_C
## <dbl> <dbl> <dbl> <dbl>
## 1 0.05 34260 364000 13960
## 2 5.24 26220 275900 10920
## 3 10.4 19850 213900 8561
## 4 14.4 16350 172500 7450
## 5 19.5 13020 134700 5912
## 6 24.8 10070 99700 4690
## 7 29.6 8294 81470 3911
## 8 34.7 6661 64880 3250
## 9 40.0 5317 50950 2725
## 10 44.8 4418 41970 2312
## 11 49.9 3665 34660 1911
## 12 55.3 3004 27090 1605
## 13 59.3 2591 23450 1435
## 14 65.6 2022 18580 1174
## 15 69.9 1759 15620 1045
## 16 75.3 1511 12730 894.
Po zebraniu danych eksperymentator przekształca odpowiednio swoje dane a następnie używając modelu regresji liniowej wyznacza odpowiednie parametry termistorów.
df_calc = df %>%
pivot_longer(NTC_A:NTC_C, names_to = "id", values_to = "R") %>%
mutate(
invT = 1 / (T_C + 273.15),
lnR = log(R),
# Niepewność pomiaru (przykład): ±(0.5% wskazania + 2 cyfry LSD przy 4 cyfrach znaczących)
R_err = 0.005 * R + 2 * lsd_4sig(R),
# Niepewność pomiaru temperatury (przykład): ±0.25°C (termometr) + ±0.005°C (gradient/czas przełączenia)
T_err = 0.25 + 0.005,
# Zakresy dla słupków błędów (propagacja przez transformacje)
invT_min = 1 / (T_C - T_err + 273.15),
invT_max = 1 / (T_C + T_err + 273.15),
R_min = pmax(R - R_err, .Machine$double.eps),
R_max = R + R_err,
lnR_min = log(R_min),
lnR_max = log(R_max)
) %>%
group_by(id)
df_calc %>% ggplot(aes(T_C, R, colour = id))+
geom_line()+
geom_point(size=0.5)+
geom_crossbar(aes(ymin = R - R_err, ymax = R + R_err), width = 0) +
geom_segment(aes(x = T_C - T_err, xend = T_C + T_err, y = R, yend = R)) +
facet_wrap(vars(id), ncol = 3, scales = "free_y") +
labs(x = "T [°C]", y = "R [Ω]")
Te wykresy o wiele lepiej przedstawić po zastosowanych przekształceniach.
df_calc %>%
ggplot(aes(invT, lnR, colour = id)) +
geom_smooth(method = "lm", formula = y ~ x, linewidth = 0.2) +
geom_point(size = 0.6) +
geom_crossbar(aes(ymin = lnR_min, ymax = lnR_max), width = 0) +
geom_segment(aes(x = invT_min, xend = invT_max, y = lnR, yend = lnR)) +
stat_poly_eq(
formula = y ~ x,
aes(label = paste(after_stat(eq.label), after_stat(rr.label), sep = "~~~")),
parse = TRUE,
size = 3
) +
labs(x = "1/T [K^-1]", y = "ln(R)")
Jak widać uzyskane dane są idealnie liniowe.
Na koniec używając funkcji lm wyznaczamy parametry
termistorów.
fitt = df_calc %>%
do({
m <- lm(lnR ~ invT, data = .)
tibble::tibble(
model = list(m),
B_1 = coef(m)[["invT"]],
B_0 = coef(m)[["(Intercept)"]],
sigma = summary(m)$sigma,
r2 = summary(m)$r.squared
)
}) %>%
ungroup() %>%
mutate(
T0_K = 298.15,
B_hat = B_1,
lnR25_hat = B_0 + B_hat * (1 / T0_K),
R25_hat = exp(lnR25_hat)
)
fitt %>% select(-model)
## # A tibble: 3 × 9
## id B_1 B_0 sigma r2 T0_K B_hat lnR25_hat R25_hat
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 NTC_A 3958. -4.06 0.0108 1.000 298. 3958. 9.22 10110.
## 2 NTC_B 4241. -2.70 0.0146 1.000 298. 4241. 11.5 101204.
## 3 NTC_C 3475. -3.19 0.0120 1.000 298. 3475. 8.47 4747.
Z osiągniętych wyników można się domyślić, że poszczególne termistory to handlowe wersje:
Jednak dzięki precyzyjnemu określeniu parametrów można ich użyć zamiast parametrów producenta.