Стояла как-то задача оснастить одну систему кучей термодатчиков. Причём оснастить максимально недорого.
Результаты изысканий (которые, по-моему, получились довольно изящными) предлагаю к рассмотрению в этой статье.
В данной статье разбираются контактные способы измерения температур в системах с микроконтроллером.
Давайте сперва перечислим некоторые особенности/требования измерений температуры:
Инерционность
В большинстве случаев температурные процессы сильно инерционны.
Следствие из этого в том, что скорость произведения повторных измерений, как правило, не сильно важна.
Каким бы устройством мы ни управляли, будь то система управления холодильником или система, детектирующая перегрев какого-то элемента, скорость измерения температуры вряд ли будет критична. Измеряем температуру за 0.0001 секунды, или за 0.1 секунду, или даже (для многих случаев подойдёт) за 10 секунд — не так уж и важно.
Потребителя скорее будет интересовать точность измерения температуры, нежели скорость.
Помехоустойчивость
Зачастую проводники до термодатчика имеют довольно большую длину. Работающие рядом устройства создают набор помех/наводок. Требуется максимально нивелировать влияние помех
на точность измерений.
Если учитывать предыдущую особенность (инерционность), то тут проблем обычно больших нет: в цепи измерения включают сильное интеграционное звено (например, конденсатор), которое нивелирует влияние помех.
Итого
Задачу нам надо решить:
- с минимальной стоимостью (требование)
- с мягкими требованиями к скорости измерений
- с максимальной помехоустойчивостью
Последние два пункта частично снимают (а не накладывают) ограничения на выбранные способы решения.
Например, не требуется скоростной АЦП.
Традиционные способы измерения
В рамках данной статьи рассмотрим способы измерения, где в качестве датчика используется термосопротивление.
Датчик нагревается, его сопротивление увеличивается (или уменьшается).
Как можно измерить сопротивление термодатчика с помощью микроконтроллера?
Подключить его к прецизионному источнику тока и измерить полученное напряжение при помощи АЦП:
Вычислить сопротивление терморезистора можно по формуле:
Либо подключить его к прецизионному источнику напряжения с использованием дополнительного эталонного резистора и так же измерить полученное напряжение при помощи АЦП:
Вычислить сопротивление терморезистора можно по формуле:
Второй способ — наверное, самое дешёвое решение при наличии АЦП.
Да, формула получилась нелинейной. Учитывая то, что скорость измерений нас не сильно
волнует, скорость вычисления формул — тоже.
Какие тут недостатки?
- Из-за нелинейности во втором случае и начального сопротивления в обоих, диапазон измерения АЦП будет неполным. Измеряемый диапазон напряжений будет меньше диапазона АЦП. Вероятнее всего, в разы. То есть, 10 разрядный АЦП даст точность в 9 или 8 разрядов, а вычисления ещё больше её уменьшат.
- Требуется "дорогой" АЦП, который в случае множества термодатчиков надо переключать
между ними. То есть, ещё и дорогой аналоговый мультиплексор. - Требуется прецизионный источник тока или напряжения.
Вопросы нелинейности и неполноты диапазона можно порешать, добавив в игру операционный усилитель и резисторный мост. Рассмотрение такой системы выходит за рамки данной статьи.
Часто этот операционный усилитель, резисторный мост, источник тока и сам термодатчик объединяют в одно целое и получается очень удобный в использовании датчик, но… дорогой. Если бы нам это решение подходило, то и незачем бы было писать эту статью.
Рефлексируем
Предположим, что у нас нет в наличии прецизионного источника тока/напряжения. Можем ли мы как-то измерить сопротивление термодатчика с приемлемой точностью?
Можем. Например, сравнивая сопротивление датчика с сопротивлением, заранее известным.
Берём один источник тока и переключаем между двумя сопротивлениями, эталонным и измеряемым:
Переключатель на схеме нарисован механическим для упрощения. Схема приведена для иллюстрации принципа действия.
Итоговое сопротивление можно вычислить примерно так:
От одной прецизионности избавились, несколько нагрузив CPU математическими вычислениями.
Тут пока мы имеем удорожание (вместо одного АЦП требуется пара), но зато у нас получился новый метод измерения, основанный на сравнении с эталоном.
Сравнение с эталоном позволяет нам отказаться от прецизионности источника тока (напряжения), заменив её прецизионностью эталонного сопротивления.
Откажемся от АЦП
Если у нас нет АЦП, какие варианты измерения сопротивления можно придумать?
Мы можем, например:
- Собрать RC-генератор с использованием нашего термосопротивления и измерить частоту выдаваемых им колебаний.
- Зарядить эталонный конденсатор C через наше термосопротивление и измерить время заряда.
Пока оставим за кадром реализацию обоих способов, сразу попытаемся указать на недостатки:
Недостаток: Для точного измерения требуется точное знание ёмкости конденсатора,
который будет использован в этой системе.
Как можно избавиться от точного знания ёмкости конденсатора? Так же, как в предыдущем случае мы избавлялись от необходимости иметь прецизионный источник опорного тока (напряжения): вместо одного измерения будем делать два и сравнивать с эталонным резистором.
Осталось выбрать, каким путём идти: первым или вторым?
Очевидно, что вторая дорога в микроконтроллерном применении более проста в реализации:
- В среднем современном микроконтроллере есть входы с уровнями (триггером) Шмитта (но даже если и нет, то система будет работать и без них).
- В среднем современном микроконтроллере есть система, с помощью которой можно измерить интервал времени между событиями (таймер).
Итого, у меня получилась примерно такая схема измерительной части (Вход Шмитта и выходы логических элементов с 3 состояниями — это входы/выходы микроконтроллера):
Алгоритм измерения
- Начальное состояние: конденсатор разряжен, все выходы (PORT1-PORTx, PORTe) с Z состоянием выдают логический ноль.
- Переводим все выходы в состояние Z.
- Переводим выход PORTe в состояние логической единицы, начав одновременно с этим отсчёт времени (заряжаем конденсатор через эталонный резистор).
- Когда конденсатор зарядится до порогового уровня, сработает прерывание.
В обработчике прерывания запомним, сколько тактов таймера занял заряд конденсатора через эталонный резистор — числоNe
. - Разрядим конденсатор снова, включив все выходы в состояние логического нуля.
- Далее зарядим конденсатор через первый термодатчик — получим измерение
Nt1
. - Вычислим сопротивление терморезистора исходя из формулы:
Повторим предыдущие (5, 6 и 7) пункты для всех остальных термодатчиков.
Итого
Для измерений N температур нам требуется:
- N + 1 выходов с тремя состояниями (полно в любом микроконтроллере).
- Один вход прерывания с уровнями Шмитта (требование уровней Шмитта нестрогое, но они есть сейчас в среднем CPU, почему бы не использовать).
- Один эталонный резистор.
- Конденсатор.
Критерий выбора ёмкости конденсатора.
В общем и целом — чем больше, тем лучше (тем большую точность измерений можно получить).
Конденсатор тут является и средством сглаживания помех (интегрирующее звено), и участником измерений.
Я использовал танталовый конденсатор 100мкф. Но в целом можно строить измерения на любых конденсаторах в диапазоне 0.1 мкФ — 1000 мкФ. С маленьким конденсатором при том же сопротивлении скорость измерения будет выше, но и тактовая частота таймера нужна выше (чтобы получить достаточную точность измерений).
При конденсаторе 100мкФ, при измеряемых сопротивлениях 3-30кОм у меня получились 12-24 разрядные числа отсчётов измерений (использовался 8-битный аппаратный таймер контроллера AVR и ещё 16-битный счётчик переполнений).
Суммарно при таких параметрах получается выполнять 2-5 измерений в секунду. На опрос 16 термодатчиков требуется несколько секунд.
Примечания
- Можно проводить измерения и на заряде, и на разряде конденсатора. Это увеличит скорость измерений вдвое. Но надо и эталон обмерять в обоих направлениях.
- Если системе требуется много термодатчиков, то разряжать конденсатор можно через все датчики сразу. Это ускорит подготовку нового измерения (я использовал этот вариант).
- Если в систему внести этап "подстройки", то эталонный резистор может быть не прецизионным: берём любой резистор (главное, чтобы у него не было температурной зависимости), затем вводим программную коррекцию погрешности.
- Вычисления лучше всего проводить не в обработчике прерываний, а в фоне. То есть в результате работы системы измерений получаем пары чисел Ne-Nt. Фоновая программа, уже делая умножение/деление, приводит их к омам сопротивления или прямо к градусам.
- В предложенную схему довольно просто добавить гальваническую развязку и значительно повысить помехоустойчивость и безопасность.
Итог
Предложенный метод похоже имеет минимальную из возможных аппаратную стоимость измерения температуры, высокую помехоустойчивость. Однако плата за это — необходимость выполнения некоторого количества математических действий микроконтроллером.
u_235
Похоже на работу интегрирующего АЦП. Какой точности удалось достичь?
rsync Автор
12 разрядов получается легко.
Однако для 12 разрядного измерения нужен терморезистор, который удовлетворит такой точности, а… таких немного.
tea1975
даже платиновые термосопротивления? А вообще, нынче купить (найти) прецизионные сопротивления и ёмкости куда сложнее и дороже чем МАХ31865. ИМХО
iig
А где сравнение с образцовым точным датчиком?
rsync Автор
Дык вот же:
или Вы имели ввиду с образцовым точным датчиком температуры?
мы верифицировали измерения с внешним устройством, 14-разрядным АЦП.
строили две кривые и смотрели отклонения их друг от друга.
получалось на одинаковом датчике мой вариант давал 12-битную точность.
crustal
Можете попытаться собрать свое изделие и погонять его, сравнивая с прошедшим поверку ртутным термометром. Сможете его переплюнуть в точности, потратив копейки, тогда может быть ваша статья и будет иметь какой-то смысл.
rsync Автор
надо разделять:
вот второе — легко получается 12 разрядов
а первое — уже выливается в стоимость стоимость и стоимость
а второе мы верифицировали так:
PS: безусловно есть какие-то кейзы где это решение не подойдёт. есть и кейзы где требуется скоростное измерение температуры.
koreec
Не кормите тролля.
ZEvS_Poisk
Ну, может действительно, автор не разрабатывал, но и что? Может у автора такой цели и нет.
rsync Автор
ыы только сейчас заметил эту фразу :)
мне нужно было температуру точно и недорого измерить, а не в сертификацию и в гос реестр попасть.
:)
legustarasov
Зря заминусовали парня. Может грубовато сказано, но по делу. Измерить температуру с точностью в 0.1% (10 бит) это почти волшебство. А уж о стабильности и повторяемости вообще речи не идет. Здесь же надо обеспечить точность (в 0.012% для 12 разрядов, к слову) и стабильность всех компонентов: эталонного резистора (он не должен в процессе работы устройства менять свое сопротивление на эти 0.012%, параметров емкости (в том числе и паразитных, а не только номинальной емкости), выходных каскадов портов микроконтроллера (а они, на самом деле, сделаны достаточно грубо, потому что заточены на дискретность) и так далее. Одно только Hi-Z состояние может быть представлено в виде утечки тока как в контроллер, так и из него. Т.е. точность будет зависеть от количества датчиков, и от того какой конкретно канал сейчас измеряется.
И это мы не говорим о самом чувствительном элементе, и каким образом он расположен на объекте, что в случае измерения температуры — очень важно.
И гос реестр — это не формальная бумажка, а набор тестов, которые доказывают, что прибор и правда стабильно работает, а не заработал один раз в лаборатории и результаты похожи на правду.
Сам подход, представленный в статье интересный и открывает большое поле для творчества в DIY. Так что за статью плюсую, так как подобный метод можно применять не только в измерении температуры. И, если в вашем проекте точность вашего метода вас устраивает, то это круто. Но, заявлять о том, что у вас получился измерительный прибор, на котором «12 разрядов получается легко» я бы поостерегся.
P.S. Когда у нас были лекции по теплотехнике, лектор как-то сказал приблизительно следующее: «если вы будете читать научную статью и там будет написано, что в эксперименте измерили температуру с точностью выше, чем 1% — не верьте, там подгон».
rsync Автор
я же говорю: если разделять точность самого датчика с точностью его обмера то 12 бит получалось:
мы когда исследовали этот момент, брали два одинаковых датчика, один подключали к честному 14-битному АЦП, а второй — вот к этому.
оба датчика прикручены в 1мм друг от друга к радиатору с сопротивлением выделяющим 500Вт на него. Ну и смотрели отличия кривых.
12 бит получалось на сопротивлении датчика около 30кОм.
Потом меняли местами датчики и снова сверяли.
но в чисто нашем применении ("максимально дёшево") мы использовали даже не точный опорный резистор (с хорошими температурными свойствами, но не точный): вводили ещё этап тарирования.
То есть на стенде выгоняем датчик на температуру 100 градусов и микроконтроллер запоминает "это 100 градусов". И дальше в нашем диапазоне (80-120 точность сохраняется около 2^12).
насчёт утечек: это опять же различие на несколько порядков нивелирует проблему. Ток утечки 100нА порта у AVR заявлен (мы вообще на ПЛИС, но это делали).
ток через 30 кОм — получается 0.16 мА
то есть отношение 160 мкА / 0.1 мкА = 1600, то есть более чем 2^10.
надо посмотреть параметры ПЛИС что мы использовали (это после карантина смогу сказать: самой этой работе уже ~5 лет, вот на карантине сподобился статью написать)
а в остальном я с Вами согласен, мало того — сам скептически отношусь когда больше 2^8 точность заявляется. Мало того вот параметры AVR посмотрели — 2^11 — ошибка на сопротивлении
2^10 — ошибка на утечках
итого для AVR получится максимум 2^9.
для подавляющего большинства промышленных измерений температур — вполне нормально и 2^8 :)
как-то так.
VT100
Алаверды: можно ещё разделить точность и разрешаюшую способность.
Ivanii
Грамотная калибровка датчиков много дороже самих датчиков, 18В20 тем и хороши, что имеют известные периметры в том числе долговременные.
rsync Автор
я не против [рекламы] 18В20, я статью о методе писал