Оптимизация измерений NTC-термистора · Into unknown

Оптимизация измерений NTC-термистора


March 9, 2024

При изначальном проектировании платы uni_v2 я уделил мало внимания работе с термистором. При программировании, и создании бизнес-логики быстро оказалось, что измерение температуры – это самое популярное применение аналоговым измерениям! Первые опыты также показали, что подход “и так сойдёт” не даёт даже приблизительно точных измерений. Это надо было решать!

В статье немного математических формул о том, как пригодился матан с дифференциальными формулами, которые:

“Никогда нам в жизни не пригодятся!” (c) любой школьник

Я опущу большинство графиков и объяснений – только готовые формулы и результаты для решения моей конкретной задачи.

Постановка задачки

У термистора сопротивление обратно пропорционально температуре. Нам надо подобрать такое пробное сопротивление, чтобы размах напряжений при $T \in [T_{min} .. T_{max}]$ был максимальным для наилучшей точности измерения.

I’m afraid, we will have to use MATH

Профессор Фраунсфорт делает страшный вывод -- о необходимости прибегнуть к МАТЕМАТИКЕ

Взаимосвязь температуры и сопротивления

При $T_0 = 25{}^0C$ у элемента получаем номинальное сопротивление в $R_0 = 10k\Omega$.

! Температура в формулах должна быть в Кельвинах – надо добавлять $273.15K$.

Сопротивление термистора от температуры:

\[R(T) = r_\inf \cdot e^{B / T}\]

, где:

Отсюда, зависимость температуры от сопротивления:

\[T = \frac{B}{ln(R / r_\inf)}\]

Размах делителя напряжения

Банальная схема делителя напряжения: На вход термистора $V_{IN} = 5V$, $Vadc$ должен быть не более $3.3V$.

\[R_{min} = R_t(100{}^0C) = 0.985k\Omega\] \[R_{min} = R_t(-10{}^0C) = 46.2k\Omega\]

\(Vadc_{max} = V_{IN} \frac{R}{R + R_{min}}\) \(Vadc_{min} = V_{IN} \frac{R}{R + R_{max}}\)

\[\Delta V = V_{IN}R \left( \frac{1}{R + R_{min}} - \frac{1}{R + R_{max}} \right) = \frac{V_{IN} R (R_{max} - R_{min})}{(R + R_{min})\cdot(R + R_{max})}\] \[f = V_{IN}R(R_{max} - R_{min}); g = \frac{1}{R + R_{min}}; j = \frac{1}{R + R_{max}}\] \[\frac {d\Delta V}{dR} = (fgj)' = f'gj + fg'j + fgj' = 0\] \[f' = V_{IN} (R_{max} - R_{min}); g' = -\frac{1}{(R + R_{min})^2}; j' = -\frac{1}{(R + R_{max})^2}\] \[\frac {d\Delta V}{dR} = \frac{\cancel{V_{IN}} \cdot \cancel{(R_{max} - R_{min})}}{(R + R_{min})(R + R_{max})} - \frac{\cancel{V_{IN}} \cdot R \cancel{(R_{max} - R_{min})}}{(R + R_{min})^2(R + R_{max})} - \frac{\cancel{V_{IN}} \cdot R \cancel{(R_{max} - R_{min})}}{(R + R_{min})(R + R_{max})^2}\]

\((R + R_{min})(R + R_{max}) - R(R + R_{max}) - R(R + R_{min}) = 0 \rightarrow -R^2 + R_{min}R_{max} = 0\) \(R^2 = R_{min}R_{max} \rightarrow \mathbf{R_{optimal} = \sqrt{R_{min}R_{max}}}\)

Таким образом, для оптимального измерения температур в диапазоне $ T \in [-10^0C .. +100^0C] $ нам нужен делитель, общим сопротивлением $6.745k\Omega$.

Используя ряд номиналов E24, находим самую близкую комбинацию, которая даёт нам деление $\frac{3.3}{5.0} = 0.(6)$ с заданным суммарным сопротивлением – это $4.8k\Omega$ + $2.4k\Omega$.

Пользуясь формулами, мы теперь можем построить графики для оценки зависимости точности измерения температуры от текущей температуры.

Величина изменения напряжения на каждые 10 градусов изменения температуры (больше -- лучше)

Нас интересует получениие наибольшей точности в районе $20..25^0C$ – для этого я и выбрал диапазон измерения температур $[-10..+100]^0C$. С учётом выбранного выше делителя $4.8k\Omega$ + $2.4k\Omega$ я могу измерять любые температуры, которые может выдержать датчик. Я лишь потеряю в точности.

Что можно было сделать лучше?

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

Ответ

Для NTC-термистора с параметром $B = 3435K$ и наибольшей точностью в диапазоне температур $T \in [20..25]^0C$ мы должны выбрать делитель $4.8k\Omega$ + $2.4k\Omega$.

Конвертация измерений микроконтроллера

Микроконтроллер возвращает целое число $ADC$ в диапазоне $ADC \in [0..4095]$. В напряжение переводим по формуле:

\[u(ADC) = V_{dda} \cdot \frac{ADC}{4095}\]

, где:

Измеренное напряжение – это напряжение выхода Операционного Усилителя (ОУ). Оно с обратной связью и делителем.

Может, позже добавлю электрическую схему для полного понимания.

Делитель “верхний”, который на обратной связи ОУ – его соотношение равно $b$. А соотношение делителя входного, “нижнего”, который мы вычисляли на протяжении всей этой статьи, – это $a$.

Отсюда, напряжение на входе в “нижний” делитель: $V = u(ADC) \frac{1-b}{a}$.

Немного пожонглировав, получаем формулу для нахождения температуры из измеренного напряжения:

\[T = B / ln \left\{ \frac{R}{r_\inf} \left( \frac{V_{IN} \cdot a}{u(1-b)+V_{vdda}b} - 1 \right) \right\}\]